美文网首页
java内存参数对齐问题

java内存参数对齐问题

作者: allanYan | 来源:发表于2016-11-07 13:52 被阅读0次

最近在做JVM调优时发现个问题,感觉比较有趣,特记录下:
JVM参数配置:

-Xms2048m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintTenuringDistribution 

GC日志为

12083.607: [GC12083.607: [ParNew Desired survivor size 35782656 bytes, new threshold 6 (max 6)
- age   1:     186216 bytes,     186216 total
- age   2:       2328 bytes,     188544 total
- age   3:      21888 bytes,     210432 total
- age   4:      63880 bytes,     274312 total
- age   5:      63280 bytes,     337592 total
- age   6:   10588168 bytes,   10925760 total
: 574751K->15677K(629120K), 0.0072360 secs] 603265K->44191K(2027264K), 0.0074590 secs] [Times: user=0.12 sys=0.00, real=0.00 secs] 

我们都知道默认情况下

  1. NewRatio=2,NewRatio=Old/Yong=Old/(Eden+Survivor*2)
  2. SurvivorRatio=8,SurvivorRatio=Eden/Survivor
  3. TargetSurvivorRatio=0.5

根据上面的配置,Survivor的大小为 204810241024/3/10bytes=71582789,而日志中的 Desired survivor size(DSS)=SurvivorTargetSurvivorRatio=35782656,可以推算出Survivor=357826562=71565312,可以看到两个结果存在差异,那么原因在哪呢?
查看JVM的源码发现Survivor大小是这么计算的:

size_t compute_survivor_size(size_t gen_size, size_t alignment) const {
    size_t n = gen_size / (SurvivorRatio + 2);
    return n > alignment ? align_size_down(n, alignment) : alignment;
  }

#define align_size_down_(size, alignment) ((size) & ~((alignment) - 1))

enum SomePublicConstants {
    // Generations are GenGrain-aligned and have size that are multiples of
    // GenGrain.
    // Note: on ARM we add 1 bit for card_table_base to be properly aligned
    // (we expect its low byte to be zero - see implementation of post_barrier)
    LogOfGenGrain = 16 ARM_ONLY(+1),
    GenGrain = 1 << LogOfGenGrain
  };

原来计算survivor大小时,需要进行对齐操作;

71582789&~((1<<16)-1)=71565312

相关文章

  • java内存参数对齐问题

    最近在做JVM调优时发现个问题,感觉比较有趣,特记录下:JVM参数配置: GC日志为 我们都知道默认情况下 New...

  • 内存对齐

    本次主要讨论三个问题: 什么是内存对齐 内存对齐的好处 如何对齐 内存对齐 内存对齐是一种提高内存访问速度的策略。...

  • 结构体内存对齐

    对象内存对齐 探讨的问题 1.什么是内存对齐?2.为什么要做内存对齐?3.结构体内存对齐规则4.源码内存对齐算法 ...

  • 内存对齐问题

    为什么要内存对齐 1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某...

  • C/C++内存对齐

    在面试或工作中,经常会遇到内存对齐的问题。这里结合我的理解谈一谈对内存对齐的理解。 1. 为什么要内存对齐,不对齐...

  • iOS底层之内存对齐算法解析

    目前但凡一个iOS岗面试都会问个内存对齐问题,那么什么是字节对齐?成员变量对齐和对象内存对齐有什么区别?今天我来为...

  • 2.iOS底层学习之内存对齐

    学习了内存对齐之后的疑问?? 1.为啥要内存对齐?2.内存对齐的规则?3.内存对齐实例分析。 内存对齐的目的 上网...

  • sizeof与字节对齐

    参考 【面试题】sizeof引发的血案编译器与字节对齐c 语言字节对齐问题详解C/C++内存对齐内存存取粒度C和C...

  • #pragma pack(push,1)与#pragma pac

    这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式。 #...

  • Golang 内存对齐问题

    什么是内存对齐? CPU把内存当成是一块一块的,块的大小可以是2,4,8,16字节大小,因此CPU在读取内存时是一...

网友评论

      本文标题:java内存参数对齐问题

      本文链接:https://www.haomeiwen.com/subject/zrlouttx.html