一、借鉴的文章
二、分析Integer对象大小
1. 示例代码
2. idea中jvm参数配置
三、运行后等待控制台输出
1. 不建议使用jvisualvm情况
2. 使用jprofile进行观察
四、终结
正文
一、 借鉴的文章 JVM之压缩指针(CompressedOops)
文章中提到了如何通过程序进行分析CompressedOops发挥的作用。
这里对示例进行测试并使用jprofile进行dump快照分析。
二、 通过如下示例运行分析Integer对象大小
1. 示例代码。
运行在idea中
(1).运行时配置jvm参数
-XX:-UseCompressedOops -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode
(2)更改-XX:-UseCompressedOops中UseCompressedOops前的加减号即可配置jvm是否启动压缩指针的操作
package org.example.compressoop;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
public class IntegerApplication {
public static void main(String[] args) {
List<Integer> intList = new LinkedList<>();
for (int i = 0; i < 4000000; i++) {
Integer number = new Integer(1);
intList.add(number);
}
Scanner scanner = new Scanner(System.in);
System.out.println("application is running...");
String tmp = scanner.nextLine();
System.exit(0);
}
}
2. idea中jvm参数配置
三、运行后等待控制台输出
输出内容为application is running...
后即可打开jvisualvm对此java进程进行查看, 如图
jvisalvm 查看到的integer对象大小在切换useCompressOops不变化。不建议使用jvisualvm, 后面会贴出使用jprofile分析的内容
1) 不建议使用jvisualvm情况:这里不能观察到 这里观察的size大小始终相同, 看不出使用了压缩
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f8fc1285d63888998332d798c565dce9.png)
2) 使用jprofile进行观察
-XX:-UseCompressedOops 不使用时
-XX:+UseCompressedOops 使用时
4. 终结
通过参数的配置执行分析对比。对大型项目的运行中压缩指针会提升内存的利用率。