概述
文章目录
- JAVA内存调优
- 栈
- 堆
- 堆内存常用配置
- 年轻代
- 老年代
- 永久代(JKD8以后废除)
- 元空间(Metaspace)
- 垃圾回收类型
- 参考资料
JAVA内存调优
使用Java -XX:+PrintFlagsInitial命令查看本机的初始化参数
栈
一个java线程对应一个栈。栈中存储基本类型、引用
栈是由栈帧组成的,一个方法对应一个栈帧
栈帧包含:局部变量表、操作帧、动态链接、方法出口
栈的存储结构是FILO(先进后出),最先进去的在最后面退出
jvm默认一个线程栈的大小是1M,可以通过参数(-Xss256k)进行调整
堆
堆内存常用配置
- -Xmx2048m:设置JVM最大可用内存为2048M。
- -Xms1024m:设置JVM初始内存为1024m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
年轻代
年轻代又分以下三种
- Eden区
- from
- to
所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代分三个区。一个Eden区,两个Survivor区(一般而言)。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor区也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来 对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor区过来的对象。而且,Survivor区总有一个是空的。同时,根据程序需要,Survivor区是可以配置为多个的(多于两个),这样可以增加对象在年轻代中的存在时间,减少被放到年老代的可能。
老年代
经过年轻代多次GC后,仍然存活的对象会被移动到老年代。当触发Full GC时,会对老年代进行回收
永久代(JKD8以后废除)
永久代是存在方法区中
元空间(Metaspace)
关于元空间的解释请参考[JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)]
jdk8新增的部分,元空间不在虚拟机中,而在本地内存中。可以根据实际需要动态扩容和回收。
元空间常用配置参数:
1、-XX:MetaspaceSize=256m
初始化的Metaspace大小,控制元空间发生GC的阈值。GC后,动态增加或降低MetaspaceSize。在默认情况下,这个值大小根据不同的平台在12M到20M浮动。使用Java -XX:+PrintFlagsInitial命令查看本机的初始化参数
2、-XX:MaxMetaspaceSize=256m
限制Metaspace增长的上限,防止因为某些情况导致Metaspace无限的使用本地内存,影响到其他程序。在本机上该参数的默认值为4294967295B(大约4096MB)。
3、-XX:MinMetaspaceFreeRatio=40
当进行过Metaspace GC之后,会计算当前Metaspace的空闲空间比,如果空闲比小于这个参数(即实际非空闲占比过大,内存不够用),那么虚拟机将增长Metaspace的大小。默认值为40,也就是40%。设置该参数可以控制Metaspace的增长的速度,太小的值会导致Metaspace增长的缓慢,Metaspace的使用逐渐趋于饱和,可能会影响之后类的加载。而太大的值会导致Metaspace增长的过快,浪费内存。
4、-XX:MaxMetasaceFreeRatio=70
当进行过Metaspace GC之后, 会计算当前Metaspace的空闲空间比,如果空闲比大于这个参数,那么虚拟机会释放Metaspace的部分空间。默认值为70,也就是70%。
5、-XX:MaxMetaspaceExpansion=5m
Metaspace增长时的最大幅度。在本机上该参数的默认值为5452592B(大约为5MB)。
6、-XX:MinMetaspaceExpansion=5m
Metaspace增长时的最小幅度。在本机上该参数的默认值为340784B(大约330KB为)。
垃圾回收类型
1、Scavenge GC
一般情况下,当新对象的生成,并且在Eden申请空间失败时,就会触发一次Scavenge GC,对Eden区进行一次GC,并清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理两个Survivor区。这种方式的GC是对年轻代的Eden区进行,并不会影响老年代
2、Full GC
对整个堆内存进行整理,包括年轻代、老年代和永久代。Full GC比Scavenge GC要慢,因尽量减少Full GC的次数。如下原因可能导致Full GC:
- 老年代被填满
- 永久代被填满
- System.gc()被调用
参考资料
- https://www.cnblogs.com/andy-zhou/p/5327288.html
- https://www.cnblogs.com/anyehome/p/9071619.html
最后
以上就是可爱裙子为你收集整理的JAVA内存调优JAVA内存调优的全部内容,希望文章能够帮你解决JAVA内存调优JAVA内存调优所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复