80-阈值和垃圾收集器类型对于对象分配的影响实战分析

阈值和垃圾收集器类型对于对象分配的影响实战分析

//打印JVM的一些默认参数
C:\***\***>java -XX:+PrintCommandLineFlags -version

-XX:InitialHeapSize=199142400           //初始的堆大小
-XX:MaxHeapSize=3186278400              //堆最大容量
-XX:+PrintCommandLineFlags              //打印命令行的相关启动信息
-XX:+UseCompressedClassPointers         //使用压缩的类指针
-XX:+UseCompressedOops 				//从32位的虚拟机上迁移到64位的虚拟机上,会对指针进行相应的压缩处理
-XX:-UseLargePagesIndividualAllocation  // 什么意思?
-XX:+UseParallelGC							 //决定了新生代、老年代使用什么样的垃圾收集器
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

参数设置:

//(1)当新创建的对象的大小已经超过了PretenureSizeThreshold这个阈值,那么就不会在新生代去创建,而直接在老年代进行内存的分配
//(2)PretenureSizeThreshold要搭配的是串行收集器(单线程收集器serial)
-XX:PretenureSizeThreshold=4194304  //4M
//虚拟机运行在Client模式下的默认值,打开此开关后,使用Serial+Serial Old的收集器组合进行内存回收
-XX:+UseSerialGC                    
实例:
-verbose:gc
-Xms20M
-Xmx20M
-Xmn10M
-XX:+PrintGCDetails
-XX:SurvivorRatio=8
-XX:PretenureSizeThreshold=4194304  //4M
-XX:+UseSerialGC

public class MyTest2 {
    public static void main(String[] args) {
        int size = 1024 * 1024;
        byte[] myAlloc = new byte[5 * size];
    }
}
// 下面的运行结果可以,在设置了阈值为4M之后,由于myAlloc的字节数位5M,所以直接进入到了老年代used 5120K
// def new generation
// tenured generation

运行结果:
Heap
 def new generation   total 9216K, used 5249K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)
  eden space 8192K,  64% used [0x00000000fec00000, 0x00000000ff120618, 0x00000000ff400000)
  from space 1024K,   0% used [0x00000000ff400000, 0x00000000ff400000, 0x00000000ff500000)
  to   space 1024K,   0% used [0x00000000ff500000, 0x00000000ff500000, 0x00000000ff600000)
 tenured generation   total 10240K, used 5120K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)
   the space 10240K,  50% used [0x00000000ff600000, 0x00000000ffb00010, 0x00000000ffb00200, 0x0000000100000000)
 Metaspace       used 3314K, capacity 4568K, committed 4864K, reserved 1056768K
  class space    used 361K, capacity 392K, committed 512K, reserved 1048576K

这里出现一个问题:

​ 在阈值还是4M,将参数-XX:+UseSerialGC去掉之后,byte[] myAlloc = new byte[5 * size],张龙老师中的运行结果是: used OK,老年代没有生效,但是我这里的运行结果是:可以在老年代中正常分配内存空间:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QE9qg96v-1590330441627)(G:\笔记\图片\1580366288925.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nGq4LS4r-1590330441632)(G:\笔记\图片\1580366538202.png)]

通过jvisualvm和jmc查看GC情况:

public class MyTest2 {
    public static void main(String[] args) {
        int size = 1024 * 1024;
        byte[] myAlloc = new byte[5 * size];
        try {
            Thread.sleep(100000);
        }catch (InterruptedException e){
            e.printStackTrace();;
        }
    }
}
  • 使用jvisualvm:【可以利用jvisualvm显示执行垃圾回收会执行一次System.gc()】

在这里插入图片描述

  • 使用jmc:可以看到当eden空间快要满的时候会执行一次gc

在这里插入图片描述

通过jmc和jcmd 查看启动参数:

  • 通过jmc查看:

在这里插入图片描述

  • 通过jcmd查看:【先通过jps -l查看端口号,再通过jcmd 11444 VM.flags查看相应的参数】
    在这里插入图片描述

  • 在jmc的飞行计数器中查看分配信息:
    在这里插入图片描述
    在这里插入图片描述

  • 下面这个是去掉-XX:+UseSerialGC这行参数所显示的:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z8dEEWc4-1590330441668)(G:\笔记\图片\1580368762368.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值