导航:首页 > 万维百科 > cms垃圾收集器初始标记

cms垃圾收集器初始标记

发布时间:2020-09-08 03:04:57

1、怎么看我当前运行的是哪个垃圾收集器

【问题描述】:查找系统中占用空间较大的文件【原因分析】:需要删除无用文件,进行系统瘦身【简易步骤】:【360安全卫士】—【电脑清理】—【查找大文件】【解决方案】:1. 首先打开【360安全卫士】—【电脑清理】—【查找大文件】,选择需要扫描的磁盘或者目录,点击扫描大文件(如图1)图12.勾选要删除的文件,点击删除(如图2)图2

2、JVM的垃圾算法有哪几种

一、垃圾收集器概述

如上图所示,垃圾回收算法一共有7个,3个属于年轻代、三个属于年老代,G1属于横跨年轻代和年老代的算法。

JVM会从年轻代和年老代各选出一个算法进行组合,连线表示哪些算法可以组合使用

二、各个垃圾收集器说明

1、Serial(年轻代)

年轻代收集器,可以和Serial Old、cms组合使用

采用复制算法

使用单线程进行垃圾回收,回收时会导致Stop The World,用户进程停止

client模式年轻代默认算法

GC日志关键字:DefNew(Default New Generation)

图示(Serial+Serial Old)

2、ParNew(年轻代)

新生代收集器,可以和Serial Old、CMS组合使用

采用复制算法

使用多线程进行垃圾回收,回收时会导致Stop The World,其它策略和Serial一样

server模式年轻代默认算法

使用-XX:ParallelGCthreads参数来限制垃圾回收的线程数

GC日志关键字:ParNew(Parallel New Generation)

图示(ParNew + Serail Old)

3、Paralle Scavenge(年轻代)

新生代收集器,可以和Serial Old、Parallel组合使用,不能和CMS组合使用

采用复制算法

使用多线程进行垃圾回收,回收时会导致Stop The World

关注系统吞吐量

-XX:MaxGCPauseMillis:设置大于0的毫秒数,收集器尽可能在该时间内完成垃圾回收

-XX:GCTimeRatio:大于0小于100的整数,即垃圾回收时间占总时间的比率,设置越小则希望垃圾回收所占时间越小,CPU能花更多的时间进行系统操作,提高吞吐量

-XX:UseAdaptiveSizePolicy:参数开关,启动后系统动态自适应调节各参数,如-Xmn、-XX:SurvivorRatio等参数,这是和ParNew收集器重要的区别

GC日志关键字:PSYoungGen

4、Serial Old(年老代)

年老代收集器,可以和所有的年轻代收集器组合使用(Serial收集器的年老代版本)

采用 ”标记-整理“算法,会对垃圾回收导致的内存碎片进行整理

使用单线程进行垃圾回收,回收时会导致Stop The World,用户进程停止

GC日志关键字:Tenured

图示(Serial+Serial Old)

5、Parallel Old(年老代)

年老代收集器,只能和Parallel Scavenge组合使用(Parallel Scavenge收集器的年老代版本)

采用 ”标记-整理“算法,会对垃圾回收导致的内存碎片进行整理

关注吞吐量的系统可以将Parallel Scavenge+Parallel Old组合使用

GC日志关键字:ParOldGen

图示(Parallel Scavenge+Parallel Old)

6、CMS(Concurrent Mark Sweep年老代)

年老代收集器,可以和Serial、ParNew组合使用

采用 ”标记-清除“算法,可以通过设置参数在垃圾回收时进行内存碎片的整理
1、:默认开启,FullGC时进行内存碎片整理,整理时用户进程需停止,即发生Stop The World
2、CMSFullGCsBeforeCompaction:设置执行多少次不压缩的Full GC后,执行一个带压缩的(默认为0,表示每次进入Full GC时都进行碎片整理)

CMS是并发算法,表示垃圾回收和用户进行同时进行,但是不是所有阶段都同时进行,在初始标记、重新标记阶段还是需要Stop the World。CMS垃圾回收分这四个阶段
1、初始标记(CMS Initial mark)  Stop the World 仅仅标记一下GC Roots能直接关联到的对象,速度快
2、并发标记(CMS concurrent mark) 进行GC Roots Tracing,时间长,不发生用户进程停顿
3、重新标记(CMS remark)  Stop the World 修正并发标记期间因用户程序继续运行导致标记变动的那一部分对象的标记记录,停顿时间较长,但远比并发标记时间短
4、并发清除(CMS concurrent sweep) 清除的同时用户进程会导致新的垃圾,时间长,不发生用户进程停顿

适合于对响应时间要求高的系统

GC日志关键字:CMS-initial-mark、CMS-concurrent-mark-start、CMS-concurrent-mark、CMS-concurrent-preclean-start、CMS-concurrent-preclean、CMS-concurrent-sweep、CMS-concurrent-reset等等

缺点
1、对CPU资源非常敏感
2、CMS收集器无法处理浮动垃圾,即清除时用户进程同时产生的垃圾,只能等到下次GC时回收
3、因为是使用“标记-清除”算法,所以会产生大量碎片

图示

7、G1

G1收集器由于没有使用过,所以从网上找了一些教程供大家了解

并行与并发

分代收集

空间整合

可预测的停顿

3、java cms 初始标记 为什么 停止 应用线程

。表面上看起来是相同的任务,其实是不相同的
boolean runflag=true; 这个标志每个对象都有一个,你改变了其中一个以后,其它线程并不会受到影响;

4、cms垃圾回收算法在gc过程中哪几个阶段会暂停

P

5、如何指定定java cms垃圾回收

如果你的JAVA应用程序有以下几个特点,那么可以使用Concurrent Mark Sweep (CMS) 垃圾收集器。
希望JAVA垃圾回收器回收垃圾的时间尽可能短;
应用运行在多CPU的机器上,有足够的CPU资源;
有比较多生命周期长的对象;
希望应用的响应时间短。

6、cms垃圾回收算法在gc过程中哪几个阶段会暂停应用县城

中间调整过几次,先搞了几台机器做了验证,后来逐步推广的。
1、调大heap区,由原来的4g,调整到5g,young区的大小不变,还是2g,这时候old区就由2g变为3g了(这样保证old区有足够的空间);
2、设置-XX:UseCMSInitiatingOccupancyOnly,其实这个不关这个问题,只是发现半夜CMS进行的有点频繁,就禁止掉了悲观策略;
3、设置CMS区回收的比例,从80%调整到75%,让old区尽早的进行,有足够的空间剩余;

为什么要有GC(垃圾回收)?

JVM通过GC来回收堆和方法区中的内存,GC的基本原理就是找到程序中不再被使用的对象,然后回收掉这些对象占用的内存。

主要的收集器有哪些?
引用计数器和跟踪计数器两种。
引用计数器记录对象是否被引用,当计数器为零时,说明对象已经不再被使用,可以进行回收。java中的对象有复杂的引用关系,不是很适合引用计数器,所以sun jdk中并没有实现这种GC方式。
跟踪收集器,全局记录数据的引用状态,基于一定的条件触发。执行的时候,从根集合开始扫描对象的引用关系,主要有复制(copying)、标记-清除(Mark-Sweep)、标记-压缩(Mark-Compact)那种算法。

7、java垃圾收集器收集标准

Java垃圾收集器与类的finalize()方法总结

1.垃圾收集器的工作目标是回收已经无用的对象的内存空间,从而避免内存渗漏体的产生,节省内存资源,避免程序代码的崩溃。

2.垃圾收集器判断一个对象的内存空间是否无用的标准是:如果该对象不能再被程序中任何一个"活动的部分"所引用,此时我们就说,该对象的内存空间已经无用。所谓"活动的部分",是指程序中某部分参与程序的调用,正在执行过程中,尚未执行完毕。

3.垃圾收集器线程虽然是作为低优先级的线程运行,但在系统可用内存量过低的时候,它可能会突发地执行来挽救内存资源。当然其执行与否也是不可预知的。

4.垃圾收集器不可以被强制执行,但程序员可以通过调用System. gc方法来建议执行垃圾收集器。
5.不能保证一个无用的对象一定会被垃圾收集器收集,也不能保证垃圾收集器在一段Java语言代码中一定会执行。因此在程序执行过程中被分配出去的内存空间可能会一直保留到该程序执行完毕,除非该空间被重新分配或被其他方法回收。由此可见,完全彻底地根绝内存渗漏体的产生也是不可能的。但是请不要忘记,Java的垃圾收集器毕竟使程序员从手工回收内存空间的繁重工作中解脱了出来。设想一个程序员要用C或C++来编写一段10万行语句的代码,那么他一定会充分体会到Java的垃圾收集器的优点!

6.同样没有办法预知在一组均符合垃圾收集器收集标准的对象中,哪一个会被首先收集。

7.循环引用对象不会影响其被垃圾收集器收集。

8.可以通过将对象的引用变量(reference variables,即句柄handles)初始化为null值,来暗示垃圾收集器来收集该对象。但此时,如果该对象连接有事件监听器(典型的 AWT组件),那它还是不可以被收集。所以在设一个引用变量为null值之前,应注意该引用变量指向的对象是否被监听,若有,要首先除去监听器,然后才可以赋空值。

9.每一个对象都有一个finalize( )方法,这个方法是从Object类继承来的。

10.finalize( )方法用来回收内存以外的系统资源,就像是文件处理器和网络连接器。该方法的调用顺序和用来调用该方法的对象的创建顺序是无关的。换句话说,书写程序时该方法的顺序和方法的实际调用顺序是不相干的。请注意这只是finalize( )方法的特点。

11.每个对象只能调用finalize( )方法一次。如果在finalize( )方法执行时产生异常(exception),则该对象仍可以被垃圾收集器收集。

12.垃圾收集器跟踪每一个对象,收集那些不可到达的对象(即该对象没有被程序的任何"活的部分"所调用),回收其占有的内存空间。但在进行垃圾收集的时候,垃圾收集器会调用finalize( )方法,通过让其他对象知道它的存在,而使不可到达的对象再次"复苏"为可到达的对象。既然每个对象只能调用一次finalize( )方法,所以每个对象也只可能"复苏"一次。

13.finalize( )方法可以明确地被调用,但它却不能进行垃圾收集。

14.finalize( )方法可以被重载(overload),但只有具备初始的finalize( )方法特点的方法才可以被垃圾收集器调用。

15.子类的finalize( )方法可以明确地调用父类的finalize( )方法,作为该子类对象的最后一次适当的操作。但Java编译器却不认为这是一次覆盖操作(overriding),所以也不会对其调用进行检查。

16.当finalize( )方法尚未被调用时,System. runFinalization( )方法可以用来调用finalize( )方法,并实现相同的效果,对无用对象进行垃圾收集。

17.当一个方法执行完毕,其中的局部变量就会超出使用范围,此时可以被当作垃圾收集,但以后每当该方法再次被调用时,其中的局部变量便会被重新创建。

18.Java语言使用了一种"标记交换区的垃圾收集算法"。该算法会遍历程序中每一个对象的句柄,为被引用的对象做标记,然后回收尚未做标记的对象。所谓遍历可以简单地理解为"检查每一个"。

19.Java语言允许程序员为任何方法添加finalize( )方法,该方法会在垃圾收集器交换回收对象之前被调用。但不要过分依赖该方法对系统资源进行回收和再利用,因为该方法调用后的执行结果是不可预知的。 通过以上对垃圾收集器特点的了解,你应该可以明确垃圾收集器的作用,和垃圾收集器判断一块内存空间是否无用的标准。简单地说,当你为一个对象赋值为null并且重新定向了该对象的引用者,此时该对象就符合垃圾收集器的收集标准。

8、C#中关于垃圾收集器的问题

该对象已经被析构。

ObjectReliveTest.Program.relived = this; //复活
执行了对象复苏。但是,该对象已经被执行了终止化,使用他可能会导致不可预期的结果。(参考《.net框架程序设计》,p489)

如果被析构,那么,为什么CLR允许无意义的对象调用方法,而不是抛出异常?

既然是“不可预期的结果”,所以必须通过大量实验来进行观察。你可以多测试几次,你会发现某几次clr会抛出nullreference异常。

----------------------------------------------------------
~Reliver()
{
Console.WriteLine("正在析构复活类");
ObjectReliveTest.Program.relived = this; //复活
}
当对象的析构函数(finalize方法)被执行时,该对象的一个引用被放入了一个根中,从而使其又成为应用程序得一个可达对象。对象重新复苏以后,垃圾收集器不会再将其认为是可收集的对象,应用程序也可以自由的使用该对象。但是,该对象已经被执行了终止化,使用他可能会导致不可预期的结果。
换句话说,在对象执行了finalize方法以后,它的成员仍然可能被访问。
因此应该这样回答你这个问题:对象确实已经被析构,但是clr执行的这个析构,不是将对象从内存中抹掉,而是对它进行了特殊的标记,以便于在某一代龄的内存空间不足时流出空间,在此之前,应用程序仍然能够访问这个对象。 从这里也可以看出.net语言和c++的一些区别。

9、G1会成为新的默认垃圾收集器吗?

Java只有一个垃圾收集器,而事实上它有4个。Java9中,仍有一个运行提议,关于替换由Java7引入的G1默认垃圾收集器(并行/吞吐量收集)的讨论。
通常来说,G1被设计来更好地支持大于4GB的堆,并且不会造成频繁的GC暂停,但当暂停发生时,往往会处理更长时间。

与cms垃圾收集器初始标记相关的知识