0

0

深入理解JVM内存分配策略

蓮花仙者

蓮花仙者

发布时间:2025-07-21 12:28:27

|

342人浏览过

|

来源于php中文网

原创

大家好,我们又见面了,我是你们的朋友全栈君。

深入探讨JVM内存分配策略:三大原则与担保机制JVM的内存分配机制包括三大原则和担保机制,具体如下:

首先,对象优先分配到Eden区。其次,大对象直接进入老年代。第三,长期存活的对象会被分配到老年代。最后,空间分配担保也是一个重要的机制。

对象优先在Eden区分配要如何验证这一原则呢?我们可以通过以下实验进行验证。

首先打印内存分配信息,代码如下所示:

public class A {    
    public static void main(String[] args) {        
        byte[] b1 = new byte[4*1024*1024];    
    }
}

代码非常简单,创建了一个大小为4MB的Byte数组。我们在运行时添加虚拟机参数来打印垃圾回收信息。

-verbose:gc -XX:+PrintGCDetails

运行后,结果如下所示。

我们手动指定收集器,可以看到新生代使用的是Parallel Scavenge收集器。实际上,我们可以通过指定虚拟机参数来选择垃圾收集器,例如:

-verbose:gc -XX:+PrintGCDetails -XX:+UseSerialGC

运行结果如下:

虽然JDK默认的不是Parallel收集器,但JDK会根据各种环境调整使用的垃圾收集器。

要查看环境,可以使用以下代码:

java -version

深入理解JVM内存分配策略 因此,JDK根据服务器环境选择了Parallel收集器,而Serial收集器主要用于客户端。

验证Eden区分配我们观察到当前Eden区域为34432K,占用19%。如果我们将分配大小扩大10倍,Eden区是否还能容纳呢?我们来验证一下。

public class A {    
    public static void main(String[] args) {        
        byte[] b1 = new byte[40*1024*1024];    
    }
}

运行结果如下:

因此,我们适当缩小每次分配的大小。我们限制Eden区域的大小,参数如下:

-verbose:gc -XX:+PrintGCDetails -XX:+UseSerialGC -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8

这里我们将内存大小限制为20M,Eden大小为8M。

然后我们运行以下代码:

public class A {    
    public static void main(String[] args) {        
        byte[] b1 = new byte[2*1024*1024];        
        byte[] b2 = new byte[2*1024*1024];        
        byte[] b3 = new byte[2*1024*1024];        
        byte[] b4 = new byte[4*1024*1024];        
        System.gc();    
    }
}

运行结果如下:

原先的b1、b2、b3总共6M,被分配到了老年代。

原先的Eden区域如下图所示,在分配完b1、b2、b3后如下图所示。

深入理解JVM内存分配策略 此时我们发现已经无法继续分配了。

查看日志时,我们发现发生了两次GC。

[DefNew: 7129K->520K(9216K), 0.0053010 secs] 7129K->6664K(19456K), 0.0053739 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 

中我们会看到,刚分配的对象并没有被回收。

NewsBang
NewsBang

盛大旗下AI团队推出的智能新闻阅读App

下载

上面的GC是针对新生代的,而下面的FullGC是针对老年代的。

如果我们此时要再分配4MB的内存,虚拟机会将原先的Eden区域放到可放的地方,即老年代。

因此会发生这种情况。

深入理解JVM内存分配策略 这就是整个过程,验证了对象优先在Eden区域分配。


大对象直接进入老年代指定大对象的参数如下:

-XX:PretenureSizeThreshold

测试代码如下:

-verbose:gc -XX:+PrintGCDetails -XX:+UseSerialGC -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8
public class A {    
    private static int M = 1024*1024;    
    public static void main(String[] args) {        
        byte[] b1 = new byte[8*M];    
    }
}

运行结果如下:

我们可以看到,结果直接将8MB放到了老年代。而当我们将大小改为7MB时,

深入理解JVM内存分配策略 我们发现7MB全部被放到了Eden区。如果我们指定了参数,会发现结果变了。

参数如下所示:

-verbose:gc -XX:+PrintGCDetails -XX:+UseSerialGC -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8 -XX:PretenureSizeThreshold=6M

运行结果如下:

深入理解JVM内存分配策略 我们会发现7MB进入了老年代。

长期存活对象进入老年代---

参数如下:

-XX:MaxTenuringThreshold

每次进行回收时,如果对象没有被回收,那么对象的年龄会加1。

当对象的年龄达到阈值时,它会进入老年代。

具体测试与上述类似,这里就不再赘述了。


空间分配担保参数如下:

-XX:+HandlePromotionFailure

步骤如下:

首先,JVM会评估是否有足够的空间,然后才能进行分配。如果有能力放入,那么这个参数是‘+’号,表示开启了内存担保,否则是‘-’号,表示未开启。


总结:JVM的内存分配策略并不特别复杂,只要一步一步跟随虚拟机的操作,就可以理解其内存分配机制。

发布者:全栈程序员栈长,转载请注明出处:https://www.php.cn/link/ab4981fb59db07f87db4b1a7a2e9efcf

相关专题

更多
html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

612

2023.06.14

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

650

2023.06.21

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

468

2023.07.31

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

245

2023.08.01

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2892

2023.08.11

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

505

2023.08.11

html转txt
html转txt

html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

311

2023.08.31

html文本框代码怎么写
html文本框代码怎么写

html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

424

2023.09.01

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.3万人学习

Git 教程
Git 教程

共21课时 | 2.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号