Jvm调优学习笔记
2020-08-12 本文已影响0人
Helloword_Cc
Java结构:
1) 栈
1.成员变量表
2.动态链接 (动态的指示字节码指令执行到哪里)
2) 堆
新生代+老年代+永久代
堆空间大小:
初始大小:物理内存/64
最大: 物理内存/4
手动设置: -Xms:m -Xmx:m 初始化大小 最大大小
堆内存达到最大的时候,有空闲则会自动gc降下来。
生产环境建议两个参数设置一样,防止频繁gc
3) 方法区
方法区:
image.png
(运行需要用到的类信息,域信息,类型信息,常量池)
常量池:字符串(数字)字面量,还包含类、方法的信息(存放.class编译后的字节码指令)
通过命令来查询进程
使用java(jps)命令查看运行的进程
前面为进程的编号:后面则为java启动的进程
image.png
使用 jstat -gc 进程编号 查看进行使用情况
image.png
设置堆空间内 新生代与老年代的比例,默认值为2
即新生代:老年代 空间比例为 1:2
image.png
1)当我们程序创建的对象,若生命周期比较长,我们则可以调大老年代的比例。
2)若生命周期都比较短,经常被回收的话,我们则可以调大新生代的比例。
新生代:Eden区 / S1区 / S2区
老年代
说明:
1)Eden区满了进行Ygc将幸存对象存到S1区
2)S1区和S2区属于相互回收的空间,同一时刻只有一个区存在对象。空的区则是To区。有对象的为From区。
3)默认情况下S1区/S2区 进行gc15次后晋升到老年代
注意:如果Eden满了的时候,S1也满了,则直接晋升到老年代
4)如果对象过大,S1区放不下,则直接晋升老年代。再存不下可能就OOM异常了。