大厂面试题:
1、JVM垃圾回收时候如何确定垃圾?是否知道什么是GC Roots
2、你说你做过JVM参数调优和参数配置,请问如何盘点查看JVM系统默认值
3、你平时工作中用过的JVM常用基本配置参数有哪些?
4、强引用、软引用、弱引用、虚引用费别是什么?
5、请你谈谈对OOM的认识
6、GC垃圾回收算法与垃圾收集器的关系?分别是什么请你谈谈?
7、 怎么查看服务器默认的垃圾回收器是哪一个?
生产上如何配置垃圾收集器的?
谈谈你对垃圾收集器的理解?
8、G1垃圾收集器
9、生产环境服务器变慢,诊断思路和性能评估谈谈?
10、假如生产环境CPU占用过高,请谈谈你的分析思路和定位。
11、对于JDK自带的监控和性能分析工具用过哪些?一般你怎么用的?
-Xms 初始堆内存大小,默认物理内存64/1
-Xms = -XX:InitialHeapSize
-Xmx 最大堆内存,默认物理内存4/1
-Xmx = -XX:MaxHeapSize
-Xss 栈内存大小
设置单个线程栈大小,一般默认512~1024kb。
单个线程栈大小跟操作系统和JDK版本都有关系
-Xss = -XX:ThreadStackSize
-Xmn 年轻代大小
-XX:MetaspaceSize 元空间大小
元空间本质跟永久代类似,都是对JVM规范中方法区的实现。
不过元空间与永久代最大的区别在于:元空间并不在虚拟机中,而是使用本机内存。
因此,元空间大小仅受本地内存限制。
-XX:+PrintGCDetails 打印GC详细日志信息
-XX:SurvivorRatio 幸存者比例设置
-XX:NewRatio 新生代比例设置
-XX:MaxTenuringThreshold 进入老年代阈值设置
【1】配置初始堆内存和最大堆内存
【2】模拟创建大对象
public class PrintGCDetailsDemo {
public static void main(String[] args) {
System.out.println("Hello PrintGCDetails!");
// 模拟创建大对象,出发YoungGC和Full GC
byte[] byteArray = new byte[10 * 1024 * 1024];
}
}
【3】运行PrintGCDetailsDemo程序
GC = Minor GC年轻代垃圾回收
Full GC = Minor GC + Old GC年轻代垃圾回收 + 老年代垃圾回收
Java.lang.OutOfMemoryError: Java heap Space堆空间不足OOM
【4】年轻代和年老代垃圾回收分析
GC = Minor GC分解图:
Full GC = Minor GC + Old GC分解图:
Hello PrintGCDetails!
[GC (Allocation Failure) [PSYoungGen: 2048K->496K(2560K)] 2048K->713K(9728K),
0.0016013 secs] [Times: user=0.02 sys=0.00, real=0.00 secs]
分解:
[GC (Allocation Failure)
GC表示YoungGC年轻代垃圾回收;
(Allocation Failure)表示内存分配失败;
[PSYoungGen: 2048K->496K(2560K)]
2048K表示年轻代垃圾回收前内存占用大小;
496K表示年轻代垃圾回收后内存占用大小;
(2560K)表示年轻代总大小;
2048K->713K(9728K)
2048K表示堆内存垃圾回收前内存占用大小;
713K表示堆内存垃圾回收后内存占用大小;
(9728K)表示堆内存总大小;
0.0016013 secs]
0.0016013 secs表示YoungGC耗时
[Times: user=0.02 sys=0.00, real=0.00 secs]
user=0.02表示用户耗时
sys=0.00表示系统耗时
real=0.00表示真实耗时
secs表示时间单位秒
[GC (Allocation Failure) [PSYoungGen: 496K->480K(2560K)] 713K->729K(9728K), 0.0022742 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
同上可得
[Full GC (Allocation Failure) [PSYoungGen: 480K->0K(2560K)] [ParOldGen: 249K->680K(7168K)] 729K->680K(9728K), [Metaspace: 3259K->3259K(1056768K)], 0.0076754 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
分解:
[Full GC (Allocation Failure)
Full GC表示YoungGC+OldGC(年轻代垃圾回收+年老代垃圾回收);
(Allocation Failure)表示内存分配失败;
[PSYoungGen: 480K->0K(2560K)]
480K表示年轻代垃圾回收前内存占用大小;
0K表示年轻代垃圾回收后内存占用大小;
(2560K)表示年轻代总大小;
[ParOldGen: 249K->680K(7168K)]
249K表示老年代垃圾回收前内存占用大小;
680K表示老年代垃圾回收后内存占用大小;
(7168K)表示老年代总大小;
729K->680K(9728K)
729K表示堆内存回收前内存占用大小;
680K表示堆内存回收后内存占用大小;
(9728K)表示堆内存总大小;
[Metaspace: 3259K->3259K(1056768K)]
Metaspace表示元空间;
3259K表示元空间垃圾回收前占用大小;
3259K表示元空间垃圾回收后占用大小;
(1056768K)表示元空间总大小
[GC (Allocation Failure) [PSYoungGen: 0K->0K(2560K)] 680K->680K(9728K), 0.0003449 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
同上可得
[Full GC (Allocation Failure) [PSYoungGen: 0K->0K(2560K)] [ParOldGen: 680K->664K(7168K)] 680K->664K(9728K), [Metaspace: 3259K->3259K(1056768K)], 0.0069613 secs] [Times: user=0.08 sys=0.00, real=0.01 secs]
同上可得
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.wwl.jvm.PrintGCDetailsDemo.main(PrintGCDetailsDemo.java:7)
OOM