共计 683 个字符,预计需要花费 2 分钟才能阅读完成。
JVM 思维导图
常见相干问题
类加载过程
加载、验证、筹备、解析、初始化、应用、卸载
<clinit> 与 <init>
static 代码块只会执行一次,它对应的是 <clinit> 办法
初始化对象的属性 对应的是 <init>。每次新建对象的时候,都会执行
如何替换 JDK 的类
当 Java 的原生 API 不能满足需要时,比方咱们要批改 HashMap 类,就必须要应用到 Java 的 endorsed 技术。咱们须要将本人的 HashMap 类,打包成一个 jar 包,而后放到 -Djava.endorsed.dirs 指定的目录中。留神类名和包名,应该和 JDK 自带的是一样的。然而,java.lang 包上面的类除外,因为这些都是非凡爱护的。
Java 提供了 endorsed 技术,用于替换这些类。这个目录下的 jar 包,会比 rt.jar 中的文件,优先级更高,能够被最先加载到。
GC Roots 有哪些
- Java 线程中,以后所有正在被调用的办法的援用类型参数、局部变量、长期值等。也就是与咱们栈帧相干的各种援用。
- 所有以后被加载的 Java 类。
- Java 类的援用类型动态变量。
- 运行时常量池里的援用类型常量(String 或 Class 类型)。
- JVM 外部数据结构的一些援用,比方 sun.jvm.hotspot.memory.Universe 类。
- 用于同步的监控对象,比方调用了对象的 wait() 办法。
- JNI handles,包含 global handles 和 local handles。
总结如下:
- 流动线程相干的各种援用。
- 类的动态变量的援用。
- JNI 援用
CMS 垃圾回收器
初始标记 Stop The World
并发标记
从新标记 Stop The World
并发清理
正文完