问题

  • 谈谈对JVM的理解?java8虚拟机和之前的变化更新
  • 什么是OOM,什么是栈溢出StackOverFlowError?怎么分析?
  • JVM常用的调优参数有哪些?
  • 内存快照如何抓取,怎么分析Dump文件?
  • 谈谈JVM中你对类加载器的认识?

1、JVM的位置

image.png

2、JVM的体系结构

JVM调优99%的情况都在调堆,方法区是一个特殊的堆
image.png

3、类加载器

作用:加载Class文件
1、虚拟机自带的加载器
2、启动类(根)加载器
3、拓展类加载器
4、应用程序加载器
image.png

  1. public class Car {
  2. public static void main(String[] args) {
  3. Car car1 = new Car();
  4. Car car2 = new Car();
  5. Car car3 = new Car();
  6. //得到Car的模板,三个对象得到的是同样的模板
  7. Class<? extends Car> car1Class = car1.getClass();
  8. //car的模板
  9. System.out.println(car1Class);
  10. //得到应用程序加载器AppClassLoader,java.lang.ClassLoader
  11. System.out.println(car1Class.getClassLoader());
  12. //得到拓展类加载器ExtClassLoader,jre/lib/ext
  13. System.out.println(car1Class.getClassLoader().getParent());
  14. //null,获取不到,rt.jar
  15. System.out.println(car1Class.getClassLoader().getParent().getParent());
  16. }
  17. }

4、双亲委派机制(面试高频)

  1. package java.lang;
  2. public class String {
  3. //双亲委派机制:保证安全
  4. //程序类加载器->拓展类加载器->根加载器
  5. //程序执行时,会首先在根加载器中寻找这个类,找不到
  6. //再逐渐往下层去找 根加载器->拓展类加载器->程序类加载器
  7. public String toString(){
  8. return "hello";
  9. }
  10. public static void main(String[] args) {
  11. String s = new String();
  12. s.toString();
  13. }
  14. }

5、沙箱安全机制

6、Native
7、PC寄存器
8、方法区
9、栈
10、三种JVM
11、堆
12、新生区、老年区
13、永久区
14、堆内存调优
15、GC(常用算法)
16、JMM