jvm的组成部分及其作用
- 类加载器
- 运行时数据区
- 执行引擎
- 本地库文件
首先类加载器把java代码转化为字节码,运行时数据区把字节码传入内存,执行引擎把字节码转化为底层系统指令给cpu去执行,在这个过程中要用到其他语言的本地库接口来实现。
堆栈的区别
- 栈存储的是局部变量,堆存储的是实体
- 栈内的元素更新速度比堆快
- 栈内的元素一旦生命周期到了就会释放掉,堆内的实体会通过回收机制不定时回收
双亲委派机制
当一个类加载器收到加载请求时,不会立即去加载这个请求,而是把这个请求发送给他的父类去加载,每一层的类加载器都是如此,这样所有的加载请求都会传送到顶层的启动类,只有当父类无法加载请求时,子类才会去尝试加载。
类加载过程
首先根据查找路径找到对应的class文件,然后检查class文件的正确性,准备给类中的静态变量分配存储空间,虚拟机将常量池中的符号引用替换为直接引用,最后对静态变量和代码执行初始化工作
jvm回收算法
- 标记-清除
- 标记-整理
- 复制
- 分代
新生代和老生代的垃圾回收器的区别
新生代一般用的时复制算法(效率高,内存利用率低)
老生代用的是标记-整理
jvm调优工具
- jconsole 用于对jvm的内存、线程、类进行监控
- jvisualvm jdk自带的全能分析工具,可以分析:内存快照、线程快照、程序死锁、内存变化、gc变化等