JVM学习
1、jvm的架构图
2、类加载器作用:
双亲委派机制:
当Application ClassLoader 收到一个类加载请求时,他首先不会自己去尝试加载这个类,而是将这个请求委派给父类加载器Extension ClassLoader去完成。
当Extension ClassLoader收到一个类加载请求时,他首先也不会自己去尝试加载这个类,而是将请求委派给父类加载器Bootstrap ClassLoader去完成。
如果Bootstrap ClassLoader加载失败(在<JAVA_HOME>\lib中未找到所需类),就会让Extension ClassLoader尝试加载。
如果Extension ClassLoader也加载失败,就会使用Application ClassLoader加载。
如果Application ClassLoader也加载失败,就会使用自定义加载器去尝试加载。
如果均加载失败,就会抛出ClassNotFoundException异常。
3、本地方法栈
native:凡是带了native关键子的,说明java的作用范围达不到,回去调用底层c语言的库,会进入本地方法栈
调用本地方法本地接口JNI
JNI作用:扩展Java的使用,融合不同的变成语言为Java所用!最初:C,C++
Java诞生的时候,C、C++横行,想要立足,必须要有调用C、C++成程序,在最终执行的时候,加载本地方法库中的方法,
通过JNI.
Java程序驱动打印机,管理系统,Robat,企业级应用中较为少见
4、 寄存器
CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。
5、方法区
static finall (class信息)常量池,实例变量是在堆中与方法区无关。
6、栈
栈:先进后出-桶模型
main方法里面调用了test方法,test方法先结束,main最后结束。栈空代表方法结束。不存在垃圾回收问题。
队列:先进先出-管道模型
7、堆内存
两块survivor区,from和to,谁空谁是to。
添加命令:打印gc日志
-Xms8m -Xmx8m -XX:+PrintGCDetails
解决生产中oom错误
输出dump文件
-Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
通过JProfiler文件分析。
8、GC算法
1)、扫描算法:先扫描,把需要gc的对象标记,然后在对没有标记的对象清除
缺点:两次扫描严重浪费时间,会产生内存碎片
优点:不需要额外的空间
2)、扫描压缩:优化扫描算法,再一次扫描,像一端移动存活的对象
3)、复制算法:每次Eden区满了,轻量GC后,存活的对象进入一个幸存区(to区),然后会把另外一个
幸存区的(from区)的幸存对象复制到to区,from和to区交换。
缺点:浪费一块幸存区,to区
优点:不会产生内存碎片
4)引用计数法
对每个对象加个计数器,知道计数器为0就清除该对象,一般不用,如果大型项目都是数量庞大的对象,计数器会
严重消耗内存。
总结:
内存效率:复制算法>标记清除计算法>标记清除压缩
内存整齐度:复制算法>标记清除压缩>标记清除计算法
内存利用率:标记压缩算法=标记清除算法>复制算法
没有最好的算法,只有最合适的算法----GC:分代收集算法
年轻代:存活率低,使用复制算法
老年代:存活率高,区域大,标记清除(内存碎片不是太多)+标记清除压缩混合实现
------------恢复内容结束------------