JVM
2022-03-19 00:39:41 0 举报
java jvm流程图
作者其他创作
大纲/内容
程序计数器
⑤修改
JDK的类会优先使用BootStrapClassLoader进行加载
沙箱安全机制
本地方法栈
xx1ClassLoader自定义实现,可以自定很多可以打破刷双亲委派机制
FullGC
判断两个类是否相同——除了类名包名一致以外,还需要使用同一个类加载器进行加载,这也是沙箱安全机制的原理
永久存储区有不同的实现:永久代、元空间——Java8的默认JVM实现,不在JVM内,位于本机的物理内存
Eden满,触发youngGC
双亲委派模型,全盘委托机制
survivor0幸存者0区清空
Eden Space伊甸园区清空
栈——Java Stack
④执行
一段时间后
Main方法
BootstrapClassLoaderC++,实现用于加载jre.lib.tr.jar的类
栈帧
Tenure Generation Space老年代占2/3的堆空间默认新生代的对象年龄到达15岁(最大值)就会被转移到老年代
方法出口
GC算法会stw(stop the wor)造成线程暂停不再进行操作主因是不能一边清楚gc一边添加new 出来占内存
mian线程帧
堆——heap
当需要加载一个类时,优先使用父类加载器,如果无法加载则交给子类加载去加载
Eden Space伊甸园区满了!!!!
②
survivor0幸存者0区
AppClassLoaderJava实现,默认的系统加载器加载自己的程序类加载器
④new
JVM虚拟机
1. 引用计数法——无法解决循环引用,改进:设定一个根节点,与根节点不连通的都可以GC
person.class
动态链接就是像符号变量修改成引用变量
操作数帧
minorGC只发生在新生代
XX2ClassLoader
如果此过程fullGC也不能清除内存,内存已满就会oom内存溢出
程序员自定义的String类无法被加载JDK源码不会被程序员污染
*以上数字均为JVM默认,可以根据具体场景修改,并非定值
类加载子系统
①
survivor0幸存者0区幸存下来的对象被转移至此,年龄+1,如果年龄超过阈值则转移至老年代
字节码执行器
survivor0幸存者0区占1/30的堆空间
Survivor1幸存者1区占1/30的堆空间
执行方法到cpu计算到寄存器载返回局部变量表修改
Survivor1幸存者1区没用的对象被回收。留下来的对象转移至此,年龄+1,如果年龄超过阈值则转移至老年代
new person
方法区——Method Area(实现:元空间、永久代)存放类信息、常量、静态变量
2. 复制算法
堆——Heap存放对象会出现OutOfMenryError-Xms1024m开始大小,默认为本机内存的1/64-Xmx1024m最大大小,默认为本机内存的1/4一般最大最小设为同值——以防止内存波动
1. 标记清除算法:如果老年代满了,标记没有用的对象,清除
栈(线程)
Eden Space伊甸园区占8/30的堆空间所有新创建的对象都在这里
③找到
使用同一个包名类名的两个类因为类加载器不同会被认为是不同的类
kclass
局部变量表
2. 标记整理算法:清除对象导致内存碎片,整理腾出连续的内存空间
新生代
ExtensionClassLoaderJava实现,用于加载jre.lib.ext包下的类
Person p = new Person()P.methodA
Survivor1幸存者1区清空
Survivor1幸存者1区
线程独占区
线程共享区
动态链接
方法A
0 条评论
下一页