详细介绍一下 JVM 内存模型
根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。
具体可能会聊聊 jdk1.7 以前的 PermGen(永久代) 替换成 Metaspace(元空间)
1、原本永久代存储的数据:符号引用(Symbols)转移到了 native heap;字面量(interned strings)转移到了
java heap;类的静态变量(class statics)转移到了 java heap
2、Metaspace(元空间)存储的是类的元数据信息(metadata)
3、元空间的本质和永久代类似,都是对 JVM 规范中方法区的实现。不过元空间与永久代之间最大
的区别在于:元空间并不在虚拟机中,而是使用本地内存。
4、替换的好处:一、字符串存在永久代中,容易出现性能问题和内存溢出。二、永久代会为 GC 带
来不必要的复杂度,并且回收效率偏低。
讲讲什么情况下会出现内存溢出,内存泄漏?
内存泄漏的原因很简单:
1、对象是可达的(一直被引用)
2、但是对象不会被使用
常见的内存泄漏例子:
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());
}