JVM快速入门
JVM的位置
JVM的体系结构
- 程序计数器即PC寄存器
类加载器及双亲委派机制
- 作用:加载class文件。
- 级别:
- 1、虚拟机自带的加载器
- 2、启动类(根)加载器(rt-jar)
- 3、扩展类加载器(jre目录下–lib–ext)
- 4、应用程序加载器(AppClassLoader)
- 双亲委派机制
- 1、类加载器收到类加载的请求
- 2、先将这个请求向上委托给父类加载器去完成,一直向上委托,直到根加载器
- 3、启动类加载器检查是否能够加载当前类,能加载就结束,使用当前加载器,否则,抛出异常,通知子加载器进行加载
- 4、重复步骤3
- 注意:往上调用会遇到null,代表java调用不到,底层是用C/C++来写的;
- native关键字:修饰方法即为本地方法,代码构成为C/C++(例如线程相关方法,java处理不了线程,用C/C++进行方法编写,用native关键字修饰。)
- java为什么叫C++ --:对C++语言中指针、内存管理进行升级优化而来。
沙箱安全机制
- 安全管理、权限控制
native、方法区
- 凡是带了native关键字的,说明java的作用范围达不到了,会去调用底层C语言的库。
- 会进入本地方法栈,登记native方法。
- 真正执行的时候,通过本地方法接口(JNI)执行。
- 产生原因:java诞生之初C/C++横行,想要立足,必须要有调用C/C++的程序。
- 作用:扩展Java的使用,融合不同的编程语言为java使用。以及操作硬件。
- 例如java程序驱动打印机,管理系统,native在企业开发中较为少见。
- 方法区存放:static(静态变量)、final(常量)、Class(类信息)、常量池
栈
- 本质是:数据结构;
- 程序=算法+数据结构;(非框架+业务逻辑)
- 栈:先进后出,后进先出;队列:先进先出(FIFO),喝多了吐就是栈,吃多了拉就是队列。
- 栈内存主管程序的运行,生命周期和线程同步。线程结束,栈内存也即释放,对于栈来说,不存在垃圾回收的问题,一旦线程结束,栈也就结束了。
- 栈内存放:8大基本类型+对象引用+实例的方法。
堆
- Heap:一个JVM只有一个堆内存,堆内存的大小是可以调节的。
元空间:逻辑上存在,物理上不存在。
使用JProfiler工具分析OOM原因
GC算法
- 引用计数法
- 复制算法
- 好处:没有内存碎片
- 坏处:浪费部分内存空间,to区永远为空;
- 最佳使用场景:对象存活度较低的区域。
- 标记清除算法
- 标记压缩算法
- 总结:
- 内存效率:复制算法>标记清除算法>标记压缩算法
- 内存整齐度:复制算法= 标记压缩算法 > 标记清除算法
- 内存利用率:标记压缩算法>标记清除算法>复制算法
- GC分代收集算法:
- 年轻代(存活率低):复制算法
- 老年代(区域大,存活率高):标记清除+标记压缩混合实现
JMM
- JAVA Memory Model(JAVA内存模型)
- 作用:jvm对应于物理机,jmm对应于缓存一致性协议,用于定义数据读写的规则。