jvm调优
2020-06-22 11:44:59 0 举报
jvm虚拟机调优
作者其他创作
大纲/内容
堆和元空间中的东西,是线程公有的
OOM(OutOfMemoryError内存溢出)
局部变量表
年轻代
类装载子系统
方法区(元空间)(直接内存)常量+静态变量+类元信息
方法出口
(也是先进后出)
操作数栈
堆
进行操作,临时的一个内存区域
GC root
Survivor区
栈(线程)
本地方法栈
iadd进行相加
(iadd执行int类型的加法)(iload_2从局部变量2中装载int类型值)3(iload_1从局部变量1中装载int类型值)1
线程2
程序计数器,是为了解决cpu线程切换时。不能续接之前线程执行到哪一步了的问题。还有就是执行GC后继续运行使用到
sum()栈帧
4
5(把结果4压入到b中)
引用对象的实体
1
程序计数器
helloword.class
b(先分配内存,还未得到值)
Cat
public class HelloWord{public Cat cat = new Cat();public int sum(){int a = 1;int c = 3;int b = a +c;return b;}public static void main(String [] args){sum();Persion p = new Persion();}}
main()栈帧
新生代收集器:Serial (-XX:+UseSerialGC)复制算法,单cpu最快 串行收集器ParNew(-XX:+UseParNewGC)优化单复制算法,多cpu快 并行收集器ParallelScavenge(-XX:+UseParallelGC)复制算法,大吞吐量 并发收集器G1 收集器老年代收集器:SerialOld(-XX:+UseSerialOldGC)整理单cpuParallelOld(-XX:+UseParallelOldGC)整理 多cpu的老年版CMS(-XX:+UseConcMarkSweepGC)标记清理,执行速度快,吞吐量大。但是会有内存碎片G1 收集器 在堆cms清理后的内存碎片进行了良好的调整
springboot 启动时设置java -Xms10m -Xmx80m -jar XX.jar-xms初始化堆大小-xmx堆最大-xmn年轻代大小-XX:NewSize年轻代大小-XX:MaxNewSize最大年轻大小-XX:+PrintGCDetails打印GC详情-Xloggc: path/filename 日志输出
Eden区域满了,或者新创建的对象大小 Eden所剩空间minor gc (gc roots算法回收线程栈)
调用本地的其他类库,比如.net。C语言类库实现。
然后根据可达性分析算法进行搜索1.标记清除算法2.标记整理算法3.复制
gc
进入,既装载时放入
Persion
gc回收堆与方法区及本地方法栈中的没有引用的对象,比如重新赋值对象,线程栈执行完成后。都会导致断掉引用。
2
具体的调优办法:根据业务请求接口,然后用到的对象。在计算这个对象中的全局变量,常量大小进行估算,如int4字节,String实际内容长度。然后做假设放入伊甸园。分析可能用到多大内存。进行内存调优。还有就是设置对应场景的GC收集器。
动态链接
Cat15
full gc(老年代满的时候触发,单独开启一个后台的垃圾回收线程,回收整个堆)
3
老年代(3/2)
eden(10/8)
调优流程
弹出最前两位数进行计算得出结果后在压入栈
栈(先进后出)
minor gc时检查到对象有引用会标记为非垃圾对象,并且增加对象年龄。没有被打上标记的对象都将被销毁。默认年龄达到15时进入老年代
jvm调优,是为了减少STW(stop the word)。执行gc会暂停用户的所有线程,专心回收。为什么要停掉所有线程。比如执行minor gc 给线程中的对象打上了非垃圾对象的标识后。线程马上就执行结束了。然后把对象的引用销毁了。就意味这刚才gc标识的对象就又都变成垃圾了。这样gc就白做了。
方法区中常量池取符号常量
运行时数据区(内存模型)
可以作为GC Root 根点的有:栈中的引用的对象。既运行方法时所用到的对象。方法区中静态引用指向的对象。既类中的静态属性方法区中常量引用指向的对象。既类中的常量Native方法中JNI引用的对象。
s1(10/1)
栈
c=3
JVM
Persion(如果是引用类型,值为指针。指向堆内存中的对象)
被调用方法执行完后返回到,主方法的具体位置
main线程
打印GC日志根据GC日志得到关键性能指标:将上面得到的GC日志通过GC日志可视化分析工具GCeasy和GCViewer,得到吞吐量、暂停时间、GC次数等关键指标,分析GC原因,调整JVM参数:查看GC的次数和原因等,是young GC,还是Full GC,什么原因引起的young GC、Full GC。分析之后,根据选用的垃圾收集器调整相关的参数,重复上面步骤,观察调优结果。
字节码执行引擎
a=1
动态修改每个线程的值
javac命令编译为机器识别码文件
s0(10/1)
年轻代GC时Eden使用标记清除和复制算法。复制到S0或者S1
0 条评论
下一页