十一、4大垃圾回收思想是什么?
参考回答:
(1)引用计数(可能会死循环持有)
(2)复制( 新生代 ,因为对象生命周期短)
(3)标记清除
(4)标记整理 (老年代)
十二、新生代满了之后,哪些引用的对象是不能回收的?
参考回答:
JVM中使用了一种GC Root的可达性分析算法,通过对每个对象,都分析一下有谁在引用他,然后一层一层往上去判断,看是否有一个GC Roots。
十三、Java中对象的引用类型有哪些?
参考回答:
(1)强引用:就算OOM也不会对对象进行回收,会造成内存泄漏
(2)软引用:内存足够不进行回收,内存不够的话才进行回收 VMoptions:-Xms20M -Xmx20M
常用于:用HashMap来保存图片的路径 和 相应图片关联的软引用之间的映射关系,避免OOM的问题
(3)弱引用:只要垃圾回收机制一运行,就会进行回收
(4)虚引用:不常用,一般用于监控对象的回收信息
十四、什么情况会导致OOM?
参考回答:
(1)深度的方法调用 StackOverFlowError
(2)堆内存溢出 OutOfMemoryError: Java heap space
(3)清理垃圾,但是很快又填满 GC overhead
(4)nio程序在分配本地内存的时候,本地内存用光了,内存用光之后,当再次分配内存的时候,程序就崩了。
(5)MetaspaceOOM (重复吃Aug年间静态类变量)
(6)一个应用进程创建了多个线程超出了系统的限制,linux默认1024,可以通过修改其中的linux服务器配置解决。
十五、哪些对象可以作为GC Roots?
参考回答:
(1)虚拟机栈(栈帧中的本地变量表)中的引用的对象
(2)方法区中的类静态属性引用的对象
(3)方法区中的常量引用的对象
(4)本地方法栈中JNI(Native方法)的引用对象
十六、聊一聊我们为什么要去了解GC和内存分配
参考回答:
在真实工作场景的项目中,时不时的会发生内存溢出、内存泄露的问题,这也是不可避免的Bug,这些潜在的Bug在某些时候会影响到项目的正常运行。
如果你的项目没有合理的进行业务内存分配,将会直接影响到的项目的并发处理。
当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节,而了解了GC实现机制则是我们一切监控和调节的前提。
十七、Java虚拟机将会在什么地方进行垃圾回收?
参考回答:
说起垃圾回收的场所,了解过JVM(Java Virtual Machine Model)内存模型的朋友应该会很清楚,堆是Java虚拟机进行垃圾回收的主要场所,其次要场所是方法区。
十八、从哪几个方面可以评估一个GC的优劣
参考回答:
GC不应该成为影响系统性能的瓶颈,我们在评估 GC收集器的优劣时一般考虑以下几点:
(1)吞吐量
(2)GC开销
(3)暂停时间
(4)GC频率
(5)堆空间
(6)对象生命周期
十九、System.gc 是 Full Gc 吗?
参考回答:
System.gc 其实是做一次full gc操作。这一点可以根据 DisableExplicitGC 的注释说明来看。
注释:Tells whether calling System.gc() does a full GC。
二十、简单说说JVM优化该从什么方面入手(GC方向)
参考回答:
JVM优化,主要是让对象在新生代里分配和回收,尽量不要让太多对象频繁进入老年代,避免频繁的垃圾回收,同时给足系统充足的内存,避免新生代频繁进行垃圾回收。从上述这几个方面进行JVM的优化