目录
2、说一下JVM内存结构(Java内存结构/Java内存区域)、Java内存模型区别与关系
7、类加载为什么要使用双亲委派模式,有没有什么场景是打破了这个模式?
10、JVM 中一次完整的 GC 流程(从 ygc 到 fgc)是怎样的
13、stackoverflow错误,permgen space错误
1、详细介绍一下JVM内存模型
根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。
具体可能会聊聊jdk1.7以前的PermGen(永久代),替换成Metaspace(元空间)
- 原本永久代存储的数据:符号引用(Symbols)转移到了native heap;字面量(interned strings)转移到了java heap;类的静态变量(class statics)转移到了java heap
- Metaspace(元空间)存储的是类的元数据信息(metadata)
- 元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。
- 替换的好处:一、字符串存在永久代中,容易出现性能问题和内存溢出。二、永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。
图片来源:https://blog.youkuaiyun.com/tophawk/article/details/78704074
参考资料:
2、说一下JVM内存结构(Java内存结构/Java内存区域)、Java内存模型区别与关系
参考:https://blog.youkuaiyun.com/Soinice/article/details/98038991
3、讲讲什么情况下会出现内存溢出,内存泄漏?
内存泄漏的原因很简单:
- 对象是可达的(一直被引用)
- 但是对象不会被使用
常见的内存泄漏例子:
public static void main(String[] args) {
Set<Object> set = new HashSet<>();
for (int i = 0; i < 10; i++) {
Object object = new Object();
set.add(object);
// 设置为空,该对象不再使用
object = null;
}
// 但是set集合中还维护object的引用,gc不会回收object对象
System.out.println(set);
System.out.println(set.size());
}
}
输出结果
[java.lang.Object@74a14482,
java.lang.Object@677327b6,
java.lang.Object@6d6f6e28,
java.lang.Object@4554617c,
java.lang.Object@45ee12a7,
java.lang.Object@1b6d3586,
java.lang.Object@7f31245a,
java.lang.Object@135fbaa4,
java.lang.Object@1540e19d,
java.lang.Object@14ae5a5]
10
Process finished with exit code 0
解决这个内存泄漏问题也很简单,将set设置为null,那就可以避免上述内存泄漏问题了。其他内存泄漏得一步一步分析了。
内存泄漏参考资料:
内存溢出的原因:
- 内存泄露导致堆栈内存不断增大,从而引发内存溢出。
- 大量的jar,class文件加载,装载类的空间不够,溢出
- 操作大量的对象导致堆内存空间已经用满了,溢出
- nio直接操作内存,内存过大导致溢出
解决:
- 查看程序是否存在内存泄漏的问题
- 设置参数加大空间
- 代码中是