JVM面试题
Java类加载过程?
Java编译器会将.java文件编译成.class文件,.class文件被类加载器加载进jvm,创建Class对象,初始化类变量。
描述—下JVM加载 Class文件的原理机制?
大体同上。
Java内存分配。
Java内存主要分为程序计数器(寄存器,记录线程内程序执行的顺序),方法区(非堆内存),堆,栈(Java栈、本地方法栈)
其中程序计数器、栈属于线程独立的。堆和方法区属于公共的。
GC是什么?为什么要有GC?
GC是垃圾回收的意思。因为在程序运行时,内存处理是编程人员容易忘记的地
方,忘记或错误的内存处理会导致程序出错甚至崩溃,因此Java提供GC自动监
测对象是否超过作用域而决定是否自动清理无用对象,保证内存不会被无用对象
占用。
简述Java垃圾回收机制
Java垃圾回收主要是对于堆内存而言的,堆内存分为亲生代和老年代,当新生
代中占用内存过多时,会启动GC,然后将未被回收的对象使用复制算法复制到
from区域。新生代多次GC后存活下来的对象可进入老年代,当老年代中的内存
占用过多时,在老年代启动FullGC。
如何判断一个对象是否存活?(或者GC对象的判定方法)
通过引用计数法判断。当对象创建之后,每次被引用该对象引用计数器+1,断 开引用时引用计数器-1,当计数器=0时,表明该对象没有被任何变量引用即不 存活。
垃圾回收的优点和原理。并考虑⒉种回收机制
优点: 1:编程人员无需关心内存管理问题 2:有效防止内存泄露问题,有效利用内存 3:GC是一个低级别的线程,可以在不可预知情况下回收无用对象 回收算法:引用计数器法,复制算法,标记清除,标记压缩 回收机制:分代收集 (根据垃圾所处新生代或老年代决定回收算法)
垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
原理:程序在创建对象时,GC就会监测该对象,通常GC会通过有向图来管理监
控堆中的对象,当GC检测到某些对象是“不可达”时,就会回收这些内存空间。
GC线程获取到CPU执行权限进行内存回收。
有,可以手动调用System.gc()
Java中会存在内存泄漏吗,请简单描述
会出现内存泄露。虽然Java有内存回收机制,但是也可能出现内存泄漏。例如
长生命周期的对象内部引用短生命周期的对象,虽然短生命周期的对象已经不再
需要,但是由于长生命周期的对象引用导致无法被GC回收,可能造成内存泄
露。
深拷贝和浅拷贝。
浅拷贝:只复制指向某个对象的指针,而不复制对象本身。
深拷贝:会在内存中开辟新的区域创建和被拷贝对象相同的对象。
System.gc()和 Runtime.gc()会做什么事情?
调用GC线程,回收垃圾,但是否立即回收取决于该线程是否能够立即获取CPU执行权
finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?
垃圾回收器(garbage collector)决定回收某对象时,就会运行该对象的finalize()方法。 finalization的目的:对象逃脱死亡的最后一次机会。(只要重新与引用链上的 任何一个对象建立关联即可。)但是不建议使用,运行代价高昂,不确定性大, 且无法保证各个对象的调用顺序。可用try-finally或其他替代。 GC本来就是内存回收了,应用还需要在finalization做什么呢? 答案是大部分 时候,什么都不用做(也就是不需要重载)。只有在某些很特殊的情况下,比如你 调用了一些native的方法(一般是C写的),可以要在finaliztion里去调用C的释 放函数。
如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?
不会立即回收,因为有些对象是可恢复的,在finalize中恢复引用即可避免被回收。
串行(serial收集器和吞吐量(throughput)收集器的区别是什么?
串行GC:整个扫描和复制过程均采用单线程的方式,相对于吞吐量GC来说简单;适合于单CPU、客户端级别。
吞吐量GC:采用多线程的方式来完成垃圾收集;适合于吞吐量要求较高的场合,比较适合中等和大规模的应用程序。
在Java 中,对象什么时候可以被垃圾回收?
当一个对象到GC Roots不可达时,在下一个垃圾回收周期中尝试回收该对象,
如果该对象重写了finalize ()方法,并在这个方法中成功自救 (将自身赋予某个
引用),那么这个对象不会被回收。 但如果这个对象没有重写finalize ()方法或
者已经执行过这个方法,也自救失败,该对象将会被回收。
简述Java内存分配与回收策略以及 Minor GC和Major GC。
java内存分配同上问题。
回收策略:分代回收(不同代使用不同算法)
Minor GC:Yong GC 发生在新生代的GC回收,使用的是复制算法。
Major GC:Old GC发生在老年代的GC回收
Minor GC和Full GC的区别
普通GC(minor GC):只针对新生代区域的GC,指发生在新生代的垃圾收集动作,因为大多数Java对象存活率都不高,所以Minor GC非常频繁,一般回收速度也比较快。
全局GC(major GC or Full GC):指发生在老年代的垃圾收集动作,出现了Major GC,经常会伴随至少一次的Minor GC(但并不是绝对的)。Major GC的速度一般要比Minor GC慢上
10倍以上
VM的永久代中会发生垃圾回收么?
永生代也是可以回收的,条件是 1.该类的实例都被回收。 2.加载该类 classLoader已经被回收 3.该类不能通过反射访问到其方法,而且该 java.lang.class没有被引用 当满足这3个条件时,是可以回收,但回不回收得 看jvm。
Java中垃圾收集的方法有哪些?
1、引用计数法 2、复制算法 3、标记清除 4、标记压缩
什么是类加载器,类加载器有哪些?
加载器类:可以将编译后的java文件(.class)文件加载进JVM的类。 类加载器: 启动类加载器(Bootstrap) 拓展类加载器(Extension) 应用类加载器(ApplicationClassloader)
类加载器双亲委派模型机制?
当一个类请求加载一个类进JVM时,首先不会是本类类加载器进行加载,而是请
求父类加载器进行处理,每一层都是如此,直到启动类加载器,只有在父类加载
器无法处理时,子类加载器才会进行处理。
作用:为了防止编程人员自定义类污染java原始类
什么时候发生Minor GC和Full GC?
(1)Minor GC发生:当jvm无法为新的对象分配空间的时候就会发生Minor gc,所以分配对象的频率越高,也就越容易发生Minor gc。 (2)Full GC:发生GC有两种情况,①当老年代无法分配内存的时候,会导致 MinorGC,②当发生Minor GC的时候可能触发Full GC,由于老年代要对年轻代 进行担保,由于进行一次垃圾回收之前是无法确定有多少对象存活,因此老年代 并不能清除自己要担保多少空间,因此采取采用动态估算的方法:也就是上一次 回收发送时晋升到老年代的对象容量的平均值作为经验值,这样就会有一个问 题,当发生一次Minor GC以后,存活的对象剧增(假设小对象),此时老年代 并没有满,但是此时平均值增加了,会造成发生Full GC