![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
堆
文章平均质量分 50
隐0士
这个作者很懒,什么都没留下…
展开
-
minor GC、Major GC、Full GC区别
hotspot vm的gc分为部分收集和整堆收集。 部分收集 新生代收集:minorGC又称YoungGC,只是对Eden和S0,S1回收,只有Eden满的时候才会引发GC,GC就会引发STW(stop the world),虽然GC很频繁,但是回收速度很快,因此总的来说不会太影响用户线程。 老年代收集:Major GC/Old GC,只有CMS GC会有单独收集老年代的行为,这里需要注意的是很容易和full GC混淆,主要区分就是是不是专门回收老年代 混合收集:Mixed GC,收集整个新生代以及部分老原创 2021-10-31 15:38:49 · 339 阅读 · 0 评论 -
线程本地分配缓存TLAB
概念 为了避免一系列的非线程安全问题,同时还能提升内存分配的吞吐量,它是在eden空间进行分配的,每个线程都有一个缓冲区域,空间只有Eden的1%,可以通过-XX:UseTLAB来配置是否开启tlab(默认是开启的),通过-XX:TLABWasteTargetPercent来设置TLAB空间所占用Eden空间的百分比大小。 为什么需要tlab 在jvm中堆区是共享的区域,一旦在并发环境下从堆中划分内存空间,就可能会遇到分配到同一个内存地址的问题,为了避免多个线程操作同一个地址,就需要使用加锁等机制,但这会影原创 2021-10-31 15:31:36 · 389 阅读 · 0 评论 -
堆内存分配策略
1,对象优先进新生代 2,大对象(等于或超过了伊甸园和幸存者区大小)直接放进老年代 3,长时间存活的对象(默认gc超过15次还存活的对象,可以通过-XX: MaxTenuringThreshold设置)分配到老年代 4,动态对象年龄判断:如果幸存者区中的相同年龄的所有对象大小大于幸存者区的一半,也大于或等于此年龄大小的对象可以直接进入老年代,不需要经过MaxTenuringThreshold的判断。 ...原创 2021-10-31 15:28:14 · 129 阅读 · 0 评论 -
堆空间的常用参数
-XX:printFlagsInitial:查看所有的参数默认初始值 -XX:printFlagsFinal:查看所有参数的最终值(可能会存在修改的值,这里打印的是最终值) -xms:堆空间的初始值大小,默认为内存的1/64 -xmx:对空间的最大大小,为内存的1/4 -xmn:设置新生代的大小 -XX:NewRatio:设置新生代和老年代的占比,默认为1:2,也就是值为2 -XX:SurvivorRatio:设置新生代Eden和s0/s1的占比,默认为是8:1:1,也就是值为8 -XX:MaxTenuri原创 2021-10-31 15:26:40 · 219 阅读 · 0 评论 -
堆是分配对象的唯一选择之逃逸分析
逃逸分析概念 随着jtl编译器的发展,与逃逸分析技术的逐渐成熟,栈上分配,标量替换优化技术将会导致对象分配到堆上的这个结论变得不是那么地绝对了,如果经过逃逸分析后,一个对象并没有逃逸出方法,那么就有可能被优化成站上分配,而判断一个对象是否逃逸则是通过判断该对象是否有可能在方法外使用。 逃逸分析是一种 有效减少java程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。 逃逸分析开关 默认是开启的,但可以通过参数-XX:+DoEscapeAnalysis进行开启关闭 逃逸分析场景分析 package c原创 2021-10-31 15:20:29 · 102 阅读 · 0 评论 -
jvm堆中对象分配过程
对象分配的顺序 伊甸园->幸存者s0->幸存者s1->幸存者s0->幸存者s1(反复多次后)->老年代 需要注意的点: 生存区0不会主动产生minor gc,而是在伊甸园满时产生gc,gc的目标是伊甸园和幸存者区。 针对幸存者s0和s1区的总结是:两者复制之后有交换,谁空谁就会变成to(有没有可能都不为空) 幸存者区的对象15次之后就会晋升到老年代,这个次数也可以通过参数配置 老年代的对象只有在内存不足时,才会触发 majorgc进行清理 关于垃圾回收:会频繁在新生区收集,很原创 2021-10-30 18:00:29 · 166 阅读 · 0 评论 -
堆中的新生代和老年代
概述 在堆存放的对象中,主要分为两大类: 生命周期较短的瞬时对象,创建和消亡都非常迅速 生命周期非常长,甚至有和jvm保持一致的周期 在以上两种类型中,第一类对象占用的比例非常大,在jvm进行垃圾回收的时候,可以多关注第一类对象的回收,而第二类对象的回收可不必每次都关注,生命周期长的对象gc频率可以降低,为了效率考虑,jvm划分了新生代(又分为eden和survivor0空间和survivor1空间)和老年代两种内存区域,如下图所示: 一般来说几乎所有的java对象都是在新生代的eden区被创建的,然原创 2021-10-30 17:55:13 · 183 阅读 · 0 评论