目录
1、JMM相关概念
JMM是内存模型,目的是为了屏蔽各种硬件和操作系统之间的内存访问差异,从而让java程序在各种平台对内存访问一致。JMM不是实际存在的,与JVM没有什么关系。
2、JVM内存模型
线程共享区:
·堆:对象实例存放地、垃圾收集器主要区域、容易出现OOM
·方法区:JDK1.7及之前叫永久代,之后叫元空间;存储类型信息、常量、静态变量、编译后代码;JDK1.8前存在常量池,之后在内存中
·直接内存
线程私有区域:
·程序计数器:存放java字节码地址,不会产生OOM
·虚拟机栈
·本地方法栈
3、堆栈的区别
堆:物理地址分配不连续,存放对象实例和数组,是线程共享的
栈:物理地址分配连续,存放局部变量、操作数栈、返回结果等,是线程私有的
4、java的内存分配策略
指针碰撞:当内存规整,使用一个指针作为分界值
空闲列表:当内存不规整,使用列表记录
5、对象访问定位的方法
使用句柄:referenece中存储的是稳定的句柄地址,对象移动reference不需要修改
直接指针:速度快,节省了一次指针定位的开销
6、GC如何判断对象可以被回收(判断对象存活情况)
·引用计数法:可能存在对象相互引用问题
·可达性分析法
7、垃圾回收算法的类别
·标记-清除法:标记后清除
·标记-复制法:将内存分成两部分,使用一半,空闲一半,一次清理
·标记-整理法:与标记-清除法相似
·分代收集算法:根据新生代和老年代分配不同的算法,新生代对象存活率低,使用标记-赋值法,老年代存活率高使用标记-清理或标记-整理法
8、垃圾回收器类别
9、STW是什么
STW是stop-the-world,指在回收期间会产生应用程序的停顿
10、内存分配策略
·对象优先在Eden分配:当空间不够时,触发Minor GC
·大对象直接进入老年代:使用JVM 参数 -XX:PretenureSizeThreshold来设置值,大于该值视为大对象
·长期存活的对象进入老年代:每通过一次Minor GC,年龄增加一岁,可以通过参数 -XX:MaxTenuringThreshold设置阈值
·动态对象年龄判断:相同年龄对象大小总和大于Survivor 空间的一半可直接进入老年代
·空间分配担保:判断老年代最大连续空间是否大于新生代所有对象总空间,如果不成立增判断 HandlePromotionFailure 的值是否允许担保,允许则检查老年代最大可用连续空间是否大于历次晋升老年代对象平均大小,大于则尝试进行Minor GC,小于或者不允许担保进行 Full GC。
11、内存泄漏的解决
·使用静态内部类
·退出程序前,清除集合容器的东西,将置为null,避免集合容器的内存泄漏
12、Minor GC和Full GC区别
Minor GC:回收新生代,执行比较频繁,速度快
Full GC:回收老年代和新生代,很少执行,速度慢
13、Full GC的触发条件
·调用System.gc()
·老年代空间不足
·空间分配担保是失败
·JDK1.7以前的永久代空间不足
14、类的加载器