java指针压缩临界值

  • 一、概念
  • 二、代码
  • 三、测试
    • 1. 试试看32g
    • 2. 参照物来了,31g
    • 3. 32g - 1m = 32767m
    • 4. 没有什么是减1m不能解决的,如果有...
  • 四、最后

一、概念

  1. 在64位平台的HotSpot中使用32位指针,内存使用会多出1.5倍左右,使用较大指针在主内存和缓存之间移动数据,占用较大宽带,同时GC也会承受较大压力
  2. 为了减少64位平台下内存的消耗,启用指针压缩功能
  3. 堆内存大于32G时,压缩指针会失效,会强制使用64位(即8字节)来对java对象寻址

以上内容摘自ignorewho的博客。这里提到了32G这个临界值,那么,我们的程序应该设置多大的堆内存,才能恰好避开指针压缩失效,而且最大限度的使用内存呢?下面我们开始实验探索。

二、代码

测试程序的思路很简单。我们既然要测试的其实就是不同内存下引用的大小,单个引用是很小的,可以通过量级来减少误差。那么约束条件也就有了:

  1. 足够多的引用(即足够多的对象)
  2. 统计前不要发生gc

程序设计如下:

import java.util.LinkedList;
import java.util.List;public class Main {public static void main(String[] args) throws InterruptedException {List<Integer> list = new LinkedList<>();int total = Integer.parseInt(args[0]) * 10000;for (int i = 0; i < total; i++) {list.add(i);}System.out.println(list.size());// 留给观察和截图的时间Thread.sleep(5000);// 维持一个引用System.out.println(list.size());}
}

三、测试

1. 试试看32g

执行命令java -Xms32g -Xmx32g -jar test-memory.jar 1000

可以看到,32g堆内存下,包含1000万个Integer元素的LinkedList共占用内存727.8MB。但此时我们并不知道jvm是否采用了指针压缩策略,因为我们缺少一个参照物。

2. 参照物来了,31g

执行命令java -Xms31g -Xmx31g -jar test-memory.jar 1000

果然如我们所料!内存只占用了495.5MB,整整下降了232.3MB!下降幅度达32%,但如果反过来说,从31g到32g,内存占用则上升了47%!当然,由于本例采用LinkedList,属于引用多但对象小,所以比正常的程序要更明显,但也足以说明问题了。所以我们目前的结论是,在堆内存32g整的时候,jvm的指针压缩就已经失效了
那么实验到这里就结束了?当然不。31g到32g之间还有整整1g、1024k、1048576b的内存,怎么可能就这么放弃了,我们继续。

3. 32g - 1m = 32767m

执行命令java -Xms332767m -Xmx332767m -jar test-memory.jar 1000

看到这个实验结果可能我们有些失望,32767m下占用的内存和32g下竟然如出一辙——727.8M。到这里我们可能有一些疑问了,不是说32g以上指针压缩才会失效吗,为什么32g-1m的情况下依然失效了?但换个思路,这也说明,实验进行到这里,我们已经不虚此行了,所谓的32g临界点,并不是一个确切的值
那么我们如何处理这种情况?还要1m这样递减下去吗?是的。哈哈,开个玩笑。但是由于一时没有太好的思路,我们倒不妨再试一次,如果结果再没有变化,我们再去探索其他的办法。

4. 没有什么是减1m不能解决的,如果有…

执行命令java -Xms332766m -Xmx332766m -jar test-memory.jar 1000

成了!可以看到,在332766m(32g - 2m)下,内存占用回到了498.8M,指针压缩又回来了!写到这里我懒得写了,就这样吧。希望小伙伴们可以亲自继续探索一下背后的奥秘,遇到困难可以留言或者私聊我~

四、最后

这篇博客不属于严格的技术博客,抛弃了jvm源码分析,也基本没有引用官方说明。它的目的和意义仅在于给初学者一个易懂易操作的示例流程,当然,如果能激发起继续探索的兴趣那就更好了。想要继续探索的小伙伴可以先看下这篇博客。

java指针压缩临界值相关推荐

  1. 聊一聊JAVA指针压缩的实现原理(图文并茂,让你秒懂)

    前言 在网上大家很多都看到过这样一句话:"JVM内存最好不要超过32G". 今天我们就来分析一下为什么?32G到底是怎么算出来的. JAVA对象模型 我们先了解一下,一个JAVA对 ...

  2. JVM - 剖析Java对象头Object Header之指针压缩

    文章目录 Pre 指针压缩 论证压缩效果 UseCompressedOops & UseCompressedClassPointers [指针压缩]开启 VS 关闭 指针压缩的目的 为什么堆内 ...

  3. java压缩对象_Java 对象指针压缩

    很久之前就看到过 Java 对象指针压缩这个技术,只是一直没具体想为什么要偏移 3 位,好吧,最近才知道原因是因为大多数 JVM 实现都是采用 8 位对齐,所以二进制位中的后三位都是 0. Let's ...

  4. [Java JVM] Hotspot GC研究- 64位引用指针压缩技术

    为什么需要指针压缩 在上一篇文章 [Java JVM] Hotspot GC研究- 开篇&对象内存布局 中介绍对象内存布局时, 曾提到过, 由于在64位CPU下, 指针的宽度是64位的, 而实 ...

  5. java 内存压缩_JVM之指针压缩内存如何设置

    在32位到64位的转变中,人们最大的获益是内存容量.在一个32位的系统中,内存地址的宽度就是32位,这就意味着,我们最大能获取的内存空间是2^32(也就是4G)字节.这个容量明显不够用!在一个64位的 ...

  6. JAVA对象头的指针压缩

    JAVA对象头的指针压缩 文章目录 JAVA对象头的指针压缩 对象在JVM中的内存布局 对象的访问定位 压缩实验 实验步骤 压缩策略组合 压缩内容 压缩后的影响 指针压缩的实现 JVM内存关键大小 对 ...

  7. java 对象压缩_理解Java对象:要从内存布局及底层机制说起,话说....

    前言 大家好,又见面了,今天是JVM专题的第二篇文章,在上一篇文章中我们说了Java的类和对象在JVM中的存储方式,并使用HSDB进行佐证,没有看过上一篇文章的小伙伴可以点这里:< 这篇文章主要 ...

  8. 什么是指针压缩?如何开启和关闭指针压缩?为什么要进行指针压缩?有哪些注意的地方?

    什么是指针压缩呢? 从jdk1.6开始在64位的操作系统中就JVM就支持指针压缩. 如何开启和关闭指针压缩? jvm配置参数:UseCompressedOops,compressed--压缩.oop( ...

  9. java 文件压缩 解压_Java文件压缩与解压缩(一)

    package com.cn; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream ...

最新文章

  1. 通过 RDTSC 指令从 CPU 寄存器中直接获取系统时钟
  2. canvas并查集画随机迷宫
  3. treasure what you have now
  4. 架构 | 微服务架构下如何解耦,对于已经紧耦合下如何重构?
  5. Spark MLlib回归算法------线性回归、逻辑回归、SVM和ALS
  6. HTML5移动端触摸事件
  7. android的json解析方式,Android解析JSON方式
  8. C/C++中如何使用typedef给函数指针取别名使其更具可读性
  9. mysql视频教程特密码_分享一个MySQL 密码增强插件
  10. log4j记录日志到sqlserver数据库
  11. 项目中AOP的使用-读写分离
  12. 一种多功能语音识别技术和音乐播放器相结合的方法
  13. PAT之水题:逻辑题、数学问题(素数、多项式、分数、大整数、进制转换)
  14. 电力系统决策支持系统
  15. java中格林尼治时间的输出_Java中格林尼治时间和时间戳的相互转换
  16. PS抠图之单色背景图片
  17. layer的btn按钮
  18. Linux:网络五元组tcp、udp特性
  19. vr全景视频是如何拍摄的呢,商家为何要进行拍摄全景
  20. 十年BAT架构履历,铁柱磨针成188页Java核心知识点

热门文章

  1. 告别LiveServer,vscode微软官方的LivePreview来了
  2. Etcd部分常用命令+采坑
  3. NLTK词性pos_tag的含义
  4. Could not set property 'xxxxxx' of 'xxxxxx' with value 'xxxxx'
  5. 下载蓝盒插件_Fredo6插件下载 FredoTools(Fredo工具箱) 3.8c for Sketchup 中文免费版 下载-脚本之家...
  6. JAVA相关的视频学习视频,内容较多
  7. ThoughtWork培训总结
  8. tcp协议系列文章(3):TLP算法
  9. 使用ICMP协议检测网络状态
  10. 新能源充电桩:特来电、小鹏汽车加速跑