JVM学习--内存分配策略(持续更新)
一、前言#
最近学习《深入java虚拟机》,目前看到内存分配策略这块。本文将进行一些实践。
二、内存分配策略#
1.大对象直接进入老年代#
书中提到了:
下面进行测试,代码如下:
public class testBigSizeObject { private static final int _1MB=1024*1024; public static void main(String[] args) { byte[] allocation; allocation=new byte[4*_1MB]; //直接分配在老年代中 System.out.println(allocation[0]); } }
1.1 新生代收集器为Parallel Scavange的情形#
以下虚拟机参数,没有显式设置垃圾收集器,默认新生代为Parallel Scavange(这一点可以从标准输出中的-XX:+UseParallelGC看出来)
-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:PretenureSizeThreshold=3145728 -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+PrintCommandLineFlags
标准输出:
-XX:InitialHeapSize=20971520 -XX:MaxHeapSize=20971520 -XX:MaxNewSize=10485760 -XX:NewSize=10485760 -XX:PretenureSizeThreshold=3145728 -XX:+PrintCommandLineFlags -XX:+PrintGC -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Heap PSYoungGen total 9216K, used 5899K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000) eden space 8192K, 72% used [0x00000000ff600000,0x00000000ffbc2e10,0x00000000ffe00000) from space 1024K, 0% used [0x00000000fff00000,0x00000000fff00000,0x0000000100000000) to space 1024K, 0% used [0x00000000ffe00000,0x00000000ffe00000,0x00000000fff00000) ParOldGen total 10240K, used 0K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000) object space 10240K, 0% used [0x00000000fec00000,0x00000000fec00000,0x00000000ff600000) Metaspace used 2886K, capacity 4486K, committed 4864K, reserved 1056768K class space used 309K, capacity 386K, committed 512K, reserved 1048576K
这里值得注意的是,大对象(代码中为4M的一个数组)大于-XX: PretenureSizeThreshold 设置的3M,应该直接进入老年代才对。
可是,这里并没有进入老年代。
1.2 显式设置新生代垃圾收集器为Serial收集器#
E:\javabase\out\production\javabase>java -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:PretenureSizeThreshold=3145728 -XX:+PrintGCDetails
-XX:SurvivorRatio=8 -XX:+UseSerialGC testBigSizeObject
输出:
1.3 总结#
看来,书里说的策略,那也是在特定的垃圾收集器才生效的。不是在所有垃圾收集器中都有该现象。
所谓“纸上读来终觉浅,绝知此事要躬行”。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端