JVM入门
jvm的位置
位于操作系统之上
jvm的体系结构
类加载器
应用类加载器:AppClassLoader
扩展加载器:ExtClassLoader (jre/lib/ext/)
根加载器:null,java程序获取不到,(rt.jar)
Native关键字
双亲委派机制
先从根加载器里找,找不到去扩展类加载器,然后再去应用类加载器
面试问题
-
为什么需要双亲委派机制?(也就是双亲委派的优点)
①双亲委派机制使得类加载出现层级,父类加载器加载过的类,子类加载器不会重复加载,可以防止类重复加载;
②使得类的加载出现优先级,防止了核心API被篡改,提升了安全,所以越基础的类就会越上层进行加载,反而一般自己的写的类,就会在应用程序加载器(Application)直接加载。
-
如何打破双亲委派?
②使用线程上下文类加载器
堆分区
-
新生区:类诞生和成长的地方,刚new的对象都在这。
轻GC也没有干掉的对象会进入幸存区
- 伊甸园区
- 幸存区from
- 幸存区to
-
养老区:从幸存区触发FULL GC还活着的会来到养老区
出现OOM,OutOfMemory
轻GC和重GC发生的时间。
-
轻GC:发生在伊甸园区满了的时候
-
重GC:发生在伊甸园区和幸存区都满了的时候
-
如果伊甸园区、幸存区、养老区都满了,就该OOM了,堆溢出
VM options参数
GC之复制算法:把from区的对象复制到to区
- 好处:没有内存碎片
- 坏处:浪费了内存空间,from和to区总有一个是空的
- 最佳使用场景:对象存活度较低的时候。也就是新生区
GC之标记清除算法
- 优点:不需要额外空间
- 缺点:两次扫描,严重浪费时间,会产生内存碎片
GC之标记压缩算法
- 在清除算法的基础上多了一次移动成本
总结:
年轻代:存活率低
- 复制算法
老年代:区域大,存活率高
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。