使用PretenureSizeThreshold可以进入指定进入老年代的对象大小,-XX:MaxTenuringThreshold这个对象经历多少次GC不被释放才会进入到老年代,PretenuredSizeThreshold多大的对象是直接进入老年代,比如我设置1M,如果你超过1M的大小,那我直接给他放在老年代,是可以这么去做的,但是要注意TLAB是有限分配空间,这个参数虽然可以指定这个对象多大才可以直接进入老年代

首先我们看一下刚才配置的参数是什么意思,我的上限是1K,如果是大于1K就直接给你扔到老年代了,就不在新生代玩了,然后最大初始化都是30M,用串行垃圾收集器,打印GC的详细信息,然后你的对象大于1K,就直接扔到老年代,new一个map,然后for循环多少次,我要for循环,循环了5*1024次,然后每次去申请1M的内存,1K肯定是大于1000的也就是我这么多次循环,按理来说,这么大的数据应该直接分配到老年代,老年代used了0%,基本都分配在新生代里了,这一块有一个概念,其实我们现在开启了一个线程,就是咱们的main线程,TLAB区会优先分配内存TLAB区域全称叫做Thread Local Allocation Buffer,是本地分配的缓存,主线程本地分配缓存的东西,从名字上来看,是一个线程专用的内存分配区域,每个内存都有TLAB区,JAVA的JDK会有一个优化的动作,会在线程启动的时候先配一块独立的内存空间,这个空间当时没有明确的去说,我说了你也不知道是干啥的,先让你们有一个概念就完事了,现在我跟你们说,这个空间就是TLAB,线程启动了就会有这么一个空间,来帮你做一系列的事情,帮你做优化,这个就是Thread Local Allocation Buffer,它是为了加速对象分配而产生的,或者说提高线程的性能,每个线程都会产生TLABE区,然后该线程独享的工作区域,JAVA虚拟机使用这个中TLAB区来避免多线程冲突问题,提高了对象分配的效率,也提高了线程的性能,不要每次去取数据都去主内存去加载,直接在我的内存中间做就可以TLAB区一般不会特别大,当大对象无法在TLAB区的时候,才会去分配到堆上.这是JAVA的堆heap,当线程启动的时候会有一个TLAB区,一般杀鸡不用宰牛刀,小对象我直接扔到TLAB玩就是了,太大了分配不了了我就直接放在堆中,放在Eden区,放在s0和s1区,放在老年代,默认JDK是使用TLAB区的
-XX:+UseTLAB 使用TLAB-XX:+TLABSize 设置TLAB的大小线程启动的时候我们给TLAB分配10M,这块还有一个特性,一般TLAB区是不需要你做任何事的,这个参数默认是有的,设置维护进入TLAB空间的单个对象的大小,我们有一个对象到底是进入JAVA堆这里,还是进入线程TLAB区中,它这个参数维护的,它是一个比值,默认是存在的,也就是整个对象如果大于1/64的话,比如我给你分配64M,整个的大小是64M,然后我的这个数据是1.1M,那这个数据就不会分配到TLAB中,而是直接放在heapJAVA堆中,新生代的Eden区,这个比值是可以设置的,-XX:+PrintTLAB查看TLAB详细信息,-XX:ResizeLAB 自动去调整TLABRefillWasterFraction的阀值,其实这些东西都是JVM提供的,不需要做任何操作,其实就是你写代码的时候你什么都不用干,不管这件事,但是如果有实际上的工作,如果有需求的话,如果你做一个比较核心的业务模块,如果你做涉及到转账的业务,这些东西你就不得不用一下,能提高一些性能,自动调节阀值,刚才的原因无非是因为不到1K的东西太小了,它会在我线程直接启动的时候,直接进入到TLAB中了,所以我们看到老年代的参数,怎么去起到作用呢,我们加上最后1行话

-XX:-UseTLAB,注意这里前面是减号,前面已经说了加号表示启用,减号表示禁用,禁用TLAB区,强制把数据都分配到老年代,那这回我们看到了

当然这不是绝对的,大部分的数据确实都进入到了老年代了,只有非常非常细微不到1M的数据不是绝对的对象创建的流程图非常细粒度的流程图,用new关键字去实例化的时候,首先在栈上分配,是一个比TLAB区更提前的一个概念,这个就是保存在JAVA的Stack上了,这个使用temp变量可能会放在栈上分配,如果满足我就放在栈上,如果失败我就尝试放在TLAB区,满足就放在TLAB区,如果还是不满足,判断对象是否能进入老年代,因为这边是把TLAB区禁用了之后,它往右边走,去判断-XX:PretenuredSizeThreshold=1000这个值看有没有超过1000,超过1000就直接进入老年代,就不往新生代放了,最后整个都失败,才放入到eden区,它是一个很细粒度的流程

没有禁用TLAB,他就就放在新生代里了,因为TLAB也是基于内存的,你得通过-XX:PrintTLAB去打印才能看的出来

使用TLAB区,加速我的方法的调用,然后这里面有PrintTLAB,然后加上PrintGC,然后给TLAB声明一个大小,差不多100K,这个参数是自动调整大小,-XX:DoEscapeAnalysis 这是一个系统级的逃逸分析参数,你只有把它禁用了之后它才能打印出来,TLAB这个东西是线程独有的,通过普通的JVM是看不出来效果的,因为JVM设计到很多的东西,它都是默认开启了,有些东西你是需要禁用的,TLAB默认是启动的,逃逸分析参数是别把内核的东西给屏蔽掉了,它这个词本身就是禁用,然后设置减号就是关闭逃逸信息

现在是把逃逸信息给加上了

这个时候你就可以看到TLAB信息的打印了,其实这里面的参数可读性是挺复杂的,你可以找找资料,总之最后我们把逃逸信息给禁用之后,就能看到这个结果了,如果你把这个去掉了,就看不到了TLAB的详细信息了,它可能更快了,因为你开启了优化可能就更快了,但是你看不到TLAB分配空间的信息,因为他是系统内核级的,他是线程内核级的,所以说你要看到的话,正常工作的话你都不要看到这些参数,配置这些参数反而性能降下去了,但是你要是看到详细信息你就可以把它加上,这过程就可以看到打印的耗时

如果你把TLAB区禁用的话,就是设置减,线程会向主内存去加载一些数据,相对来说就比较耗时

这块就是独立的线程内存空间,是对我们线程优化是很好的,其实本质也是属于堆一块的,其实这里是一个,逻辑的概念,并不是一个物理的概念,为什么分配到Eden区里了,它是一个逻辑的概念,并不是一个屋里的概念,物理的概念就是堆,无论是新生代还是老年代,反正都是堆空间,计算你开启一个线程,你去运行,那也是用到了JAVA里的堆了,TLAB只是一个逻辑的概念,并不是说我这里有一个TLAB区,它是当线程启动的时候,JVM才会给他一块区域,这块区域叫TLAB,这个是一个逻辑的概念

jvm_垃圾收集算法讲解(二)相关推荐

  1. jvm_垃圾收集算法讲解(一)

    GC本质上就是垃圾回收的概念,而是JVM帮你去做这个事情,刚才我们看的代码是rabbitmq内部帮你实现的主从选举包括投票,包括分发,包括连接重新建,但是如果后期我们讲RocketMQ,或者是KAFK ...

  2. MP算法与OMP算法讲解二

    转自:http://blog.csdn.net/scucj/article/details/7467955 主要介绍MP(Matching Pursuits)算法和OMP(Orthogonal Mat ...

  3. 深入理解JVM(二)--垃圾收集算法

    一. 概述 说起垃圾收集(Garbage Collection, GC), 大部分人都把这项技术当做Java语言的伴随生产物. 事实上, GC的历史远远比Java久远, 1960年 诞生于MIT的Li ...

  4. 深入理解Java虚拟机(二):Java内存回收及垃圾收集算法

    Java内存回收 & 垃圾收集算法 & 垃圾收集器 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 本文重点: 二.对象已死 ...

  5. 细说JVM系列:自动内存管理内存回收:垃圾收集理论-垃圾收集算法

    垃圾收集理论-垃圾收集算法 这里主要讲解垃圾收集理论上的算法,下一篇会介绍一些实现了这些算法的垃圾收集器. 一般我们谈垃圾收集从三个问题来帮你理解jvm的垃圾收集策略: 1.怎么判断哪些内存是垃圾? ...

  6. JVM之垃圾收集算法和垃圾收集器详解

    这篇文章相比上一篇记录性的,多了不少我自己的理解,花费了很大的功夫整理,如果有时间和精力建议好好看一看深入理解JVM这本书. 也建议熟读背诵. JVM-垃圾收集器和内存分配策略 程序计数器.虚拟机栈. ...

  7. Java虚拟机垃圾收集算法

    1.标记-清除算法 标记-清除算法分为 "标记" 和 "清除" 两个步骤:首先标记出所有需要回收的对象,然后在标记完成后统一回收所有被标记的对象,是垃圾收集算法 ...

  8. 干货回顾丨机器学习笔记-----AP(affinity propagat)算法讲解及matlab实现

    在统计和数据挖掘中,亲和传播(AP)是基于数据点之间"消息传递"概念的聚类算法.与诸如k-means或k-medoids的聚类算法不同,亲和传播不需要在运行算法之前确定或估计聚类的 ...

  9. Learning to Rank 中Listwise关于ListNet算法讲解及实现

     [学习排序] Learning to Rank 中Listwise关于ListNet算法讲解及实现             版权声明:本文为博主原创文章,转载请注明CSDN博客源地址!共同学习, ...

最新文章

  1. android json mysql_Android通过json向MySQL中读写数据的方法详解【写入篇】
  2. pca图解读_干货!手把手一步一步解读PCA分析,逃学博士尽力了!
  3. 英语四级真题作文 计算机,2019年12月英语四级写作范文:电脑
  4. ​iPhone 13或有日落金玫瑰金配色;传阿里巴巴和腾讯考虑互相开放生态系统;抖音内测“心动外卖”|极客头条...
  5. 阿里云服务器如何进行网站域名解析?
  6. [WebApp开发]基础教程-Web App开发入门
  7. Android手机截图命令screencap
  8. Intel CPU平台和架构介绍
  9. 学科实践活动感悟50字_社会实践感悟50字_寒假社会实践感悟
  10. 清空H3C交换机CF存储回收站空间
  11. 迭代最小二乘拟合椭圆
  12. 2021年茶艺师(初级)考试资料及茶艺师(初级)考试技巧
  13. macOS卸载Karabiner-Elements
  14. MYSQL的下载与配置安装
  15. Max OS 打开 JD-GUI 报错
  16. 华为视频会议终端8000、9000系列取名有什么含义?
  17. html5怎么设置表单居中显示图片,如何将html5中的图片设置居中?图片居中的代码!...
  18. PyGame弹珠游戏双人粗略版
  19. Lodop中页眉页脚的实现
  20. 系统中计算机应用上机,管理系统中计算机应用上机题

热门文章

  1. golang 新手练习 go语言 10分钟练习贴
  2. JavaScript实现表单的分向提交
  3. 【Java线程】Thread Runnable必知必会
  4. Linux - 修改Cent OS系统的的hostname、配置DNS映射
  5. Struts初步知识
  6. 面试题:实现call、apply、bind
  7. [2019.3.4]BZOJ1213 [HNOI2004]高精度开根
  8. 贪吃蛇系列之一——引入
  9. Windows Azure 真实案例:CCH 财政服务独立软件开发商(ISV)通过托管服务获得了灵活性并节省成本...
  10. 好朋友简简单单,好情谊清清爽爽,好缘份久久长长