文章目录
JVM的位置JVM的体系结构类加载器及双亲委派机制沙箱安全机制native、方法区栈堆使用JProfiler工具分析OOM原因GC算法JMM
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对应于缓存一致性协议,用于定义数据读写的规则。