2025年jvm内存模型及调优(jvm1.8内存模型)

jvm内存模型及调优(jvm1.8内存模型)p 1 JVM 内存模型 p 总结 可以发现最明显的一个变化是元空间从虚拟机转移到了本地内存 默认情况下 元数据空间大小仅受限于本地内存 这意味着以后不会因为永久代大小不够而抛出 OOM 异常了 jdk1 8 以前 HotSpot VM 将 class 和类的 jar 包数据存储在 PermGen 里 PermGen 大小是固定的 而且项目之间无法公用公有的 class

大家好,我是讯享网,很高兴认识大家。



 <p>1、JVM内存模型</p> 

讯享网


讯享网

总结:可以发现最明显的一个变化是元空间从虚拟机转移到了本地内存。默认情况下,元数据空间大小仅受限于本地内存, 这意味着以后不会因为永久代大小不够而抛出OOM异常了。 jdk1.8以前,HotSpot VM将class和类的jar包数据存储在PermGen里, PermGen大小是固定的,而且项目之间无法公用公有的class,所以很容易碰到OOM异常。改成MateSpace后, 各个项目会共享同样的class空间。比如多个项目都引用了apache-common包, 在MateSpace中只会存储一份的apache-common的class,提高了内存的利用率,垃圾回收更有效。

2、JVM堆内存常用参数

讯享网<tr> <th>参数</th> <th>描述</th> </tr> 

<tr> <td>-Xms</td> <td>堆内存初始大小,单位m、g</td> </tr> <tr> <td>-Xmx(MaxHeapSize)</td> <td>堆内存最大允许大小,一般不要大于物理内存的80%</td> </tr> <tr> <td>-XX:PermSize</td> <td>非堆内存初始大小,一般应用设置初始化200m,最大1024m就够了</td> </tr> <tr> <td>-XX:MaxPermSize</td> <td>非堆内存最大允许大小</td> </tr> <tr> <td>-XX:NewSize(-Xns)</td> <td>年轻代内存初始大小</td> </tr> <tr> <td>-XX:MaxNewSize(-Xmn)</td> <td>年轻代内存最大允许大小,也可以缩写</td> </tr> <tr> <td>-XX:SurvivorRatio=8</td> <td>年轻代中Eden区与Survivor区的容量比例值,默认为8,即8:1</td> </tr> <tr> <td>-Xss</td> <td>堆栈内存大小</td> </tr> 

3、GC(Garbage Collection)算法

首先贴一张网上盗来的大图,用它来说明一下GC的过程


大多数情况下,对象在新生代的Eden中分配。当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC,而大对象(需要大量连续内存空间的Java对象,类似长字符串和数组)将通过分配担保机制直接进入老年代。

Minor GC——复制算法具体过程:

Eden区快满的时候,会进行上一步类似操作,将Eden和S1区的年纪大的对象放到S0区【此时S1区就是空的】
直到Eden区快满,S0或者S1也快满的时候,这时候就把这两个区的年纪大的对象放到Old区。

4、JVM参数配置

在jdk1.8以前,生产环境一般有如下配置

表示在JVM里存储Java类信息,常量池和静态变量的永久代区域初始大小为512M,最大为1024M。在项目启动后,这个值是固定的,如果项目class过多,很可能遇到OutOfMemoryError: PermGen异常。

升级JDK1.8之后,上面的perm配置已经变成

MetaspaceSize如果不做配置,通过jinfo查看默认MetaspaceSize大小(约21M),MaxMetaspaceSize很大很大,前面说过MetaSpace只受本地内存大小限制。

5. JVM参数配置指南

前面三个部分对JVM进行了整体的了解,接下来是本文的重点。

文章看下来上面这段配置的意思很简单,设置元空间的初始值和最大值,设置堆空间的初始值和最大值。

为什么MetaspaceSize要设置为128M?为什么堆内存初始值Xms设置为256M而不是512M?

  • Java堆大小设置,Xms 和 Xmx设置为老年代存活对象的3-4倍,即FullGC之后的老年代内存占用的3-4倍
  • MaxPermSize(元空间)设置为老年代存活对象的1.2-1.5倍。
  • 年轻代Xmn的设置为老年代存活对象的1-1.5倍。
  • 老年代的内存大小设置为老年代存活对象的2-3倍。

5. JVM监控jstat

可以让系统运行一段时间后查看系统的各个指标,然后在进行配置。如下用jstat工具查看jvm的情况

jstat -gc 12345

S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
13824.0 22528.0 13377.0 0.0 .0 .2 .0 46189.3 73984.0 71119.8 9728.0 9196.2 14 0.259 3 0.287 0.546

OU表示老年代所占用的内存为 46189.3 K(大约45M);那么jvm相应的配置参数应该做如下修改

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

小讯
上一篇 2025-04-25 22:58
下一篇 2025-04-30 15:13

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/171910.html