1、将Java Heap Size设置的大于32G会对性能有什么影响?

开门见山的说,结果有几点(这几点其实也是内部关联):

触发JVM的临界值,优化策略Compressed OOPS失效(之前Heap Size在[4G~32G]区间内采用此优化)

由于优化策略失效,同时堆内存>32G,所以JVM被迫使用8字节(64位)来对Java对象寻址(之前4字节(32位)就够了)

通常64位JVM消耗的内存会比32位的大1.5倍,这是因为对象指针在64位架构下,长度会翻倍(事实上当内存到达40-50GB的时候,有效内存才相当于使用Compressed OOPS技术时候的32G内存)

更大的指针在主内存和缓存器(例如LLC, L1等)之间移动数据的时候,会占用更多的带宽

让JVM的GC面临更大压力的指针对象(在实际应用中构建大于12-16G的堆时,若无很好的性能调优与测评,你很容易就会引起一个耗时数分钟的完全GC)

1.1 JVM的OOPS

OOP = “ordinary object pointer” 普通对象指针

启用CompressOops后,会压缩的对象:

每个class的属性指针(静态成员变量)

每个对象的属性指针

普通对象数组的每个元素指针

1.2 JVM的优化策略Compressed OOPS

从JDK 1.6 update14开始,64 bit JVM正式支持了 -XX:+UseCompressedOops ,这个可以压缩指针,起到节约内存占用的新参数。

Compressed OOPS,即大雾的对象压缩技术,压缩引用到32位,以降低堆的占用空间。其伪代码原理就不贴了,

在堆大小在[4G~32G]的时候,这项技术会被触发,在JVM执行时加入编/解码指令,即

JVM在将对象存入堆时编码,在堆中读取对象时解码

内存地址确定公式类似于

Zero Based Compressed OOPS(零基压缩优化)则进一步将基地址置为0(并不一定是内存空间地址为0,只是JVM相对的逻辑地址为0,如可用CPU的寄存器相对寻址) 这样转换公式变为:

从而进一步提高了压解压效率。

使用Zero Based Compressed OOPS后,它的指针不再表示对象在内存中的精确位置,而是表示偏移量。这意味着32位的指针可以引用40亿个对象,而不是40亿个字节。

1.3 Zero Based Compressed OOPS的多种策略

它可以针对不同的堆大小使用多种策略,具体可以 ps + grep查看:

堆小于4G,无需编/解码操作,JVM会使用低虚拟地址空间(low virutal address space,64位下模拟32位)

小于32G而大于4G,使用Zero Based Compressed OOPS

大于32G,不使用Compressed OOPS

2、结论

Compressed OOPS,可以让跑在64位平台下的JVM,不需要因为更宽的寻址,而付出Heap容量损失的代价

它的实现方式是在机器码中植入压缩与解压指令,可能会给JVM增加额外的开销

java 32位可用内存_JVM内存不要超过32G相关推荐

  1. 32位Windows7上8G内存使用感受+xp 32位下使用8G内存 (转)

    32位Windows7上8G内存使用感受+xp 32位下使用8G内存 博客分类: Windows XPWindowsIE企业应用软件测试  我推荐做开发的朋友:赶快加入8G的行列吧....呵呵..超爽 ...

  2. 32位Windows7上8G内存使用感受

    原文地址为: 32位Windows7上8G内存使用感受 为什么要使用8G内存?在国内外各大论坛上,这都是一个有争议的问题.问题的反方论据非常充分: 除了少数专业领域,大多数应用程序不会需要超过1G的内 ...

  3. 关于笔记本操作系统32位和64位与内存大小的关系

    经常有网友问我这样的一个问题,什么是32位与64系统?32位系统与64位的区别等等.围绕目前这些大家比较关系的问题,电脑百事网编辑这里将与大家总结一下,关于32位操作系统与64位操作系统的区别. 首先 ...

  4. java 32位_Java知识点:创建节约内存的JavaBean

    一个Java对象到底有多大? 想要精确计算一个Java对象占用的内存,首先要了解Java对象的结构表示. Java对象结构 一个Java对象在Heap的表示,可以分为三部分: Object Heade ...

  5. 32M内存 跑linux内核,32位Linux单进程4G内存限制

    可用下面代码测试系统能给单进程分配多少用户态内存: 1 #include 2 #include 3 4 int main(){ 5   int MB = 0; 6   while(malloc(1 & ...

  6. java堆是gc管理_JVM内存管理及GC机制

    一.概述 JavaGC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和 ...

  7. xp系统支持64g内存_让32位XP支持64G内存

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 代码: int __usercall MiCheckPaeLicense(PLOADER_PARAMETER_BLOCK LoaderBlock){ En ...

  8. Readyfor4GB帮你的32位Win7用4G内存

    虽然现在64位操作系统可以很好的支持大容量内存,但是由于以前少数的软件不能运行在64位的WIN7上,不管多少,毕竟不爽,所以我还是偏爱使用32位的Windows7,课时由于微软当初设置操作系统的时候, ...

  9. 32位汇编基础_内存_每个应用进程都会有自己独立的4GB内存空间

    1.每个应用进程都会有自己独立的4GB内存空间 这句话很多人听起来可能会很矛盾很不解. 例如,我的电脑只有2GB的内存,打开个软件机会占用4GB内存,而我的电脑内存只有2GB,显然不够用,但是为什么程 ...

最新文章

  1. 智能医疗战场 人工智能如何赋能健康智能终端?
  2. 北斗词卡(三):带你了解北斗相关的国际组织缩写
  3. PowerDesigner建立UML序列图
  4. 节点身份认证(1)DID(Decentralized Identity)系统
  5. php psr4 控制器调用模型,控制器中调用模型添加数据
  6. 【Homework】说出 == 和 equals 的区别
  7. mysql8 安装_MySQL8.x安装使用
  8. arm linux sms,基于arm处理器的手机短消息加密系统 encryption system for sms based on arm.pdf...
  9. Ubuntu上安装OpenGL
  10. 给定一个序列,判断该序列是否为二叉树查找树的后序遍历序列
  11. 需求调研中要注意的三点
  12. 张志华 统计机器学习
  13. Allegro PCB设计中Etch层走线阻焊开窗的一种方法
  14. 数格子算面积的方法_“数方格”是笨方法吗?
  15. AutoFill 自动填充生长动画插件
  16. pygame功能--pygame.cursors鼠标模块
  17. Java5分钟制作海报
  18. sqlserver 2012 序列号
  19. 用懊悔法学习吴恩达机器学习【1】
  20. 保密工作人人有责——企业保密管理工作实务--闻方老师

热门文章

  1. 爬取websocket(ws)数据1
  2. 你知道么?这29个微信表情默默消失了
  3. 变频电源故障:变频电源IGBT烧坏的原因是什么
  4. YYHS-吴传之火烧连营(梦回三国系列T3)(trie树)
  5. 武汉大学计算机专业博士导师,武汉大学计算机学院博士生导师简介:袁志勇
  6. 解职场困惑不必东奔西走,Leo这里应有尽有(更新至09年8月31日)——Leo文章索引
  7. 修改Mysql57的root密码
  8. 活体检测论文研读六:Searching Central Difference Convolutional Networks for Face Anti-Spoofing
  9. Android高仿iOS Messages聊天气泡
  10. VNote v2.7.1 绿色版下载