1. Java的内存模型以及GC算法
2. jvm性能调优都做了什么
3. 介绍JVM中7个区域,然后把每个区域可能造成内存的溢出的情况说明
4. 介绍GC 和GC Root不正常引用。
5. 自己从classload 加载方式,加载机制说开去,从程序运行时数据区,讲到内存分配,讲到String常量池,讲到JVM垃圾回收机制,算法,hotspot。反正就是各种扩展
6. jvm 如何分配直接内存, new 对象如何不分配在堆而是栈上,常量池解析
7. 数组多大放在 JVM 老年代(不只是设置 PretenureSizeThreshold ,问通常多大,没做过一问便知)
8. 老年代中数组的访问方式
9. GC 算法,永久代对象如何 GC , GC 有环怎么处理
10. 谁会被 GC ,什么时候 GC
11. 如果想不被 GC 怎么办
12. 如果想在 GC 中生存 1 次怎么办
答:在对象的finalize方法中重新建立引用,但是有一此方法只会被调用一次,所以能在GC中生存一次。
13.JVM调优工具
- Jconsole:用于堆JVM中的内存、线程和类等进行监控。
- Jstatic:用于查看线程信息,例如查看死锁问题。
- Jmap:查看堆内存使用情况,导出Java进程的内存快照文件,一般采用MAT工具分析文件
14.JVM中一次完整的GC流程是怎么样的,如何晋升到老年代?
- 对象先存储在Eden区,当Eden区满了后,Java虚拟机会触发一次MinorGC,以收集新生代的垃圾,存活下来的对象,则会转移到Survivor区。
- 大对象(需要大量连续内存空间的对象)直接进入老年代
- 如果对象在Eden出生,并且经过第一次MinorGC后仍存活,并且被Survivor容纳的话,年龄设为1,每熬过一次MinorGC,年龄+1,年龄超过一定限制(默认15),则被晋升到老年态,即长期存活的对象进入到老年代。
- 老年代满了后而无法容纳更多的对象,MinorGC之后通常会进行FullGC,FullGC清理整个内存堆,包括年轻代和年老代。
- MajorGC发生在老年代的GC,清理老年代,经常会伴随至少一次MinjorGC,比MinorGC慢10倍以上。