文章目录
一文总结JVM
java类加载过程
类从被加载到JVM到卸载为止,整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段
类加载器分类
-
启动类加载器/Bootstrap ClassLoader
在HotSpot虚拟机中,Bootstrap ClassLoader用C++语言编写并嵌入JVM内部,主要负载加载JAVA_HOME/lib目录中的所有类,或者加载由选项-Xbootcalsspath指定的路径下的类; -
拓展类加载器/ExtClassLoader
负载加载JAVA_HOME/lib/ext目录中的所有类型,或者由参数-Xbootclasspath指定路径中的所有类型; -
应用程序类加载器/AppClassLoader
负责加载用户类路径ClassPath下的所有类型,一般情况下为程序的默认类加载器;
ExtClassLoader和AppClassLoader的父类都是ClassLoader
-
自定义加载器
Java虚拟机规范将所有继承抽象类java.lang.ClassLoader的类加载器,定义为自定义类加载器;
双亲委派
-
双亲委派模型
-
双亲委派过程
当一个类加载器收到类加载任务时,立即将任务委派给它的父类(并不是java含义中的父类
)加载器去执行,直至委派给最顶层的启动类加载器为止。如果父类加载器无法加载委派给它的类时,将类加载任务退回给它的下一级加载器去执行;
除了启动类加载器以外,每个类加载器拥有一个父类加载器,用户的自定义类加载器的父类加载器是AppClassLoader; -
双亲委派优点
- 避免类的重复加载
双亲委派模型可以保证全限名指定的类,只被加载一次; - 沙箱安全机制
自己写的java.lang.String.class类不会被加载,这样便可以防止核心API库被随意篡改
双亲委派模型不具有强制性约束,是Java设计者推荐的类加载器实现方式;
打破双亲委派机制
- 打破双亲委派机制
打破双亲委派
JVM内存模型
- jvm的主要组成部分
jvm主要由类装载子系统、执行引擎,运行时数据区组成
- 栈
可以理解为由很多个线程栈所组成的内存区域,JVM会给每个单独的线程开辟一个独立的栈空间 - 栈帧
栈帧用于存储局部变量、操作数栈,动态链接,方法出口,一个方法对应特定的栈帧内存区域,这也是为什么递归调用场景,如果没有出口将会导致栈内存溢出 - 本地方法栈
带有native关键字的方法的方法栈 - 堆
堆分为年轻代(edem区,S0,S1),老年代 - 垃圾回收
minor GC,full GC - 元空间
存放类信息
常用命令
jps
查看进程
jmap
jmap -histo
- jmap -histo 25124
查看25124进程对应的内存信息,实例个数和所占用的内存num #instances #bytes class name ---------------------------------------------- 1: 232314 52764168 [B 2: 360321 47344648 [C 3: 25177 31904624 [I 4: 165861 3980664 java.lang.String 5: 38558 3393104 java.lang.reflect.Method 6: 50254 3046304 [Ljava.lang.Object; 7: 105103 2238208 [Ljava.lang.Class; 8: 18531 1476256 [S 9: 16513 1343104 [Ljava.util.HashMap$Node; 10: 27392 1314816 java.util.HashMap 11: 34464 1102848 java.util.HashMap$Node 12: 9614 1075616 java.lang.Class 13: 29226 935232 java.util.concurrent.ConcurrentHashMap$Node 14: 38277 918648 java.lang.StringBuilder 15: 18214 728560 java.util.LinkedHashMap$Entry 16: 18896 604672 java.lang.ref.WeakReference 17: 9621 538776 java.util.LinkedHashMap 18: 10492 450368 [Ljava.lang.reflect.Method; 19: 6193 445896 java.lang.reflect.Field 20: 231 379696 [Ljava.util.concurrent.ConcurrentHashMap$Node; 21: 22519 360304 java.util.HashSet 22: 14480 347520 java.util.ArrayList 23: 10298 329536 java.util.ArrayList$Itr 24: 9050 309152 [Ljava.lang.String; 25: