对于Java程序猿来说可以通过new java.lang.Thread.start()来启动一个线程,只需要将业务逻辑放在run()方法里即可, 如此高效且易用的Java线程在JVM层面是怎样的呢?本文将从源码角度深入解读。
Read More>>【JVM源码探秘】JVM线程模型概览
HotSpot中的线程模型是Java线程(java.lang.Thread)与本地操作系统线程一一映射,本地线程在Java线程启动(调用start())时创建, 并在终止时回收。操作系统负责调度本地线程给可用的CPU来执行。Java线程优先级和操作系统优先级之间的关系是相当复杂的,并且因操作系统而异。
Read More>>【JVM源码探秘】细说Class的装载、链接和初始化
接上篇《【JVM源码探秘】细说Class.forName()底层实现》执行Class.forName(“com.xxx.Xxx”)通过JavaCalls
组件调用了
Java方法ClassLoader.loadClass()
对该类进行加载
【JVM源码探秘】细说Class.forName()底层实现
JVM允许在运行时动态装载类,这为开发者提供了极大方便,使用Class.forName("com.xxx.Xxx")
,
装载完成后可以通过调用其newInstance()
完成对象的创建,然后便可以正常操作该类。
接下来我们就细说说Class.forName()在JVM层面所做的事情。
Read More>>【JVM源码探秘】深入registerNatives()底层实现
在Java的系统包下如:
- java.lang.System
- java.lang.Object
- java.lang.Class
等类中均有一个静态块用来执行一个叫做registerNatives()
的native方法,
private static native void registerNatives();
static {
registerNatives();
}
这个native方法里究竟都做了啥?我们进去瞧瞧。
Read More>>【JVM源码探秘】深入System.gc()底层实现
对于Java语言来说是不用手动释放内存的,并且不需要手动干预JVM的GC行为,但在一些监控和agent工具里却是必要的。
Hotspot为我们开放了Java语言级别的GC手动触发入口System.gc()
,本文将深入介绍JVM底层实现。
【JVM源码探秘】Java对象模型之对象头
一个Java对象在JVM中是由一个对应角色的oop
对象来描述的,比如instanceOopDesc
用来描述普通实例对象,arrayOopDesc
用来描述数组对象,而这些类型的oop对象均是继承自oopDesc
。
【JVM源码探秘】Java对象模型OOP-Klass
一个Java类在JVM中是如何描述的?创建一个Java对象在JVM中数据又是如何存储的?
在Hotspot VM中,设计者设计了OOP-Klass模型用来描述class的属性和行为,这里的OOP并不是面向对象编程(Object-oriented programming), 而是Ordinary Object Pointer(普通对象指针),之所以设计为OOP和Klass两部分是因为不希望每个对象都有一个C ++ vtbl指针, 因此,普通的oops没有任何虚拟功能。 相反,他们将所有“虚拟”函数转发到它们的klass,它具有vtbl并根据对象的实际类型执行C ++调度。
Read More>>【JVM源码探秘】HotSpot启动流程分析-初始化
接上篇,HotSpot在启动流程完成了参数的解析、JNI入口的定位、环境变量的设置等一系列操作,
最终在JavaMain()
中调用了InitializeJVM()
方法,用于完成虚拟机所需的内存申请、挂载和初始化,本文我们就一起一探究竟。
【JVM源码探秘】HotSpot启动流程分析-创建
在之前的文章中已经介绍了如何在Mac上编译及调试OpenJDK10源码,
那么,一个Java实例从开始运行至结束经历了什么?本文将从JVM源码角度一探究竟,深入剖析HotSpot其创建流程。
Read More>>