我是靠谱客的博主 可爱裙子,最近开发中收集的这篇文章主要介绍JAVA内存调优JAVA内存调优,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • JAVA内存调优
      • 堆内存常用配置
      • 年轻代
      • 老年代
      • 永久代(JKD8以后废除)
      • 元空间(Metaspace)
    • 垃圾回收类型
    • 参考资料

JAVA内存调优

使用Java -XX:+PrintFlagsInitial命令查看本机的初始化参数

一个java线程对应一个栈。栈中存储基本类型、引用

栈是由栈帧组成的,一个方法对应一个栈帧

栈帧包含:局部变量表、操作帧、动态链接、方法出口

栈的存储结构是FILO(先进后出),最先进去的在最后面退出

jvm默认一个线程栈的大小是1M,可以通过参数(-Xss256k)进行调整

堆内存常用配置

  1. -Xmx2048m:设置JVM最大可用内存为2048M。
  2. -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:

  1. 老年代被填满
  2. 永久代被填满
  3. System.gc()被调用

参考资料

  • https://www.cnblogs.com/andy-zhou/p/5327288.html
  • https://www.cnblogs.com/anyehome/p/9071619.html

最后

以上就是可爱裙子为你收集整理的JAVA内存调优JAVA内存调优的全部内容,希望文章能够帮你解决JAVA内存调优JAVA内存调优所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部