ToB企服应用市场:ToB评测及商务社交产业平台

标题: JVM口试篇(下) [打印本页]

作者: 缠丝猫    时间: 2024-6-5 16:42
标题: JVM口试篇(下)
垃圾网络器

简述 Java 垃圾回收机制

在 java 中,步伐员是不需要表现的去释放一个对象的内存的,而是由虚拟机自行实行。在 JVM
中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会实行的,只有在虚拟机空闲或
者当前堆内存不敷时,才会触发实行,扫面那些没有被任何引用的对象,并将它们添加到要回收
的集合中,进行回收。
GC 是什么?为什么要 GC

垃圾回收的优点和原理。2 种回收机制

Java 语言最显着的特点就是引入了垃圾回收机制,它使  Java 步伐员在编写步伐时不再考虑内存
管理的问题。
由于有这个垃圾回收机制, Java 中的对象不再有“作用域”的概念,只有引用的对象才有“作
用域”。
步伐员不能实时的对某个对象或所有对象调用垃圾回收器进行垃圾回收。垃圾回收有分代复制
垃圾回收标记垃圾回收、增量垃圾回收
垃圾回收器的基本原理是什么?

对于 GC 来说,当步伐员创建对象时,GC 就开始监控这个对象的地址、大小以及利用情况。
主动通知虚拟机进行垃圾回收的办法?

通常,GC 采用有向图的方式记录管理堆(heap)中的所有对象。通过这种方式确定哪些对象
是"可达的",哪些对象是"不可达的"。当 GC 确定一些对象为" 不可达"时,GC 就有责任回收这
些内存间。
垃圾回收器可以立刻回收内存吗?

可以。步伐员可以手动实行 System.gc(),通知 GC 运行,但是  Java 语言规范并不保证 GC 一
定会实行。
我们能保证 GC 实行吗?

不能,虽然你可以调用 System.gc() 大概 Runtime.gc(),但是没有办法保证GC 的实行。
Java 中引用类型有哪些?

强引用、软引用、弱引用、虚引用的区别?

思路: 先说一下四种引用的定义,可以结合代码讲一下,也可以扩展谈到ThreadLocalMap
里弱引用用处。
  1. Browser prev = new Browser(); // 获取页面进行浏览
  2. SoftReference sr = new SoftReference(prev); // 浏览完毕后置为软引用
  3. if(sr.get()!=null){
  4.         rev = (Browser) sr.get(); // 还没有被回收器回收,直接获取
  5. }else{
  6.         prev = new Browser(); // 由于内存吃紧,所以对软引用的对象回收了
  7.         sr = new SoftReference(prev); // 重新构建
  8. }
复制代码
怎么判断对象是否可以被回收?

垃圾网络器在做垃圾回收的时间,首先需要判断的就是哪些内存是需要被回收的,哪些对象是
「存活」的,是不可以被回收的;哪些对象已经「死掉」了,需要被回收。
一样平常有两种方法来判断:
在 Java 中,对象什么时间可以被垃圾回收

当对象对当前利用这个对象的应用步伐变得不可触及的时间,这个对象就可以被回收了。
垃圾回收不会发生在永久代,如果永久代满了大概是超过了临界值,会触发完全垃圾回收(Full
GC)。如果你过细查看垃圾网络器的输出信息,就会发现永久代也是被回收的。这就是为什么
正确的永久代大小对制止 Full GC 是非常重要的原因.
JVM 运行时堆内存如何分代?

Java 堆从 GC 的角度还可以细分为: 新生代(Eden 区、 From Survivor 区和 To Survivor 区)和
老年代。
参考图 1:

参考图 2:

即:新生代 ( Young ) = 1/3 的堆空间大小。老年代 ( Old ) = 2/3 的堆空间大小
此中,新生代 ( Young ) 被细分为 Eden 和 两个 Survivor 区域,这两个Survivor 区域分别被命
名为 from 和 to,以示区分.
默认的,Eden: from : to = 8 :1 : 1 ( 可以通过参数–XX:SurvivorRatio 来设定 ),即: Eden
= 8/10 的新生代空间大小,from = to = 1/10 的新生代空间大小
JVM 每次只会利用 Eden 和此中的一块 Survivor 区域来为对象服务,以是无论什么时间,总是
有一块 Survivor 区域是空闲着的。
因此,新生代实际可用的内存空间为 9/10 ( 即 90% )的新生代空间。
新生代

是用来存放新生的对象。一样平常占据堆的 1/3 空间。由于频繁创建对象,以是新生代会频繁触发
MinorGC 进行垃圾回收。新生代又分为 Eden 区、ServivorFrom、 ServivorTo 三个区。
Eden 区

Java 新对象的出生地(如果新创建的对象占用内存很大,则直接分配到老年代)。当 Eden 区内
存不够的时间就会触发 MinorGC,对新生代区进行一次垃圾回收。
Servivor from 区

上一次 GC 的幸存者,作为这一次 GC 的被扫描者。
Servivor to 区

保存了一次 MinorGC 过程中的幸存者。
MinorGC 的过程(复制->清空->交换)

MinorGC 采用复制算法。
老年代

主要存放应用步伐中生命周期长的内存对象。
老年代的对象比力稳定,以是 MajorGC (常常称之为 FULL GC)不会频繁实行。在进行 FULL
GC 前一样平常都先进行了一次 MinorGC,使得有新生代的对象晋身入老年代,导致空间不够用时才
触发。当无法找到足够大的连续空间分配给新创建的较大对象时也会提前触发一次 MajorGC 进
行垃圾回收腾出空间。
FULL GC 采用标记扫除算法:首先扫描一次所有老年代,标记出存活的对象,然后回收没有标记
的对象。ajorGC 的耗时比力长,由于要扫描再回收。FULLGC 会产生内存碎片,为了淘汰内存
消耗,我们一样平常需要进行合并大概标记出来方便下次直接分配。当老年代也满了装不下的时间,
就会抛出 OOM(Outof Memory)异常.
永久代

指内存的永久保存区域,主要存放 Class 和 Meta(元数据)的信息,Class 在被加载的时间被放
入永久区域, 它和和存放实例的区域不同,GC 不会在主步伐运行期对永久区域进行清理。以是这
也导致了永久代的区域会随着加载的Class 的增多而胀满,最终抛出 OOM 异常。
JVM 内存为什么要分成新生代,老年代,持久代。新生代中为什么要分为 Eden和 Survivor。

思路: 先讲一下 JAVA 堆,新生代的划分,再谈谈它们之间的转化,相互之间一些参数的配置
(如: –XX:NewRatio,–XX:SurvivorRatio 等),再表明为什么要这样划分,最好加一点自己
的理解。
答:
这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。
JVM 中一次完整的 GC 流程是怎样的,对象如何提升到老年代

思路:先描述一下 Java 堆内存划分,再表明 Minor GC,Major GC,full GC,描述它们之间转
化流程。
答:
JVM 中的永久代中会发生垃圾回收吗

垃圾回收不会发生在永久代,如果永久代满了大概是超过了临界值,会触发完全垃圾回收(Full
GC)。如果你过细查看垃圾网络器的输出信息,就会发现永久代也是被回收的。这就是为什么正
确的永久代大小对制止 Full GC 是非常重要的原因。请参考下 Java8:从永久代到元数据区。
(译者注:Java8 中已经移除了永久代,新加了一个叫做元数据区的 native 内存区)
JAVA8 与元数据

在 Java8 中, 永久代已经被移除,被一个称为“元数据区”(元空间)的区域所代替。元空间
的本质和永久代类似,元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是利用
本地内存。因此,默认情况下,元空间的大小仅受本地内存限制。 类的元数据放入 native
memory, 字符串池和类的静态变量放入 java 堆中, 这样可以加载多少类的元数据就不再由
MaxPermSize 控制, 而由系统的实际可用空间来控制。
如何判断对象可以被回收?

判断对象是否存活一样平常有两种方式:
引用计数法

在 Java 中,引用和对象是有关联的。如果要操纵对象则必须用引用进行。因此,很显然一个简
单的办法是通过引用计数来判断一个对象是否可以回收。简单说,即一个对象如果没有任何与之
关联的引用, 即他们的引用计数都不为0, 则阐明对象不太可能再被用到,那么这个对象就是可
回收对象。
可达性分析

为了解决引用计数法的循环引用问题, Java 利用了可达性分析的方法。通过一系列的“GC
roots”对象作为起点搜索。如果在“GC roots”和一个对象之间没有可达路径,则称该对象是
不可达的。要注意的是,不可达对象不等价于可回收对象, 不可达对象变为可回收对象至少要经
过两次标记过程。两次标记后仍然是可回收对象,则将面临回收。
Minor GC 与 Full GC 分别在什么时间发生?

新生代内存不够用时间发生 MGC 也叫 YGC,JVM 内存不够的时间发生 FGC
垃圾网络算法有哪些类型?

说一下 JVM 有哪些垃圾回收算法?

标记-扫除算法

标记无用对象,然后进行扫除回收。
标记-扫除算法(Mark-Sweep)是一种常见的基础垃圾网络算法,它将垃圾网络分为两个阶
段:
行改进的。
优点:实现简单,不需要对象进行移动。
缺点:标记、扫除过程服从低,产生大量不连续的内存碎片,提高了垃圾回收的频率。
标记-扫除算法的实行的过程如下图所示:

复制算法

为了解决标记-扫除算法的服从不高的问题,产生了复制算法。它把内存空间划为两个相称的区
域,每次只利用此中一个区域。垃圾网络时,遍历当前利用的区域,把存活对象复制到别的一个
区域中,最后将当前利用的区域的可回收的对象进行回收。
优点:按顺序分配内存即可,实现简单、运行高效,不用考虑内存碎片。
缺点:可用的内存大小缩小为原来的一半,对象存活率高时会频繁进行复制。
复制算法的实行过程如下图所示:

标记-整理算法

在新生代中可以利用复制算法,但是在老年代就不能选择复制算法了,由于老年代的对象存活率
会较高,这样会有较多的复制操纵,导致服从变低。标记- 扫除算法可以应用在老年代中,但是
它服从不高,在内存回收后容易产生大量内存碎片。因此就出现了一种标记-整理算法(Mark-
Compact)算法,与标记-整理算法不同的是,在标记可回收的对象后将所有存活的对象压缩到
内存的一端,使他们紧凑的分列在一起,然后对端边界以外的内存进行回收。回收后,已用和未
用的内存都各自一边。
优点:解决了标记-清理算法存在的内存碎片问题。
缺点:仍需要进行局部对象移动,肯定程度上降低了服从。
标记-整理算法的实行过程如下图所示:

分代网络算法

分代网络法是目前大部门 JVM 所采用的方法,其核心思想是根据对象存活的不同生命周期将内
存划分为不同的域,一样平常情况下将 GC 堆划分为老生代(Tenured/Old Generation)和新生代
(YoungGeneration)。老生代的特点是每次垃圾回收时只有少量对象需要被回收,新生代的特点
是每次垃圾回收时都有大量垃圾需要被回收,因此可以根据不同区域选择不同的算法。
当前商业虚拟机都采用分代网络的垃圾网络算法。分代网络算法,顾名思义是根据对象的存活周
将内存划分为几块。一样平常包括年轻代、老年代 和 永久代
如图所示:

当前主流 VM 垃圾网络都采用”分代网络” (Generational Collection)算法, 这种算法会根据对
象存活周期的不同将内存划分为几块, 如 JVM 中的 新生代、老年代、永久代, 这样就可以根据
各年代特点分别采用最得当的 GC 算法。
新生代与复制算法

每次垃圾网络都能发现大批对象已死, 只有少量存活. 因此选用复制算法, 只需要付出少量存活对
象的复制本钱就可以完成网络。
目前大部门 JVM 的 GC 对于新生代都采取 Copying 算法,由于新生代中每次垃圾回收都要回收
大部门对象,即要复制的操纵比力少,但通常并不是按照 1: 1 来划分新生代。一样平常将新生代划
分为一块较大的 Eden 空间和两个较小的 Survivor 空间(From Space, To Space),每次利用
Eden 空间和此中的一块 Survivor 空间,当进行回收时,将该两块空间中还存活的对象复制到另
一块 Survivor 空间中。

老年代与标记复制算法

由于老年代对象存活率高、没有额外空间对它进行分配担保, 就必须采用“标记—清理”或“标
记—整理” 算法来进行回收, 不必进行内存复制, 且直接腾出空闲内存。因而采用
Mark-Compact 算法。
GC 垃圾网络器

Java 堆内存被划分为新生代和年老代两部门,新生代主要利用复制和标记-扫除垃圾回收算法;
年老代主要利用标记-整理垃圾回收算法,因此 java 虚拟中针对新生代和年老代分别提供了多种
不同的垃圾网络器, JDK1.6 中 SunHotSpot 虚拟机的垃圾网络器如下:

说一下 JVM 有哪些垃圾回收器?

如果说垃圾网络算法是内存回收的方法论,那么垃圾网络器就是内存回收的具体实现。下图展示
了 7 种作用于不同分代的网络器,此中用于回收新生代的网络器包括 Serial、PraNew、Parallel
Scavenge,回收老年代的网络器包括Serial Old、Parallel Old、CMS,另有用于回收整个 Java
堆的 G1 网络器。不同网络器之间的连线表示它们可以搭配利用。

Serial 与 Parallel GC 之间的不同之处?

Serial 与 Parallel 在 GC 实行的时间都会引起 stop-the-world。它们之间主要不同 serial 网络
器是默认的复制网络器,实行 GC 的时间只有一个线程,而 parallel 网络器利用多个 GC 线程来
实行。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4