JVM整理部分面试题
1.如何主动触发垃圾回收?
在Java中,垃圾回收是自动进行的,由Java虚拟机(JVM)负责管理。但是,有时候我们可能希望手动触发垃圾回收以释放一些无用的对象。这可以通过调用System.gc()方法来实现
手动触发垃圾回收并不意味着垃圾会立即被清除。它只是一个请求,告诉垃圾回收器可以执行回收操作。具体的回收时机仍然由垃圾回收器决定。
我们还可以通过将引用设置为null来间接触发垃圾回收。当一个对象没有被任何引用指向时,Java虚拟机会将其标记为可回收的,并在下一次垃圾回收时进行清理。
我们可以通过调用Runtime.getRuntime().gc()方法来触发垃圾回收。这与使用System.gc()方法是等效的,只是方法调用的方式不同而已
2.如何减少FullGc频率?JVM调优如何实现?
1.避免内存泄漏及时清理垃圾。可以手动触发垃圾回收(见上方)
2.尽量避免大对象的频繁创建,可以 优化代码;
调优工作:
1.使用合适的垃圾回收器和垃圾回收算法;
2.调整青年带中的区域比例或者调整青年带和老年代的比例:(-XX:survivorRatio -XX:newRatio)
3.方法区/永久代和元空间的关系
方法区是在虚拟机规范里面被定义的,不同的虚拟机对这个定义的实现不同,在HotSpot 虚拟机中在 jdk1.7 版本之前的方法区实现叫永久代(PermGen space),jdk1.8 之后叫做元空间(Metaspace)。
元空间和永久代最大的区别是元空间并不在虚拟机中,而是使用本地内存。
4.方法区的OOM如何避免,怎么去解决?
原因:
大量的类被加载;
大量的动态生成类;
字符串常量池满;
解决方案:
1.调整方法区的大小 通过-XX:permSize/-XX:metaPspacesize --XX:maxpermsize/-XX:maxmetaspaceSize;
2.注意动态生成类的使用场景;
3.限制字符串常量池的使用,避免大量字符串常量的创建,