JVM探究
1.JVM位置
jvm是java运行环境, 在操作系统(window、linux、mac)之上, 操作系统在硬盘之上。
2.jvm的体系结构
3.类加载器
1.(应用)根加载器
2.扩展加载器
3.应用加载器
JVM类加载器加载.class文件, 将class问价读取到内存中,并创建一个java.lang.class对象。
4.双亲委派机制
当一个.class文件被加载时, 类加载器会交给父类加载器执行, 如果父类加载器下有这个java api类就会执行父类下面的类,并不会执行传入的类。应用加载器 -> 扩展加载器 -> 根加载器 如果父类都不存在就由应用加载器进行加载传入的类。如果传入一个java.lang.String类,在根加载器下会找到java api就会执行根加载器下的类, 并不会加载传入过来的java.lang.String类,增加类加载的安全性。
5.沙箱安全机制
6.native
带有native关键字的, 说明java的作用范围到达不到, 回去调用C语言的库。会进入本地方法栈调用本地方法接口JNI。在最终执行的时候加载本地方法库中的方法通过JNI。
JNI:扩展java的使用, 融合不同的编程语言为java所用。
7.pc寄存器(程序计数器)
每个线程都有一个程序计数器, 是线程私有的, 就是一个指针, 指向方法区中的方法字节码, 在执行引擎读取下一条指令,是一个非常小的内存空间。
8.方法区
静态变量、常量、类信息(构造方法、接口定义)、运行时的常量池也存在方法区中。但实例变量存在堆内存中和方法区无关。
9.栈
栈是对每个线程共享的。
为什么main()方法先执行后结束。main()方法首先放入在java栈中, java栈是先进后出。
栈:栈内存, 主管程序的运行, 线程结束栈就释放。不存在垃圾回收的问题。
栈:8大基本类型+对象引用+实例方法。
10.三种JVM
Sun公司 HotSpot (常用的)
BEA公司
IBM公司
11.堆
Heap, 一个JVM只有一个堆内存, 堆内存的大小是可以调节的。类加载器读取文件之后会把类、方法、常量、变量、引用类型的真实对象
堆内存中包含三个区域:
新生区young:
老年区old:
永久区perm:
12.新生区、老年区
13.永久区
14.堆内存调优
15.GC常用算法
16.JMM(java内存模型)
17.总结
面试:
1.谈谈你对jvm理解? java8虚拟机和之前的变化更新?
2.什么是OMM,什么是栈溢出stackoverflowerror? 怎么分析?
3.jvm常用调优参数那些?
4.内存快照的抓取, 怎么分析dump文件?
5.谈谈jvm类加载器的认识?