当前位置:   article > 正文

jvm基础知识_方法区中类静态属性引用的对象

方法区中类静态属性引用的对象

jvm

1.垃圾收集

1.1哪些内存需要回收?

Java内存运行时区域:程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭,栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的(尽管在运行期会由即时编译器进行一些优化,但在基于概念模型的讨论里,大体上可以认为是编译期可知的),因此这几个区域的内存分配和回收都具备确定性。

需要回收的内存:Java堆和方法区的内存不确定,这部分内存的分配和回收是动态的。

1.2.如何判断此对象可以进行垃圾回收?

主流的商用程序语言都是通过可达性分析(Reachability Analysis)算法来判定对象是否存活的;

基本思路:

“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”(Reference Chain),如果某个对象到GC Roots间没有任何引用链相连,或者用图论的话来说就是从GC Roots到这个对象不可达时,则证明此对象是不可能再被使用的。

1.2.1.举例说明哪些是可以作为GC ROOT对象?

  1. 在虚拟机栈(栈帧中的本地变量表)中引用的对象;

  2. 方法区中类静态属性引用的对象(static);

  3. 方法区中常量引用的对象;

  4. Java虚拟机内部的引用,系统类加载器

  5. 所有被同步锁(synchronized关键字)持有的对象。

1.2.2.什么是引用?分几种?特点是什么?

Java对引用的概念进行了扩充,将引用分为强引用(Strongly Re-ference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)4种,引用强度依次逐渐减弱。

强引用:垃圾收集器就永远不会回收掉被引用的对象。

软引用:系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。

弱引用:被弱引用关联的对象只能生存下一次垃圾收集发生为止。

虚引用:弱的一种引用关系唯一目的只是为了能在这个对象被收集器回收时收到一个系统通知。

1.2.3.对象不可达必死吗?

不。需要至少进行2次标记,finalize()方法是对象逃脱死亡命运的最后一次机会,finalize()方法是一个守护线程;

1.3.方法区需要进行垃圾收集吗?

可以进行收集,条件较为苛刻,须同时满足以下3点:

该类所有的实例被回收;该类类加载器已经被回收;该类对应的class对象没有任何地方被引用;

1.4.垃圾收集算法有哪些?分别有什么优缺点?

有3种。

标记—清除算法;

标记—复制算法;

标记—整理算法。

标记—清除算法:标记存活的对象,统一回收所有未被标记的对象。

缺点:效率不稳定;空间碎片化;

标记—复制算法:内存按容量划分为大小相等的两块,这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。思考:对象大多数存活怎么办?

标记—整理算法:老年代对象的存亡特征(每次回收都有大量对象存活区域);其中的标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存。

1.4.1标记—复制算法应用

1.4.1.优先采用了这种收集算法去回收新生代,为什么?

新生代“朝生夕灭”,不需要按照1∶1的比例来划分新生代的内存空间。

1.4.2.半区复制分代策略,“Appel式回收”怎么进行优化的?

把新生代分为一块较大的Eden空间和两块较小的Survivor空间,每次分配内存只使用Eden和其中一块Survivor。发生垃圾搜集时,将Eden和Survivor中仍然存活的对象一次性复制到另外一块Survivor空间上,然后直接清理掉Eden和已用过的那块Survivor空间。HotSpot虚拟机默认Eden和Survivor的大小比例是8∶1;

1.5.新生代垃圾收集器有哪些?

Serial收集器,ParNew收集器,Parallel Scavenge收集器;

1.6.老年代垃圾收集器有哪些?

Serial Old收集器,Parallel Old收集器,CMS收集器;

1.7.Serial收集器的特点?

特点:收集器是一个单线程工作的收集器;它进行垃圾收集时,必须暂停其他所有工作线程;没有线程交互的开销,得最高的单线程收集效率。

1.8.ParNew收集器的特点?

ParNew收集器实质上是Serial收集器的多线程并行版本;它能与CMS收集器配合工作。

1.9.Parallel Scavenge收集器的特点?

基于标记-复制算法实现的收集器,目标则是达到一个可控制的吞吐量(Throughput)。

1.10.Serial Old收集器

一个单线程收集器,使用标记-整理算法。作为CMS收集器发生失败时的后备预案,

1.11.Parallel Old收集器

支持多线程并发收集,基于标记-整理算法实现;与Parallel Scavenge收集器配合使用。

1.12.CMS收集器

一种以获取最短回收停顿时间为目标的收集器。基于标记-清除算法实现的。

整个过程分为四个步骤:

1)初始标记(CMS initial mark)“Stop The World” 2)并发标记(CMS concurrent mark)三色标记 3)重新标记(CMS remark)“Stop The World” 4)并发清除(CMS concurrent sweep)清理删除掉标记阶段判断的已经死亡的对象,这个阶段也是可以与用户线程同时并发的。

特点

1.CMS收集器对处理器资源非常敏感。

2.由于CMS收集器无法处理“浮动垃圾”(Floating Garbage)

注:CMS的并发标记和并发清理阶段,用户线程是还在继续运行的,程序在运行自然就还会伴随有新的垃圾对象不断产生,但这一部分垃圾对象是出现在标记过程结束以后,CMS无法在当次收集中处理掉它们,只好留待下一次垃圾收集时再清理掉。这一部分垃圾就称为“浮动垃圾”

3.大量空间碎片产生

1.13 Garbage First收集器(简称G1)

面向局部收集的设计思路和基于Region的内存布局形式。

面向堆内存任何部分来组成回收集(Collection Set,一般简称CSet)进行回收,衡量标准不再是它属于哪个分代,而是哪块内存中存放的垃圾数量最多,回收收益最大,这就是G1收集器的Mixed GC模式。

Region中还有一类特

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/881430
推荐阅读
相关标签
  

闽ICP备14008679号