1.什么情况发生栈内存溢出?
- 栈:线程私有,方法递归调用会出现栈内存溢出
2.jvm内存模型是怎么样?
- 线程私有内存:本地方法栈,栈,程序计数器
- 线程共享内存:堆(垃圾回收)
- 方法区:直接内存,元空间(常量池,类加载信息)
3.垃圾回收算法有哪些?
- 标记清除算法:1.标记,2.清除,缺点:有碎片,
- 标记整理法:1.标记,2整理,优点:无碎片
- 复制算法:无碎片
- 分代收集算法
4.如何判断对象是否存活?
- 引用计数法
- 可达性分析
5.CMS和G1的区别?
- CMS:标记清除算法
- G1:标记整理,复制算法
6.类加载器有哪些,类加载过程是怎样?
- 启动类加载器,扩展类加载器,系统类加载器,自定义类加载器
- 加载过程:加载(方法区生产class文件),验证,准备(分配内存),解析,初始化(在堆中生成对象),使用,卸载。
7.为什么需要双亲委派机制?如何打破双亲委派?
- 父类加载器先加载,自定义类加载器可以打破双亲委派机制
8.如何优化JVM?
- 问题:CPU100% 内存100% mysql,redis连接池100%,大对象无法释放
- 优化: 增加堆内存,减少标记停顿时长,bio转nio,优化对象(list)