JVM的简介及内部结构(二)

前文回顾

在这里插入图片描述
A:hello_test.class由类装载子系统加载到方法区(元空间)
B:由字节码执行引擎到方法区(元空间)执行代码。程序计数器是用来记录程序执行的位置,所以字节码执行引擎每执行完一行代码,修改一下程序计数器。
C:根据代码中线程开辟线程空间。由于hello_test.class中只有main线程,所以这里只开辟了main线程空间。
D:而在线程中用到的变量需要存储在中,所以线程空间中需要
E:当程序中有用到本地方法时,则线程空间也需要本地方法栈。
由上不难看出,栈、本地方法栈、程序计数器都为每个线程私有,也就是一个线程会为它单独分配这三块。
而堆、方法区(元空间)则为所有线程共用的。这也造成多线程不安全。

堆:存放对象
在这里插入图片描述
A:当需要存放对象时,一般存放Eden元区。
B:当Eden元区放满,新对象还再向Eden元区存放时,字节码执行引擎就会在后台开启一个垃圾回收线程(minor gc)。可达性分析算法,通过gc root查询是否有引用。从gc root出发找到了引用则标记为非垃圾数据。
C:将Eden元区中标记的非垃圾对象复制到survivor 1区,并把这些非垃圾对象的分代年龄加一,最后把Eden元区清空。
D:当Eden元区再次放满后,启动minor gc,对Eden元区和survivor 1区中的对象进行可达性分析算法,标记出非垃圾对象,再将这些非垃圾对象复制到survivor 2区,并把这些非垃圾对象的分代年龄加一,最后把Eden元区和survivor 1区清空。
E:minor gc会对Eden元区和非空的survivor 区中对象进行可达性分析算法,最终将非垃圾对象复制到空的survivor 区,并将非垃圾对象的分代年龄加一,如此循环。
F:当有对象的分代年龄超过15,则将该对象移动到老年代。
G:当老年代放满,触发full gc。OOM(内存溢出)
JVM调优:尽量减少gc次数,执行时间。特别是减少full gc次数及执行时间
STW:gc触发STW(stop the Word)停止用户的所有线程,页面形成卡顿。
这里介绍两个java诊断工具
1.Arthas 是Alibaba开源的Java诊断工具
https://arthas.aliyun.com/doc/
2.jdk自带的jvisualvm
以jdk自带的jvisualvm的工具进行分析

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值