- 类加载机制
- 双亲委派机制
- 类加载的过程
- 常见的垃圾回收算法及各自的问题
- 常见的垃圾回收器及常见的组合
- 讲一下JVM堆内存管理
栈上分配->TLAB->新声代、老年代->可达性分析->GC算法->所有垃圾回收器及其优缺点和特点 - 那到底多大的对象会被直接扔到老年代
- G1两个region不是连续的,而且之间还有可达的引用,我现在要回收其中一个,另一个会被怎么处理
- 听说过CMS的并发预处理和并发可中断预处理吗
- 引起GC的常见场景
- 扩容缩容会触发 CMS GC 之外,还有 Old 区达到回收阈值、MetaSpace 空间不足、Young 区晋升失败、大对象担保失败等几种触发条件
- 动态扩容造成的GC
- 服务刚启动时,最大空间剩余很多但依然频繁GC
- 原因:
- -Xms与-Xmx 设置不一致造成,在初始化时只会初始 -Xms 大小的空间存储信息,每当空间不够用时再向操作系统申请,这样的话必然要进行一次 GC,另外,如果空间剩余很多时也会进行缩容操作
- 解决:
- 尽量将成对出现的空间大小配置参数设置成固定的,如 -Xms 和 -Xmx,-XX:MaxNewSize 和 -XX:NewSize,-XX:MetaSpaceSize 和 -XX:MaxMetaSpaceSize 等
- System.gc() 会引发一次 STW 的 Full GC,对整个堆做收集
- MetaSpace 区 OOM
- MetaSpace 主要由 Klass Metaspace 和 NoKlass Metaspace 两大部分组成。
- Klass MetaSpace: 就是用来存 Klass 的,就是 Class 文件在 JVM 里的运行时数据结构,这部分默认放在 Compressed Class Pointer Space 中,是一块连续的内存区域,紧接着 Heap。Compressed Class Pointer Space 不是必须有的,如果设置了 -XX:-UseCompressedClassPointers,或者 -Xmx 设置大于 32 G,就不会有这块内存,这种情况下 Klass 都会存在 NoKlass Metaspace 里。
- NoKlass MetaSpace: 专门来存 Klass 相关的其他的内容,比如 Method,ConstantPool 等,可以由多块不连续的内存组成。虽然叫做 NoKlass Metaspace,但是也其实可以存 Klass 的内容,上面已经提到了对应场景
- 什么时候需要自定义类加载器
- 要做资源隔离: 在某些框架内进行中间件与应用模块的隔离,如tomcat的类加载
- 要修改类加载方式:双亲委派模型并非强制,除Bootstrap外,其他的加载并非一定要引入
- 要扩展类的加载源:例如从数据库,网络中加载类
- 防止源码泄漏: 对编译进行加密后,自定义类加载器还原字节码
- 如何自定义类加载器
- 继承ClassLoader类
- 重写findClass()方法
评论区