JVM之JVM面试题整理(长期更新)

目录

1、详细介绍一下JVM内存模型

2、说一下JVM内存结构(Java内存结构/Java内存区域)、Java内存模型区别与关系

3、讲讲什么情况下会出现内存溢出,内存泄漏?

4、说说线程栈

5、JVM 年轻代到年老代的晋升过程的判断条件是什么呢?

6、JVM 出现 fullGC 很频繁,怎么去线上排查问题

7、类加载为什么要使用双亲委派模式,有没有什么场景是打破了这个模式?

8、类的实例化顺序

9、JVM垃圾回收机制,何时触发MinorGC等操作

10、JVM 中一次完整的 GC 流程(从 ygc 到 fgc)是怎样的

11、各种回收算法

12、各种回收器,各自优缺点,重点CMS、G1

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直接操作内存,内存过大导致溢出

解决:

  • 查看程序是否存在内存泄漏的问题
  • 设置参数加大空间
  • 代码中是
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值