转载请注明原创出处,谢谢!

问题

这个Xmn设置为1G,,我用jmap -heap 看,这个Eden From To怎么不是一个整8:1:1的关系呢?
我看内存分配还是没变,我Xmn1g,感觉From、To应该都是102.4M才对,现在是102.375M。

执行命令

jstat -gc pid 1s 1

结果:


发现很奇怪,的确和我们相信的不一样,我觉得只有源码可以告诉我们他做了啥。查看源码:

执行上面的例子代码

    public static void main(String[] args) {System.out.println(107374183&~((1<<16)-1));}

输出结果为:
107347968

104832*K* * 1024刚刚好等于107347968*B*


R大以前的回复:

从该信息中可以得到:Oracle/Sun JDK及OpenJDK里的HotSpot VM的话默认GC堆里的对象用8字节对齐。

java内存参数对齐问题

上面问题其实就是java内存参数对齐问题。那么为什么需要java内存参数对齐问题?

内存对齐(Data Structure Alignment)是什么?

内存对齐,或者说字节对齐,是一个数据类型所能存放的内存地址的属性(Alignment is a property of a memory address)。这个属性是一个无符号整数,并且这个整数必须是2的N次方(1、2、4、8、……、1024、……)。当我们说,一个数据类型的内存对齐为8时,意思就是指这个数据类型所定义出来的所有变量,其内存地址都是8的倍数。当一个基本数据类型(fundamental types)的对齐属性,和这个数据类型的大小相等时,这种对齐方式称作自然对齐(naturally aligned)。比如,一个4字节大小的int型数据,默认情况下它的字节对齐也是4。

为什么我们需要内存对齐?

这是因为,并不是每一个硬件平台都能够随便访问任意位置的内存的。

微软的MSDN里有这样一段话:

Many CPUs, such as those based on Alpha, IA-64, MIPS, and SuperH architectures, refuse to read misaligned data. When a program requests that one of these CPUs access data that is not aligned, the CPU enters an exception state and notifies the software that it cannot continue. On ARM, MIPS, and SH device platforms, for example, the operating system default is to give the application an exception notification when a misaligned access is requested.

大意是说,有不少平台的CPU,比如Alpha、IA-64、MIPS还有SuperH架构,若读取的数据是未对齐的(比如一个4字节的int在一个奇数内存地址上),将拒绝访问,或抛出硬件异常。

另外,在维基百科里也记载着如下内容:

Data alignment means putting the data at a memory offset equal to some multiple of the word size, which increases the system’s performance due to the way the CPU handles memory.

意思是,考虑到CPU处理内存的方式(32位的x86 CPU,一个时钟周期可以读取4个连续的内存单元,即4字节),使用字节对齐将会提高系统的性能(也就是CPU读取内存数据的效率。比如你一个int放在奇数内存位置上,想把这4个字节读出来,32位CPU就需要两次。但对齐之后一次就可以了)。


  • 需要字节对齐的根本原因在于CPU访问数据的效率问题。假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话需要访问两次内存,第一次取从0x00000002-0x00000003的一个short,第二次取从0x00000004-0x00000005的一个short然后组合得到所要的数据,如果变量在0x00000003地址上的话则要访问三次内存,第一次为char,第二次为short,第三次为char,然后组合得到整型数据。
  • 而如果变量在自然对齐位置上,则只要一次就可以取出数据。一些系统对对齐要求非常严格,比如sparc系统,如果取未对齐的数据会发生错误,而在x86上就不会出现错误,只是效率下降。
  • 各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。
  • 比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐,但其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。
  • 比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据。显然在读取效率上下降很多。
  • 另外字节对齐的作用不仅是==便于cpu快速访问==,同时合理的利用字节对齐可以==有效地节省存储空间==。
  • 也即CPU一次访问时,要么读0x01~0x04,要么读0x05~0x08…硬件不支持一次访问就读到0x02~0x05
  • 例:如果0x02~0x05存了一个int,读取这个int就需要先读0x01~0x04,留下0x02~0x04的内容,再读0x05~0x08,留下0x05的内容,两部分拼接起来才能得到那个int的值,这样读一个int就要两次内存访问,效率就低了


个人公众号

参考:
https://www.2cto.com/kf/201407/319682.html
http://blog.csdn.net/qq_25077833/article/details/53454958

JVM 菜鸟进阶高手之路十一(eden survivor分配问题)相关推荐

  1. JVM菜鸟进阶高手之路

    本文转载自公众号  匠心零度 问题现象 代码如下,使用 ParNew + Serial Old 回收器组合与使用 ParNew + CMS 回收器组合时,结果为什么差异如此之大 ? private s ...

  2. JVM 菜鸟进阶高手之路六(JVM每隔一小时执行一次Full GC)

    上次分析详细地址在:http://blog.csdn.net/lirenzuo/article/details/76257526 以为上次问题是rmi的问题就此结束了,但是问题并没有结束,其实本次问题 ...

  3. JVM菜鸟进阶高手之路十二(jdk9、JVM方面变化, 蹭热度)

    转载请注明原创出处,谢谢! 经过 4 次跳票,历经曲折的 Java 9 正式版终于发布了!今天看着到处都是jdk9发布了,新特性说明,心想这么好的蹭热度计划能错过嘛,哈哈,所以就发了这篇文章. 目前j ...

  4. java每隔一小时fullgc_JVM菜鸟进阶高手之路六(JVM每隔一小时执行一次Full GC)

    以为上次问题是rmi的问题就此结束了,但是问题并没有结束,其实本次问题不是rmi问题导致的,但是rmi也的确可能会有sys.gc fullgc问题. 查看GC统计汇总情况: jstat -gcutil ...

  5. 菜鸟进阶高手, 推荐 7 个 Python 上手实战项目

    作为一个语法简洁.有着丰富的第三方库的编程语言,Python 上手极为简单,短时间内就可以让你编写出能够解决实际问题的小程序,甚至去面试初级 Python 工程师的职位. 不过,如果要写出一些更复杂的 ...

  6. 大数据新手的0基础学习路线,从菜鸟到高手的成长之路

    大数据作为一个新兴的热门行业,吸引了很多人,但是对于大数据新手来说,按照什么路线去学习,才能够学习好大数据,实现从大数据菜鸟到高手的转变.这是很多想要学习大数据的朋友们想要了解的. 今天我们就来和大家 ...

  7. E71从菜鸟到高手进阶—软件安装篇 转帖

    E71从菜鸟到高手进阶-软件安装篇 1.软件安装的方法 ①手机用数据线连接电脑后用pc套件安装sisx/jar程序:(注意:JAR文件不用解压可直接安装,保证JAR的文件名为英文,否者会出错) ② 把 ...

  8. Rust语言:元编程,强大的宏系统,菜鸟到高手进阶的必经之路

    Rust语言:元编程,强大的宏系统,菜鸟到高手进阶的必经之路 编程语言的宏操作,在C和C++早期就已经存在.宏可以将重复的代码用更简短的宏函数替换,编译过程中再展开,使得代码编写的更简洁. Rust提 ...

  9. 以“有用”为圆心:重新认识智慧城市的“高手之路”

    最近一段时间,疫情又出现了反复.针对十一旅游造成的防疫压力,不少权威媒体提出需要加强疫情防控的精细化水平,用动态化.细节化的管理方式来提高防疫效率.面对游客量巨大与旅行中游客快速移动等特点,疫情防控的 ...

最新文章

  1. 大流量网站的底层系统架构
  2. 工业物联网发展环境加速形成 中国企业如何突围?
  3. ZOJ - 3228 Searching the String(AC自动机求不重复子串出现次数)
  4. 多维数组的行优先和列优先, 数据描述语言
  5. linux编码 form表单,Linux curl 模拟form表单提交信息和文件
  6. Linux安装中文字体_宋体
  7. 【LeetCode】剑指 Offer 11. 旋转数组的最小数字
  8. Lexical environments: ECMAScript implementation
  9. C语言 #和##的用法
  10. ccs安装多版本编译器离线_CCS编译器安装,DSP/BIOS安装
  11. H5商城与小程序商城哪个好_应该怎么选择_OctShop
  12. 令牌环访问控制的原理_通过Keycloak进行访问控制的级别,第1部分:令牌认证
  13. python 之免费ip代理池
  14. boost入门(一):boost简介
  15. 集群分布式存储-MFS
  16. CS61C Spring 2021——Project 3: CS61CPU要求及实现思路
  17. Ubuntu系统下MRIcroN、FSL6.0.5、Freesurfer7.1.1、ANTs、MRtrix3、AFNI的安装详解——核磁共振数据处理必备
  18. 关于联想笔记本无线网老是掉线的解决方法
  19. iOS 史上最全App上架流程分享
  20. 笔记本高分屏字体模糊_高分屏字体模糊win10怎么办_Win10系统高分屏字体模糊解决方法...

热门文章

  1. 11月1日到11月14日的成果
  2. YOLACT实时实例分割
  3. 《实时控制软件设计》第一次阅读笔记
  4. 2-12 输出华氏-摄氏温度转换表 (15 分)
  5. 基于游戏付费数据,对战数据分析
  6. 阿里云携手爱迪德,发布中国首个云端DRM解决方案
  7. 麒麟 嵌入式linux操作系统_体验了一下北韩操作系统RedStar红星OS;国产linux优麒麟...
  8. 【研究生】这六种引用参考文献的行为,居然属于学术不端?
  9. will not be exported or published. Runtime ClassNotFoundExceptions may result.
  10. 树莓派初次开机配置教程