2021-03-15 08:55发布
JVM垃圾回收器有几种?
1.Serial收集器(新生代) (1)单线程收集器 (2)采用复制算法,用于新生代垃圾回收 (3)垃圾回收期间需要STW(Stop The World),STW表示垃圾回收线程不与用户线程并发执行2.Serial Old收集器(老年代) (1)与Serial相似 (2)采用标记整理算法,用于老年代的立即回收3.ParNew收集器(新生代) (1)是Serial的多线程版本 (2)除此之外与Serial收集相似4.Parallel Scavenge收集器(新生代) (1)基本功能与ParNew收集器相似 (2)区别在于该收集器是要达到一个可控制的吞吐量(吞吐量=运行用户代码的时间/(运行用户代码的时间)+(垃圾回收的时间)) (3)可以高效的利用cpu时间 (4)提供了参数可以精确的控制吞吐量,分别是控制最大垃圾回收停顿时间,也可以直接设置吞吐量大小5.Parallel Old收集器(老年代) (1)Parallel Scavenge收集器的老年代版本,采用标记整理算法6.CMS收集器(老年代) (1)采用标记清除算法,用户老年代的垃圾回收 (2)主要关注的是尽可能的缩短垃圾回收时用户线程的停顿时间 (3)主要有一下几个步骤: ①初始标记:简单标记一下GC ROOTS能直接关联到的节点,此阶段需要STW ②并发标记:进行GC Roots Tracing的过程,此阶段与用户线程并发执行 ③重新标记:对并发标记时用于线程产生的新的节点进行标记,此阶段需要STW, 但是此阶段为多线程并行的(多个垃圾回收线程同时进行) ④并发清除:使用标记清楚算法对对象进行回收,此阶段与同户线程同时进行 (4)缺点: ①无法清除浮动垃圾,由于最后一个阶段并发清除是与用户线程同时进行的,所以用户线程可能会产生新的可会收的对象 ②可能会产生垃圾碎片,由于该回收器采用的是标记清除算法7.G1收集器 (1)G1(Garbage-First) (2)G1收集器作用于整个JVM堆 (3)G1收集器将整个堆分成了大小相同的独立区域(Region) (4)在后台会维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region
ParNew其实就是Serial的多线程版本,除了使用多线程之外,其余参数和Serial一模一样。俗称:并行垃圾回收器,采用复制算法进行垃圾回收
多线程
并行垃圾回收器
复制算法
ParNew默认开启的线程数与CPU数量相同,在CPU核数很多的机器上,可以通过参数-XX:ParallelGCThreads来设置线程数。
-XX:ParallelGCThreads
它是目前新生代首选的垃圾回收器,因为除了ParNew之外,它是唯一一个能与老年代CMS配合工作的。
它同样存在Stop The World问题
使用-XX:+UseParNewGC参数可以设置新生代使用这个并行回收器
-XX:+UseParNewGC
ParallelGC使用复制算法回收垃圾,也是多线程的。
就是非常关注系统的吞吐量,吞吐量=代码运行时间/(代码运行时间+垃圾收集时间)
吞吐量
代码运行时间
垃圾收集时间
-XX:MaxGCPauseMillis:设置最大垃圾收集停顿时间,可用把虚拟机在GC停顿的时间控制在MaxGCPauseMillis范围内,如果希望减少GC停顿时间可以将MaxGCPauseMillis设置的很小,但是会导致GC频繁,从而增加了GC的总时间,降低了吞吐量。所以需要根据实际情况设置该值。
-XX:MaxGCPauseMillis
GC频繁
总时间
降低
-Xx:GCTimeRatio:设置吞吐量大小,它是一个0到100之间的整数,默认情况下他的取值是99,那么系统将花费不超过1/(1+n)的时间用于垃圾回收,也就是1/(1+99)=1%的时间。
-Xx:GCTimeRatio
99
1/(1+n)
1/(1+99)=1%
另外还可以指定-XX:+UseAdaptiveSizePolicy打开自适应模式,在这种模式下,新生代的大小、eden、from/to的比例,以及晋升老年代的对象年龄参数会被自动调整,以达到在堆大小、吞吐量和停顿时间之间的平衡点。
-XX:+UseAdaptiveSizePolicy
使用-XX:+UseParallelGC参数可以设置新生代使用这个并行回收器
SerialOld是Serial回收器的老年代回收器版本,它同样是一个单线程回收器。
老年代
单线程
一个是在JDK1.5及之前的版本中与Parallel Scavenge收集器搭配使用,
另一个就是作为CMS收集器的后备预案,如果CMS出现Concurrent Mode Failure,则SerialOld将作为后备收集器。
使用算法:标记 - 整理算法
使用算法
老年代ParallelOldGC回收器也是一种多线程的回收器,和新生代的ParallelGC回收器一样,也是一种关注吞吐量的回收器,他使用了标记压缩算法进行实现。
ParallelOldGC
标记压缩算法
-XX:+UseParallelOldGc进行设置老年代使用该回收器
-XX:+UseParallelOldGc
-XX:+ParallelGCThreads也可以设置垃圾收集时的线程数量。
-XX:+ParallelGCThreads
CMS全称为:Concurrent Mark Sweep意为并发标记清除,他使用的是标记清除法。主要关注系统停顿时间。
标记清除法
使用-XX:+UseConcMarkSweepGC进行设置老年代使用该回收器。
-XX:+UseConcMarkSweepGC
使用-XX:ConcGCThreads设置并发线程数量。
-XX:ConcGCThreads
CMS并不是独占的回收器,也就说CMS回收的过程中,应用程序仍然在不停的工作,又会有新的垃圾不断的产生,所以在使用CMS的过程中应该确保应用程序的内存足够可用。
CMS不会等到应用程序饱和的时候才去回收垃圾,而是在某一阀值的时候开始回收,回收阀值可用指定的参数进行配置:-XX:CMSInitiatingoccupancyFraction来指定,默认为68,也就是说当老年代的空间使用率达到68%的时候,会执行CMS回收。
饱和
-XX:CMSInitiatingoccupancyFraction
68
使用率
68%
执行
如果内存使用率增长的很快,在CMS执行的过程中,已经出现了内存不足的情况,此时CMS回收就会失败,虚拟机将启动老年代串行回收器;SerialOldGC进行垃圾回收,这会导致应用程序中断,直到垃圾回收完成后才会正常工作。
串行
SerialOldGC
这个过程GC的停顿时间可能较长,所以-XX:CMSInitiatingoccupancyFraction的设置要根据实际的情况。
标记清除法有个缺点就是存在内存碎片的问题,那么CMS有个参数设置-XX:+UseCMSCompactAtFullCollecion可以使CMS回收完成之后进行一次碎片整理。
内存碎片
-XX:+UseCMSCompactAtFullCollecion
碎片整理
-XX:CMSFullGCsBeforeCompaction参数可以设置进行多少次CMS回收之后,对内存进行一次压缩。
-XX:CMSFullGCsBeforeCompaction
压缩
七种垃圾收集器:
Serial(串行GC)-复制
ParNew(并行GC)-复制
Parallel Scavenge(并行回收GC)-复制
Serial Old(MSC)(串行GC)-标记-整理
CMS(并发GC)-标记-清除
Parallel Old(并行GC)--标记-整理
G1(JDK1.7update14才可以正式商用)
说明:
1~3用于年轻代垃圾回收:年轻代的垃圾回收称为minor GC
4~6用于年老代垃圾回收(当然也可以用于方法区的回收):年老代的垃圾回收称为full GC
G1独立完成"分代垃圾回收"
1、Serial(年轻代)
2、ParNew(年轻代)
3、Paralle Scavenge(年轻代)
4、Serial Old(年老代)
6、CMS(Concurrent Mark Sweep年老代)
7、G1
新生代可配置的回收器:Serial、ParNew、Parallel Scavenge
老年代配置的回收器:CMS、Serial Old、Parallel Old
新生代和老年代区域的回收器之间进行连线,说明他们之间可以搭配使用。
新生代垃圾回收器
Serial收集器是最基本的、发展历史最悠久的收集器。俗称为:串行回收器,采用复制算法进行垃圾回收
串行回收器
串行回收器是指使用单线程进行垃圾回收的回收器。每次回收时,串行回收器只有一个工作线程。
对于并行能力较弱的单CPU计算机来说,串行回收器的专注性和独占性往往有更好的性能表现。
它存在Stop The World问题,及垃圾回收时,要停止程序的运行。
使用-XX:+UseSerialGC参数可以设置新生代使用这个串行回收器
-XX:+UseSerialGC
1、Serial收集器
Serial收集器是一个作用于新生代的 ‘单线程’的收集器,这里单线程不仅代表它只有一条线程进行垃圾回收,还代表这个收集器工作时,必须stop the world(STW),用户线程全部暂停,直到它收集结束。
开启参数:-XX:+UseSerialGC
适用范围:用户的桌面应用场景(IDE工具的应用场景)
2、ParNew收集器
ParNew收集器,作用于新生代,简单的理解就是Serial收集器的多线程版本,在回收时有多个线程同时进行垃圾回收工作,其余的基本与Serial收集器一致。
开启参数:-XX:+UseParNewGC
适用范围:Server首选的新生代收集器
3、Parallel Scavenge收集器
Parallel Scavenge收集器是一个新生代多线程收集器,其最重要的一个特性是用户可以控制吞吐量。控制参数为
-XX:MaxGCPauseMillis(最大垃圾收集停顿时间/ms);-XX:GCTimeRatio(吞吐量百分比,0-100之间);通过以上两个参数,Parallel Scavenge收集器可以控制吞吐量的大小,具体的吞吐量计算公式为:运行用户代码的时间/(运行用户代码的时间+GC时间)例如吞吐量是99%,那么99%的时间是用户线程执行的时间,1%的时间是GC的时间。垃圾收集停顿时间越短,响应速度越快,用户体验越好。但是不要盲目的减小垃圾收集的停顿时间,还是需要结合系统自身,完成一次垃圾收集需要的时间来设定,否则得不偿失。
开启参数:-XX:+UseParallelGC
适用范围:后台计算不需要太多交互的场景
4、Serial Old 和 Parellel Old
分别是Serial收集器和Parellel Scavenge的老年代收集器版本,使用标记-整理算法进行垃圾回收。
5、Concurrent Mark Sweep收集器
CMS收集器,作用于老年代区域,是一种以获取最短回收停顿时间为目标的收集器,基于比标记-清除算法实现,整个过程分为4步,初始标记(单线程,STW)、并发标记(多线程)、重新标记(多线程,STW),并发清除(多线程)。特点为低停顿,在互联网站和Web服务端适用广泛。该收集器有三个可设置的的参数:
1)-XX:CMSInitiatingOccupancyFraction=70:代表老年代中占用70%的空间就会启用CMS收集器。
2)-XX:+UseCMSCompactAtFullCollection:CMS是不会移动内存的, 因此, 这个非常容易产生碎片, 导致内存不够用, 因此, 内存的压缩这个时候就会被启用。 增加这个参数是个好习惯。可能会影响性能,但是可以消除碎片。
3)-XX:+CMSFullGCsBeforeCompaction:设置多少次GC后进行内存压缩。
开启参数:-XX:+UseConcMarkSweepGC
Statement的execute(String query)方法用来执行任意的SQL查询,如果查询的结果是一个ResultSet,这个方法就返回true。如果结果不是ResultSet,比如insert或者update查询,它就会返回false。我们可以通过它的getResultSet方法来获取ResultSet,或者通过getUpda...
忙的时候项目期肯定要加班 但是每天加班应该还不至于
虽然Java人才越来越多,但是人才缺口也是很大的,我国对JAVA工程师的需求是所有软件工程师当中需求大的,达到全部需求量的60%-70%,所以Java市场在短时间内不可能饱和。其次,Java市场不断变化,人才需求也会不断增加。马云说过,未来的制造业要的不是石油,...
工信部证书含金量较高。工信部是国务院的下属结构,具有发放资质、证书的资格。其所发放的证书具有较强的权威性,在全国范围内收到认可,含金量通常都比较高。 工信部证书,其含义也就是工信部颁发并承认的某项技能证书,是具有法律效力的,并且是国家认可的...
学Java好不好找工作?看学完Java后能做些什么吧。一、大数据技术Hadoop以及其他大数据处理技术都是用Java或者其他,例如Apache的基于Java 的 HBase和Accumulo以及ElasticSearchas。但是Java在此领域并未占太大空间,但只要Hadoop和ElasticSearchas能够成长壮...
就是java的基础知识啊,比如Java 集合框架;Java 多线程;线程的五种状态;Java 虚拟机;MySQL (InnoDB);Spring 相关;计算机网络;MQ 消息队列诸如此类
#{}和${}这两个语法是为了动态传递参数而存在的,是Mybatis实现动态SQL的基础,总体上他们的作用是一致的(为了动态传参),但是在编译过程、是否自动加单引号、安全性、使用场景等方面有很多不同,下面详细比较两者间的区别:1.#{} 是 占位符 :动态解析 ...
没问题的,专科学历也能学习Java开发的,主要看自己感不感兴趣,只要认真学,市面上的培训机构不少都是零基础课程,能跟得上,或是自己先找些资料学习一下。
1、反射对单例模式的破坏采用反射的方式另辟蹊径实例了该类,导致程序中会存在不止一个实例。解决方案其思想就是采用一个全局变量,来标记是否已经实例化过了,如果已经实例化过了,第 二次实例化的时候,抛出异常2、clone()对单例模式的破坏当需要实现单例的...
优点: 一、实例控制 单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。 二、灵活性 因为类控制了实例化过程,所以类可以灵活更改实例化过程。 缺点: 一、开销 虽然数量很少,但如果每次对象请求引用时都要...
这个主要是看你数组的长度是多少, 比如之前写过的一个程序有个数组存的是各个客户端的ip地址:string clientIp[4]={XXX, xxx, xxx, xxx};这个时候如果想把hash值对应到上面四个地址的话,就应该对4取余,这个时候p就应该为4...
哈希表的大小 · 关键字的分布情况 · 记录的查找频率 1.直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)。...
哈希表的大小取决于一组质数,原因是在hash函数中,你要用这些质数来做模运算(%)。而分析发现,如果不是用质数来做模运算的话,很多生活中的数据分布,会集中在某些点上。所以这里最后采用了质数做模的除数。 因为用质数做了模的除数,自然存储空间的大小也用质数了...
是啊,哈希函数的设计至关重要,好的哈希函数会尽可能地保证计算简单和散列地址分布均匀,但是,我们需要清楚的是,数组是一块连续的固定长度的内存空间
解码查表优化算法,seo优化
1.对对象元素中的关键字(对象中的特有数据),进行哈希算法的运算,并得出一个具体的算法值,这个值 称为哈希值。2.哈希值就是这个元素的位置。3.如果哈希值出现冲突,再次判断这个关键字对应的对象是否相同。如果对象相同,就不存储,因为元素重复。如果对象不同,就...
最多设置5个标签!
1.Serial收集器(新生代)
(1)单线程收集器
(2)采用复制算法,用于新生代垃圾回收
(3)垃圾回收期间需要STW(Stop The World),STW表示垃圾回收线程不与用户线程并发执行
2.Serial Old收集器(老年代)
(1)与Serial相似
(2)采用标记整理算法,用于老年代的立即回收
3.ParNew收集器(新生代)
(1)是Serial的多线程版本
(2)除此之外与Serial收集相似
4.Parallel Scavenge收集器(新生代)
(1)基本功能与ParNew收集器相似
(2)区别在于该收集器是要达到一个可控制的吞吐量(吞吐量=运行用户代码的时间/(运行用户代码的时间)+(垃圾回收的时间))
(3)可以高效的利用cpu时间
(4)提供了参数可以精确的控制吞吐量,分别是控制最大垃圾回收停顿时间,也可以直接设置吞吐量大小
5.Parallel Old收集器(老年代)
(1)Parallel Scavenge收集器的老年代版本,采用标记整理算法
6.CMS收集器(老年代)
(1)采用标记清除算法,用户老年代的垃圾回收
(2)主要关注的是尽可能的缩短垃圾回收时用户线程的停顿时间
(3)主要有一下几个步骤:
①初始标记:简单标记一下GC ROOTS能直接关联到的节点,此阶段需要STW
②并发标记:进行GC Roots Tracing的过程,此阶段与用户线程并发执行
③重新标记:对并发标记时用于线程产生的新的节点进行标记,此阶段需要STW, 但是此阶段为多线程并行的(多个垃圾回收线程同时进行)
④并发清除:使用标记清楚算法对对象进行回收,此阶段与同户线程同时进行
(4)缺点:
①无法清除浮动垃圾,由于最后一个阶段并发清除是与用户线程同时进行的,所以用户线程可能会产生新的可会收的对象
②可能会产生垃圾碎片,由于该回收器采用的是标记清除算法
7.G1收集器
(1)G1(Garbage-First)
(2)G1收集器作用于整个JVM堆
(3)G1收集器将整个堆分成了大小相同的独立区域(Region)
(4)在后台会维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region
ParNew 垃圾回收器
ParNew其实就是Serial的
多线程
版本,除了使用多线程之外,其余参数和Serial一模一样。俗称:并行垃圾回收器
,采用复制算法
进行垃圾回收特点
ParNew默认开启的线程数与CPU数量相同,在CPU核数很多的机器上,可以通过参数
-XX:ParallelGCThreads
来设置线程数。它是目前新生代首选的垃圾回收器,因为除了ParNew之外,它是唯一一个能与老年代CMS配合工作的。
它同样存在Stop The World问题
使用
-XX:+UseParNewGC
参数可以设置新生代使用这个并行回收器ParallelGC 回收器
ParallelGC使用复制算法回收垃圾,也是多线程的。
特点
就是非常关注系统的吞吐量,
吞吐量
=代码运行时间
/(代码运行时间
+垃圾收集时间
)-XX:MaxGCPauseMillis
:设置最大垃圾收集停顿时间,可用把虚拟机在GC停顿的时间控制在MaxGCPauseMillis范围内,如果希望减少GC停顿时间可以将MaxGCPauseMillis设置的很小,但是会导致GC频繁
,从而增加了GC的总时间
,降低
了吞吐量
。所以需要根据实际情况设置该值。-Xx:GCTimeRatio
:设置吞吐量大小,它是一个0到100之间的整数,默认情况下他的取值是99
,那么系统将花费不超过1/(1+n)
的时间用于垃圾回收,也就是1/(1+99)=1%
的时间。另外还可以指定
-XX:+UseAdaptiveSizePolicy
打开自适应模式,在这种模式下,新生代的大小、eden、from/to的比例,以及晋升老年代的对象年龄参数会被自动调整,以达到在堆大小、吞吐量和停顿时间之间的平衡点。使用-XX:+UseParallelGC参数可以设置新生代使用这个并行回收器
老年代垃圾回收器
SerialOld 垃圾回收器
SerialOld是Serial回收器的
老年代
回收器版本,它同样是一个单线程
回收器。用途
一个是在JDK1.5及之前的版本中与Parallel Scavenge收集器搭配使用,
另一个就是作为CMS收集器的后备预案,如果CMS出现Concurrent Mode Failure,则SerialOld将作为后备收集器。
使用算法
:标记 - 整理算法ParallelOldGC 回收器
老年代
ParallelOldGC
回收器也是一种多线程的回收器,和新生代的ParallelGC回收器一样,也是一种关注吞吐量的回收器,他使用了标记压缩算法
进行实现。-XX:+UseParallelOldGc
进行设置老年代使用该回收器-XX:+ParallelGCThreads
也可以设置垃圾收集时的线程数量。CMS 回收器
CMS全称为:Concurrent Mark Sweep意为并发标记清除,他使用的是
标记清除法
。主要关注系统停顿时间。使用
-XX:+UseConcMarkSweepGC
进行设置老年代使用该回收器。使用
-XX:ConcGCThreads
设置并发线程数量。特点
CMS并不是独占的回收器,也就说CMS回收的过程中,应用程序仍然在不停的工作,又会有新的垃圾不断的产生,所以在使用CMS的过程中应该确保应用程序的内存足够可用。
CMS不会等到应用程序
饱和
的时候才去回收垃圾,而是在某一阀值的时候开始回收,回收阀值可用指定的参数进行配置:-XX:CMSInitiatingoccupancyFraction
来指定,默认为68
,也就是说当老年代的空间使用率
达到68%
的时候,会执行
CMS回收。如果内存使用率增长的很快,在CMS执行的过程中,已经出现了内存不足的情况,此时CMS回收就会失败,虚拟机将启动老年代
串行
回收器;SerialOldGC
进行垃圾回收,这会导致应用程序中断,直到垃圾回收完成后才会正常工作。这个过程GC的停顿时间可能较长,所以
-XX:CMSInitiatingoccupancyFraction
的设置要根据实际的情况。标记清除法有个缺点就是存在
内存碎片
的问题,那么CMS有个参数设置-XX:+UseCMSCompactAtFullCollecion
可以使CMS回收完成之后进行一次碎片整理
。-XX:CMSFullGCsBeforeCompaction
参数可以设置进行多少次CMS回收之后,对内存进行一次压缩
。七种垃圾收集器:
Serial(串行GC)-复制
ParNew(并行GC)-复制
Parallel Scavenge(并行回收GC)-复制
Serial Old(MSC)(串行GC)-标记-整理
CMS(并发GC)-标记-清除
Parallel Old(并行GC)--标记-整理
G1(JDK1.7update14才可以正式商用)
说明:
1~3用于年轻代垃圾回收:年轻代的垃圾回收称为minor GC
4~6用于年老代垃圾回收(当然也可以用于方法区的回收):年老代的垃圾回收称为full GC
G1独立完成"分代垃圾回收"
1、Serial(年轻代)
2、ParNew(年轻代)
3、Paralle Scavenge(年轻代)
4、Serial Old(年老代)
6、CMS(Concurrent Mark Sweep年老代)
7、G1
(1)单线程收集器
(2)采用复制算法,用于新生代垃圾回收
(3)垃圾回收期间需要STW(Stop The World),STW表示垃圾回收线程不与用户线程并发执行
2.Serial Old收集器(老年代)
(1)与Serial相似
(2)采用标记整理算法,用于老年代的立即回收
3.ParNew收集器(新生代)
(1)是Serial的多线程版本
(2)除此之外与Serial收集相似
4.Parallel Scavenge收集器(新生代)
(1)基本功能与ParNew收集器相似
(2)区别在于该收集器是要达到一个可控制的吞吐量(吞吐量=运行用户代码的时间/(运行用户代码的时间)+(垃圾回收的时间))
(3)可以高效的利用cpu时间
(4)提供了参数可以精确的控制吞吐量,分别是控制最大垃圾回收停顿时间,也可以直接设置吞吐量大小
5.Parallel Old收集器(老年代)
(1)Parallel Scavenge收集器的老年代版本,采用标记整理算法
6.CMS收集器(老年代)
(1)采用标记清除算法,用户老年代的垃圾回收
(2)主要关注的是尽可能的缩短垃圾回收时用户线程的停顿时间
(3)主要有一下几个步骤:
①初始标记:简单标记一下GC ROOTS能直接关联到的节点,此阶段需要STW
②并发标记:进行GC Roots Tracing的过程,此阶段与用户线程并发执行
③重新标记:对并发标记时用于线程产生的新的节点进行标记,此阶段需要STW, 但是此阶段为多线程并行的(多个垃圾回收线程同时进行)
④并发清除:使用标记清楚算法对对象进行回收,此阶段与同户线程同时进行
(4)缺点:
①无法清除浮动垃圾,由于最后一个阶段并发清除是与用户线程同时进行的,所以用户线程可能会产生新的可会收的对象
②可能会产生垃圾碎片,由于该回收器采用的是标记清除算法
7.G1收集器
(1)G1(Garbage-First)
(2)G1收集器作用于整个JVM堆
(3)G1收集器将整个堆分成了大小相同的独立区域(Region)
(4)在后台会维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region
ParNew 垃圾回收器
ParNew其实就是Serial的
多线程
版本,除了使用多线程之外,其余参数和Serial一模一样。俗称:并行垃圾回收器
,采用复制算法
进行垃圾回收特点
ParNew默认开启的线程数与CPU数量相同,在CPU核数很多的机器上,可以通过参数
-XX:ParallelGCThreads
来设置线程数。它是目前新生代首选的垃圾回收器,因为除了ParNew之外,它是唯一一个能与老年代CMS配合工作的。
它同样存在Stop The World问题
使用
-XX:+UseParNewGC
参数可以设置新生代使用这个并行回收器新生代可配置的回收器:Serial、ParNew、Parallel Scavenge
老年代配置的回收器:CMS、Serial Old、Parallel Old
新生代和老年代区域的回收器之间进行连线,说明他们之间可以搭配使用。
新生代垃圾回收器
Serial 垃圾回收器
Serial收集器是最基本的、发展历史最悠久的收集器。俗称为:
串行回收器
,采用复制算法
进行垃圾回收特点
串行回收器是指使用单线程进行垃圾回收的回收器。每次回收时,串行回收器只有一个工作线程。
对于并行能力较弱的单CPU计算机来说,串行回收器的专注性和独占性往往有更好的性能表现。
它存在Stop The World问题,及垃圾回收时,要停止程序的运行。
使用
-XX:+UseSerialGC
参数可以设置新生代使用这个串行回收器ParNew 垃圾回收器
ParNew其实就是Serial的
多线程
版本,除了使用多线程之外,其余参数和Serial一模一样。俗称:并行垃圾回收器
,采用复制算法
进行垃圾回收特点
ParNew默认开启的线程数与CPU数量相同,在CPU核数很多的机器上,可以通过参数
-XX:ParallelGCThreads
来设置线程数。它是目前新生代首选的垃圾回收器,因为除了ParNew之外,它是唯一一个能与老年代CMS配合工作的。
它同样存在Stop The World问题
使用
-XX:+UseParNewGC
参数可以设置新生代使用这个并行回收器ParallelGC 回收器
ParallelGC使用复制算法回收垃圾,也是多线程的。
特点
就是非常关注系统的吞吐量,
吞吐量
=代码运行时间
/(代码运行时间
+垃圾收集时间
)-XX:MaxGCPauseMillis
:设置最大垃圾收集停顿时间,可用把虚拟机在GC停顿的时间控制在MaxGCPauseMillis范围内,如果希望减少GC停顿时间可以将MaxGCPauseMillis设置的很小,但是会导致GC频繁
,从而增加了GC的总时间
,降低
了吞吐量
。所以需要根据实际情况设置该值。-Xx:GCTimeRatio
:设置吞吐量大小,它是一个0到100之间的整数,默认情况下他的取值是99
,那么系统将花费不超过1/(1+n)
的时间用于垃圾回收,也就是1/(1+99)=1%
的时间。另外还可以指定
-XX:+UseAdaptiveSizePolicy
打开自适应模式,在这种模式下,新生代的大小、eden、from/to的比例,以及晋升老年代的对象年龄参数会被自动调整,以达到在堆大小、吞吐量和停顿时间之间的平衡点。使用-XX:+UseParallelGC参数可以设置新生代使用这个并行回收器
老年代垃圾回收器
SerialOld 垃圾回收器
SerialOld是Serial回收器的
老年代
回收器版本,它同样是一个单线程
回收器。用途
一个是在JDK1.5及之前的版本中与Parallel Scavenge收集器搭配使用,
另一个就是作为CMS收集器的后备预案,如果CMS出现Concurrent Mode Failure,则SerialOld将作为后备收集器。
使用算法
:标记 - 整理算法ParallelOldGC 回收器
老年代
ParallelOldGC
回收器也是一种多线程的回收器,和新生代的ParallelGC回收器一样,也是一种关注吞吐量的回收器,他使用了标记压缩算法
进行实现。-XX:+UseParallelOldGc
进行设置老年代使用该回收器-XX:+ParallelGCThreads
也可以设置垃圾收集时的线程数量。CMS 回收器
CMS全称为:Concurrent Mark Sweep意为并发标记清除,他使用的是
标记清除法
。主要关注系统停顿时间。使用
-XX:+UseConcMarkSweepGC
进行设置老年代使用该回收器。使用
-XX:ConcGCThreads
设置并发线程数量。特点
CMS并不是独占的回收器,也就说CMS回收的过程中,应用程序仍然在不停的工作,又会有新的垃圾不断的产生,所以在使用CMS的过程中应该确保应用程序的内存足够可用。
CMS不会等到应用程序
饱和
的时候才去回收垃圾,而是在某一阀值的时候开始回收,回收阀值可用指定的参数进行配置:-XX:CMSInitiatingoccupancyFraction
来指定,默认为68
,也就是说当老年代的空间使用率
达到68%
的时候,会执行
CMS回收。如果内存使用率增长的很快,在CMS执行的过程中,已经出现了内存不足的情况,此时CMS回收就会失败,虚拟机将启动老年代
串行
回收器;SerialOldGC
进行垃圾回收,这会导致应用程序中断,直到垃圾回收完成后才会正常工作。这个过程GC的停顿时间可能较长,所以
-XX:CMSInitiatingoccupancyFraction
的设置要根据实际的情况。标记清除法有个缺点就是存在
内存碎片
的问题,那么CMS有个参数设置-XX:+UseCMSCompactAtFullCollecion
可以使CMS回收完成之后进行一次碎片整理
。-XX:CMSFullGCsBeforeCompaction
参数可以设置进行多少次CMS回收之后,对内存进行一次压缩
。1、Serial收集器
Serial收集器是一个作用于新生代的 ‘单线程’的收集器,这里单线程不仅代表它只有一条线程进行垃圾回收,还代表这个收集器工作时,必须stop the world(STW),用户线程全部暂停,直到它收集结束。
开启参数:-XX:+UseSerialGC
适用范围:用户的桌面应用场景(IDE工具的应用场景)
2、ParNew收集器
ParNew收集器,作用于新生代,简单的理解就是Serial收集器的多线程版本,在回收时有多个线程同时进行垃圾回收工作,其余的基本与Serial收集器一致。
开启参数:-XX:+UseParNewGC
适用范围:Server首选的新生代收集器
3、Parallel Scavenge收集器
Parallel Scavenge收集器是一个新生代多线程收集器,其最重要的一个特性是用户可以控制吞吐量。控制参数为
-XX:MaxGCPauseMillis(最大垃圾收集停顿时间/ms);-XX:GCTimeRatio(吞吐量百分比,0-100之间);通过以上两个参数,Parallel Scavenge收集器可以控制吞吐量的大小,具体的吞吐量计算公式为:运行用户代码的时间/(运行用户代码的时间+GC时间)例如吞吐量是99%,那么99%的时间是用户线程执行的时间,1%的时间是GC的时间。垃圾收集停顿时间越短,响应速度越快,用户体验越好。但是不要盲目的减小垃圾收集的停顿时间,还是需要结合系统自身,完成一次垃圾收集需要的时间来设定,否则得不偿失。
开启参数:-XX:+UseParallelGC
适用范围:后台计算不需要太多交互的场景
4、Serial Old 和 Parellel Old
分别是Serial收集器和Parellel Scavenge的老年代收集器版本,使用标记-整理算法进行垃圾回收。
5、Concurrent Mark Sweep收集器
CMS收集器,作用于老年代区域,是一种以获取最短回收停顿时间为目标的收集器,基于比标记-清除算法实现,整个过程分为4步,初始标记(单线程,STW)、并发标记(多线程)、重新标记(多线程,STW),并发清除(多线程)。特点为低停顿,在互联网站和Web服务端适用广泛。该收集器有三个可设置的的参数:
1)-XX:CMSInitiatingOccupancyFraction=70:代表老年代中占用70%的空间就会启用CMS收集器。
2)-XX:+UseCMSCompactAtFullCollection:CMS是不会移动内存的, 因此, 这个非常容易产生碎片, 导致内存不够用, 因此, 内存的压缩这个时候就会被启用。 增加这个参数是个好习惯。可能会影响性能,但是可以消除碎片。
3)-XX:+CMSFullGCsBeforeCompaction:设置多少次GC后进行内存压缩。
开启参数:-XX:+UseConcMarkSweepGC
相关问题推荐
Statement的execute(String query)方法用来执行任意的SQL查询,如果查询的结果是一个ResultSet,这个方法就返回true。如果结果不是ResultSet,比如insert或者update查询,它就会返回false。我们可以通过它的getResultSet方法来获取ResultSet,或者通过getUpda...
忙的时候项目期肯定要加班 但是每天加班应该还不至于
虽然Java人才越来越多,但是人才缺口也是很大的,我国对JAVA工程师的需求是所有软件工程师当中需求大的,达到全部需求量的60%-70%,所以Java市场在短时间内不可能饱和。其次,Java市场不断变化,人才需求也会不断增加。马云说过,未来的制造业要的不是石油,...
工信部证书含金量较高。工信部是国务院的下属结构,具有发放资质、证书的资格。其所发放的证书具有较强的权威性,在全国范围内收到认可,含金量通常都比较高。 工信部证书,其含义也就是工信部颁发并承认的某项技能证书,是具有法律效力的,并且是国家认可的...
学Java好不好找工作?看学完Java后能做些什么吧。一、大数据技术Hadoop以及其他大数据处理技术都是用Java或者其他,例如Apache的基于Java 的 HBase和Accumulo以及ElasticSearchas。但是Java在此领域并未占太大空间,但只要Hadoop和ElasticSearchas能够成长壮...
就是java的基础知识啊,比如Java 集合框架;Java 多线程;线程的五种状态;Java 虚拟机;MySQL (InnoDB);Spring 相关;计算机网络;MQ 消息队列诸如此类
#{}和${}这两个语法是为了动态传递参数而存在的,是Mybatis实现动态SQL的基础,总体上他们的作用是一致的(为了动态传参),但是在编译过程、是否自动加单引号、安全性、使用场景等方面有很多不同,下面详细比较两者间的区别:1.#{} 是 占位符 :动态解析 ...
没问题的,专科学历也能学习Java开发的,主要看自己感不感兴趣,只要认真学,市面上的培训机构不少都是零基础课程,能跟得上,或是自己先找些资料学习一下。
1、反射对单例模式的破坏采用反射的方式另辟蹊径实例了该类,导致程序中会存在不止一个实例。解决方案其思想就是采用一个全局变量,来标记是否已经实例化过了,如果已经实例化过了,第 二次实例化的时候,抛出异常2、clone()对单例模式的破坏当需要实现单例的...
优点: 一、实例控制 单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。 二、灵活性 因为类控制了实例化过程,所以类可以灵活更改实例化过程。 缺点: 一、开销 虽然数量很少,但如果每次对象请求引用时都要...
这个主要是看你数组的长度是多少, 比如之前写过的一个程序有个数组存的是各个客户端的ip地址:string clientIp[4]={XXX, xxx, xxx, xxx};这个时候如果想把hash值对应到上面四个地址的话,就应该对4取余,这个时候p就应该为4...
哈希表的大小 · 关键字的分布情况 · 记录的查找频率 1.直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)。...
哈希表的大小取决于一组质数,原因是在hash函数中,你要用这些质数来做模运算(%)。而分析发现,如果不是用质数来做模运算的话,很多生活中的数据分布,会集中在某些点上。所以这里最后采用了质数做模的除数。 因为用质数做了模的除数,自然存储空间的大小也用质数了...
是啊,哈希函数的设计至关重要,好的哈希函数会尽可能地保证计算简单和散列地址分布均匀,但是,我们需要清楚的是,数组是一块连续的固定长度的内存空间
解码查表优化算法,seo优化
1.对对象元素中的关键字(对象中的特有数据),进行哈希算法的运算,并得出一个具体的算法值,这个值 称为哈希值。2.哈希值就是这个元素的位置。3.如果哈希值出现冲突,再次判断这个关键字对应的对象是否相同。如果对象相同,就不存储,因为元素重复。如果对象不同,就...