ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

夜光带你走进Java架构师必备知识点(6)高级程序员

2019-08-26 21:42:50  阅读:203  来源: 互联网

标签:知识点 Java G1 回收 xx 垃圾 串行 架构师 CMS


夜光序言:

 

 

愿以我百年孤独,千难万阻,换取你来生安度,无忧如初。

 

 

 

 

 

 

 

 

正文:嗯唔~~

14.TLAB

TLAB全称是ThreadLocalAllocationBuffer,即线程本地分配缓存,是一个线程专用的内存分配区域,是为了加速对象分配而生的,每一个线程都会产生一个TLAB区来避免多线程冲突问题,提高了对象分配的效率,TLAB空间一般不会太大,当大对象无法在TLAB分配时,则会直接分配到堆上。

-xx:+useTLAB :使用TLAB

-xx:+TLABSize :设置TLAB大小

-xx:+TLABRefillWasteFraction :设置维护进入TLAB空间的单个对象大小,它是一个比例值,默认64,即如果对象大于整个空间的1/64,则在堆创建对象。

-xx:+PrintTLAB :查看TLAB信息

-xx:+ResizeTLAB :自调整TLABRefillWasteFraction阀值

 

 


15.对象的创建流程

 

一个对象创建在什么位置,JVM会有一个比较细节的流程,根据数据的大小、参数的设置决定如何创建分配以及其位置。

 

 


16.垃圾收集器

 

在java虚拟机中,垃圾回收器有:串行垃圾回收器、并行垃圾回收器、CMS回收器、G1回收器。

1.串行回收器:

是指使用单线程进行垃圾回收的回收器,每次回收时,串行回收器只有一个工作线程,对与并行能力较弱的计算机来说,串行回收器的专注性和独占性往往有更好的性能表现,串行回收器可以在新生代和老年代使用,根据作用用于不同的堆空间,分为新生代串行回收器和老年代串行回收器。

使用-xx:+UseSerialGC参数可以设置使用新生代串行回收器和老年代串行回收器。

 

 


2.并行回收器:

并行回收器在串行回收器基础上做了改进,可以使用多个线程同时进行垃圾回收,对于计算机能力强的计算机可以有效的缩短垃圾回收所需要的实际时间。

1).parNew回收器:是一个工作在新生代的垃圾回收器,只是简单的将串行回收器多线程化,回收策略和算法和串行回收器一样。

使用-xx:+UseParNewGC 新生代parNew回收器,老年代则使用串行回收器,parNew回收器工作时的线程数量可以使用-xx:ParallelGCThreads参数指定,一般最好和计算机的CPU相当,避免过多的线程影响性能。

2).parallelGC回收器:新生代parallelGC回收器使用了复制算法的收集器,也是多线程独占形式的收集器,但parallelGC回收器重要的特点是非常关注系统的吞吐量,提供了两个非常关键的参数控制系统的吞吐量:

-xx:MaxGCPauseMills :设置最大垃圾收集停顿时间,可以把虚拟机在GC停顿时间控制在MaxGCPauseMillis范围内,如果希望减少GC停顿时间可以将MaxGCPauseMillis设置的很小,但是会导致GC频繁,从而增加了GC的总时间,降低了吞吐量,所以需要根据实际情况设置该值。

-xx:GCTimeRatio :设置吞吐量大小,它是从0到100之间的整数,默认情况下它的的取值为99,那么系统花费不超过1/(1+n)的时间用于垃圾回收,也就是1/(1+99)=1%的时间。

-xx:+UseAdaptiveSizePolity :打开自适应模式,在这种模式下新生代的大小、Eden、from/to的比例,以及晋升老年代的对象年龄参数会被自动调整,以达到在堆的大小、吞吐量和停顿时间之间的平衡点。

3).parallelOldGc:老年代parallelOldGC回收器也是一种多线程回收器,和新生代的parallelGC一样,也是一种关注吞吐量的回收器,使用了标记压缩算法实现。

-xx:+UseParallelOldGC :进行配置

-xx:+UseParallelGCThreads:设置垃圾收集时的线程数量

 

 


3.CMS回收器

 

CMS全程为:ConcurrentMarkSweep,并发标记清除,使用的是标记清除法,主要关注系统停顿时间。

使用-xx:+UseConcMarkSweepGC进行配置

使用-xx:ConcGCThreads设置并发线程数量

CMS并不是独占回收器,CMS在回收的过程中,应用程序仍然在不停的工作,又会有新的垃圾不断的产生,所以在使用CMS的过程中应该确保应用程序的内存足够可用,CMS不会等到应用程序饱和的时候才回收垃圾,而是在某一阀值的时候开始回收,回收阀值可用指定的参数进行配置,

-xx:CMSInitiatingOccupancyFraction来指定,默认为68,当老年代的空间使用率达到68%时,会执行CMS回收,如果内存使用率增长的很快,在执行的过程中,已经出现了内存不足的情况此时CMS回收就会失败,虚拟机将启动老年代串行回收器进行垃圾回收,这会导致应用程序中断,直到垃圾回收完成后才会正常工作,

这个过程GC停顿的时间可能较长,所以使用-xx:CMSInitiatingOccupancyFraction的设置要根据实际的情况。

标记清除法有个缺点就是存在内存碎片问题,那么CMS有个参数设置-xx:+UseCMSCompactAtFullConllection可以使CMS回收完成后进行一次碎片清理,-xx:+CMSfullGCsBeforeCompaction参数可以设置进行多次CMS回收之后,对内存进行一次压缩。

 

 


4.G1回收器

 

G1回收器(Garbage-First)在JDK1.7中提出的回收器,目标是为了取代CMS回收器,G1回收器拥有独特的垃圾回收策略,G1属于分代垃圾回收器,区分新生代和老年代,依然有Eden和from/to区,并不要求整个Eden区或者新生代、老年代的空间连续,使用了分区算法

并行性:G1回收期间可多线程同时工作

并发性:G1拥有与应用程序交替执行能力,部分工作可与应用程序同时执行,在整个GC期间不会完全阻塞应用程序

分代GC:G1依然是一个分代收集器,它是一个兼顾新生代和老年代一起工作。

空间整理:G1在回收过程中,不会像CMS那样若干次GC后需要进行碎片整理,G1采用了有效复制对象的方式减少空间碎片

可预见性:由于分区的原因,G1可以只选取部分区域进行回收,缩小了回收的范围,提高性能。

使用-xx:+UseG1GC应用G1收集器

使用-xx:+MaxGCPauseMills指定最大停顿时间

使用-xx:+ParallelGCThreads设置并行回收的线程数量

 

标签:知识点,Java,G1,回收,xx,垃圾,串行,架构师,CMS
来源: https://blog.csdn.net/weixin_41987706/article/details/100003684

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有