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:分代收集算法

年轻代:存活率低,使用复制算法

老年代:存活率高,区域大,标记清除(内存碎片不是太多)+标记清除压缩混合实现

 

------------恢复内容结束------------

posted @ 2021-06-14 09:42  傲云萧雨  阅读(24)  评论(0编辑  收藏  举报