JVM相关
作者:互联网
JVM入门
jvm的位置
位于操作系统之上
jvm的体系结构
类加载器
应用类加载器:AppClassLoader
扩展加载器:ExtClassLoader (jre/lib/ext/)
根加载器:null,java程序获取不到,(rt.jar)
Native关键字
表示调用底层的C函数
双亲委派机制
先从根加载器里找,找不到去扩展类加载器,然后再去应用类加载器
面试问题
-
为什么需要双亲委派机制?(也就是双亲委派的优点)
①双亲委派机制使得类加载出现层级,父类加载器加载过的类,子类加载器不会重复加载,可以防止类重复加载;
②使得类的加载出现优先级,防止了核心API被篡改,提升了安全,所以越基础的类就会越上层进行加载,反而一般自己的写的类,就会在应用程序加载器(Application)直接加载。
-
如何打破双亲委派?
①自定义类加载器,重写loadClass方法
②使用线程上下文类加载器
堆分区
-
新生区:类诞生和成长的地方,刚new的对象都在这。
轻GC也没有干掉的对象会进入幸存区
- 伊甸园区
- 幸存区from
- 幸存区to
-
养老区:从幸存区触发FULL GC还活着的会来到养老区
-
永久区(元空间):常驻内存,存放JDK自带的Class对象,这个区不存在垃圾回收。
出现OOM,OutOfMemory
轻GC和重GC发生的时间。
-
轻GC:发生在伊甸园区满了的时候
-
重GC:发生在伊甸园区和幸存区都满了的时候
-
如果伊甸园区、幸存区、养老区都满了,就该OOM了,堆溢出
VM options参数
-
-Xms 设置初始化内存分配大小,默认1/64
-
-Xmx 设置最大分配内存,默认1/4
-
-XX:+PrintGCDetails 打印GC垃圾回收信息
-
-XX:+HeapDumpOnOutOfMemoryError 生成oomDump文件
-
-Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
-
-Xms1024m -Xmx1024m -XX:+PrintGCDetails
-
GC之复制算法:把from区的对象复制到to区
- 好处:没有内存碎片
- 坏处:浪费了内存空间,from和to区总有一个是空的
- 最佳使用场景:对象存活度较低的时候。也就是新生区
GC之标记清除算法
- 优点:不需要额外空间
- 缺点:两次扫描,严重浪费时间,会产生内存碎片
GC之标记压缩算法
- 在清除算法的基础上多了一次移动成本
总结:
年轻代:存活率低
- 复制算法
老年代:区域大,存活率高
- 标记清除(内存碎片不是太多) + 标记压缩混合实现
标签:双亲,XX,幸存,GC,内存,JVM,相关,加载 来源: https://www.cnblogs.com/zyk98/p/14587902.html