本文共 4933 字,大约阅读时间需要 16 分钟。
本文通过20多个问题,深入探讨JVM的核心机制,帮助理解JVM的运行原理和优化方法。
正确顺序如下:
注意事项:
示例分析:
public class ClassLoaderTest { public static void main(String[] args) { sons sons = new sons(); }}class parent { private static int a = 1; private static int b; static { b = 1; System.out.println("1.父类静态代码块:赋值b成功"); System.out.println("1.父类静态代码块:a的值" + a); } int initc() { System.out.println("3.父类成员变量赋值:----> c的值" + c); this.c = 12; return c; } parent() { System.out.println("4.父类构造方式开始执行----> a:1, b:1"); System.out.println("4.父类构造方式开始执行----> c:12"); }}class son extends parent { private static int sa = 1; private static int sb; static { sb = 1; System.out.println("2.子类静态代码块:赋值sb成功"); System.out.println("2.子类静态代码块:sa的值" + sa); } int initc2() { System.out.println("5.子类成员变量赋值---->:sc的值" + sc); this.sc = 12; return sc; } son() { System.out.println("6.子类构造方式开始执行----> sa:1, sb:1"); System.out.println("6.子类构造方式开始执行----> sc:12"); }} 执行结果:
System.exit() 方法;类加载机制分为三个阶段:
加载阶段:
.class 文件中的二进制数据加载到内存中,放入方法区。Class 对象,封装类在方法区的数据。连接阶段:
初始化阶段:
主动使用:
main 方法)被动使用:
三大内置类加载器:
根类加载器(Bootstrap ClassLoader):
java.lang.* 类。sun.boot.class.path 指定。扩展类加载器(Ext ClassLoader):
javahome/jre/lib/ext 目录下的 .jar 文件。系统类加载器(System ClassLoader):
classpath 加载类。-Djava.class.path 指定加载路径。用户自定义类加载器:
ClassLoader 类,实现 findClass 方法。defineClass 定义类。public class MyClassLoader extends ClassLoader { public MyClassLoader(String fileName) { super(fileName); } @Override protected Class findClass(String className) throws ClassNotFoundException { // 通过二进制流加载类文件 byte[] classData = getClassData(className); return defineClass(className, classData, 0, classData.length); }} 双亲委派流程:
优点:
public class MyClassLoader extends ClassLoader { @Override public Class loadClass(String className) throws ClassNotFoundException { System.out.println("自己加载:" + className); return super.loadClass(className); }} 命名空间由类加载器及其父类加载器构成。
Class 对象相同。运行时包由类加载器的命名空间和类全限定名称确定。
类加载器维护一个类列表,记录已加载的类。
卸载条件:
Java是解释语言。
.class 文件为字节码执行。内存区域包括:
直接内存(Direct Memory)
NIO 类提供,基于通道和缓冲区分配内存。堆结构:
新生代(Nepheap):
老年代(Tenured Generation):
永久代的问题:
System.gc() 调用(建议性触发)promotion failed 或 concurrent mode failure可达性分析:
常见垃圾回收算法:
标记-清除算法:
标记-整理算法:
复制算法:
分代收集算法:
引用类型:
强引用:
new 关键字创建,无法被 GC 回收。软引用:
SoftReference,内存不足时回收。弱引用:
WeakReference,内存不足时直接回收。虚引用:
WeakReference 并关联引用队列。常见垃圾收集器:
Serial垃圾收集器:
ParNew垃圾收集器:
Parallel Scavenge垃圾收集器:
Serial Old垃圾收集器:
Parallel Old垃圾收集器:
CMS垃圾收集器:
G1垃圾收集器:
常用调优参数:
-XX:NewGenSize:新生代大小。-XX:TenuredGenerationSize:老年代大小。-XX:MaxPermSize:永久代大小(已废弃)。-XX:MetaspaceSize:元数据区大小。OSGi(Open Service Gateway Initiative):
以上是JVM核心知识点的详细解答,涵盖了类实例化顺序、类加载机制、垃圾回收算法等多个方面。
转载地址:http://xguyz.baihongyu.com/