『编程』12000字 史上最最最完整深入解析JVM,请先收藏再看!( 五 )
A、抢占式中断:在GC发生时 , 首先把所有线程中断 , 如果发现有线程不在安全点上 , 就恢复线程 , 让它跑到安全点上 。
B、主动式中断:GC需要中断线程时 , 不直接对线程操作 , 仅仅设置一个标志 , 各个线程执行时主动去轮询这个标志 , 当发现中断标记为真就自己中断挂起 。 轮询标记的地方和安全点是重合的 。
(5)安全区域:一段代码片段中 , 对象的引用关系不会发生变化 , 在这个区域中任何地方开始GC都是安全的 。 在线程进入安全区域时 , 它首先标志自己已经进入安全区域 , 在这段时间里 , 当JVM发起GC时 , 就不用管进入安全区域的线程了 。 在线程将要离开安全区域时 , 它检查系统是否完成了GC过程 , 如果完成了 , 它就继续前行 。 否则 , 它就必须等待直到收到可以离开安全区域的信号 。
4、 GC时为什么要停顿所有Java线程?因为GC先进行可达性分析 。 可达性分析是判断GC Root对象到其他对象是否可达 , 假如分析过程中对象的引用关系在不断变化 , 分析结果的准确性就无法得到保证 。
5、 CMS收集器:(1)一种以获取最短回收停顿时间为目标的收集器 。 (2)一般用于互联网站或者B/S系统的服务端(3)基于标记-清除算法的实现 , 不过更为复杂 , 整个过程为4个步骤:
A、初始标记:标记GC Root能直接引用的对象
B、并发标记:利用多线程对每个GC Root对象进行tracing搜索 , 在堆中查找其下所有能关联到的对象 。
C、重新标记:为了修正并发标记期间 , 用户程序继续运作而导致标志产生变动的那一部分对象的标记记录 。
D、并发清除:利用多个线程对标记的对象进行清除
(4)由于耗时最长的并发标记和并发清除操作都是用户线程一起工作 , 所以总体来说 , CMS的内存回收工作是和用户线程一起并发执行的 。 (5)缺点:
A、对CPU资源占用比较多 。 可能因为占用一部分CPU资源导致应用程序响应变慢 。
B、CMS无法处理浮动垃圾 。 在并发清除阶段 , 用户程序继续运行 , 可能产生新的内存垃圾 , 这一部分垃圾出现在标记过程之后 , 因此 , CMS无法清除 。 这部分垃圾称为“浮动垃圾“
C、需要预留一部分内存 , 在垃圾回收时 , 给用户程序使用 。
D、基于标记-清除算法 , 容易产生大量内存碎片 , 导致full GC(full GC进行内存碎片的整理)
6、 对象头部分的内存布局:HotSpot的对象头分为两部分 , 第一部分用于存储对象自身的运行时数据 , 比如哈希码、GC分代年龄等 。 另外一部分用于指向方法区对象类型数据的指针 。
7、 偏向锁:偏向锁偏向于第一个获取它的线程 , 如果在接下来的执行过程 , 没有其他线程获取该锁 , 则持有偏向锁的线程永远不需要同步 。 (当一个线程获取偏向锁 , 它每次进入这个锁相关的同步块 , 虚拟机不在进行任何同步操作 。 当有另外一个线程尝试获取这个锁时 , 偏向模式宣告结束)
JVM优化:1、一般来说 , 当survivor区不够大或者占用量达到50% , 就会把一些对象放到老年区 。 通过设置合理的eden区 , survivor区及使用率 , 可以将年轻对象保存在年轻代 , 从而避免full GC , 使用-Xmn设置年轻代的大小
2、对于占用内存比较多的大对象 , 一般会选择在老年代分配内存 。 如果在年轻代给大对象分配内存 , 年轻代内存不够了 , 就要在eden区移动大量对象到老年代 , 然后这些移动的对象可能很快消亡 , 因此导致full GC 。 通过设置参数:-XX:PetenureSizeThreshold=1000000 , 单位为B , 标明对象大小超过1M时 , 在老年代(tenured)分配内存空间 。
3、一般情况下 , 年轻对象放在eden区 , 当第一次GC后 , 如果对象还存活 , 放到survivor区 , 此后 , 每GC一次 , 年龄增加1 , 当对象的年龄达到阈值 , 就被放到tenured老年区 。 这个阈值可以同构-XX:MaxTenuringThreshold设置 。 如果想让对象留在年轻代 , 可以设置比较大的阈值 。
- #石油#特朗普一句话 国际油价暴涨46% 史上单日最高涨幅
- 『前瞻网』后称:确实优惠了,“神秘买家”现身!4000万买下“淘宝史上最贵产品”
- 「千锋长沙」软件测试需要懂编程吗?,千锋全栈软件测试课程教程资源限时领
- 上观新闻:上海市民实测快递“史上最快”,骑手小哥亲眼目睹武汉一天天好起来
- 驱动之家:分创新高!华为 P40 Pro DxOMark 评分出炉:史上最强 没有之一,128
- #南方Plus客户端#开史上最大规模全球会议,联合国宣布用腾讯会议企业微信
- 小智雅汇@C|编程的一些前置知识及底层(计算机组成与汇编)了解
- 「Java」Java中的网络编程(一)
- Java@Java并发编程之支持并发的list集合你知道吗
- 科学家▲科学家“跑偏”后,于是有了史上5大“最傻发明”,5大伟大发明!