weixin_44089714 2021-05-06 09:17 采纳率: 16.7%
浏览 61

jvm新生代给10M E:S是8:1 为什么创建三个2M的数组时,新生代就占用了8000K+?

        /**
         * -XX:NewSize=10485760             新生代10M
         * -XX:MaxNewSize=10485760          最大新生代10M
         * -XX:InitialHeapSize=20971520     初始化堆内存20M
         * -XX:MaxHeapSize=20971520         最大堆内存20M
         * -XX:SurvivorRatio=8              eden和survivor比例8:1 (E区8M 每个S区1M)
         * -XX:MaxTenuringThreshold=15      s区超过15岁进入老年代
         * -XX:PretenureSizeThreshold=10485760      大对象10M
         * -XX:+UseParNewGC                 新生代使用ParNew
         * -XX:+UseConcMarkSweepGC          老年代使用CMS
         * -XX:+PrintGCDetails              打印详细GC日志
         * -XX:+PrintGCTimeStamps           GC日志带时间
         * -Xloggc:gc.log                   输出到本地文件
         */

byte[] array1 = new byte[2 * 1024 * 1024];
        array1 = new byte[2 * 1024 * 1024];
        array1 = new byte[2 * 1024 * 1024];
        array1 = null;

上面时我的jvm参数设置和运行的代码 GC日志如下

Java HotSpot(TM) 64-Bit Server VM (25.211-b12) for windows-amd64 JRE (1.8.0_211-b12), built on Apr  1 2019 20:53:26 by "java_re" with MS VC++ 10.0 (VS2010)
Memory: 4k page, physical 16695540k(11690332k free), swap 19185908k(12186860k free)
CommandLine flags: -XX:InitialHeapSize=20971520 -XX:MaxHeapSize=20971520 -XX:MaxNewSize=10485760 -XX:MaxTenuringThreshold=15 -XX:NewSize=10485760 -XX:OldPLABSize=16 -XX:PretenureSizeThreshold=10485760 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:SurvivorRatio=8 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:-UseLargePagesIndividualAllocation -XX:+UseParNewGC 
Heap
 par new generation   total 9216K, used 8192K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
  eden space 8192K, 100% used [0x00000000fec00000, 0x00000000ff400000, 0x00000000ff400000)
  from space 1024K,   0% used [0x00000000ff400000, 0x00000000ff400000, 0x00000000ff500000)
  to   space 1024K,   0% used [0x00000000ff500000, 0x00000000ff500000, 0x00000000ff600000)
 concurrent mark-sweep generation total 10240K, used 0K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
 Metaspace       used 3143K, capacity 4496K, committed 4864K, reserved 1056768K
  class space    used 343K, capacity 388K, committed 512K, reserved 1048576K

看到三个数组只有6M 但是jvm日志中显示新生代用了 8192K 请问为什么不是6M多一点?

  • 写回答

1条回答 默认 最新

  • 江湖是人情世故 2023-01-31 16:13
    关注

    新生代:老生带 1:2;新生代中E:S1:S2=8:1:1; 看你配置的新生代:老生代=1:1;
    你的s区都是1M,你的对象是2M,无法放下,会自动进入old;所以是共使用8000k+;
    途中显示total 9216K, used 8192K代表新生代所有的小格空间满了,不代表真实内存使用了所有(内存空间分配是把总内存分为N个小的内存方格,当内存空间的可用空间间隙不足以放入下一个对象时,就是100%使用)

    评论

报告相同问题?

悬赏问题

  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的