我以为我很了解JVM,直到我遇见了阿里面试官

1.JVM内存分配

1.jpg

2.jpg

2.JVM的主要组成部分及其作用?

  • 类加载器 ClassLoader:Java代码 -----> 字节码 的编译过程

  • 运行时数据区:把上一步编译得到的字节码加载到内存中

  • 执行引擎:命令解析器,解析上一步加载而来的字节码,翻译成为系统指令,交由CPU执行

  • 本地库接口 Native Interface:诸如IO之类的由其他语言写成的本地库接口

3.JVM运行时数据区包含哪些?

  • 程序计数器:行号指示器,通过改变该值,以选取下一步的指令

  • Java虚拟机栈:局部变量、方法出口等,为JVM服务

  • 本地方法栈:局部变量、方法出口等,为本地Native方法服务

  • 堆区:内存最大的一块,所有的对象实例都在这里分配内存

  • 方法区:常量、静态变量等

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

  • 分代垃圾回收机制:不同的对象生命周期不同。把不同生命周期的对象放在不同代上,不同代上采用最合适它的垃圾回收方式进行回收。

  • JVM总共划分为三个代:年轻代、年老代和持久代,

  • 年轻代:存放所有新生成的对象;

  • 年老代:在年轻代中经历了N次垃圾回收仍然存活的对象,将被放到年老代中,故都是一些生命周期较长的对象;

  • 持久代:用于存放静态文件,如Java类、方法等。

新生代的垃圾收集器命名为“minor gc”,老生代的GC命名为”Full Gc 或者Major GC”.其中用System.gc()强制执行的是Full Gc.

判断对象是否需要回收的方法有两种:

1.引用计数

当某对象的引用数为0时,便可以进行垃圾收集。

2.对象引用遍历

果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集。在对象遍历阶段,gc必须记住哪些对象可以到达,以便删除不可到达的对象,这称为标记(marking)对象。

触发GC(Garbage Collector)的条件:

  1. GC在优先级最低的线程中运行,一般在应用程序空闲即没有应用线程在运行时被调用。

  2. Java堆内存不足时,GC会被调用。

5.JVM的垃圾回收算法:

  • 标记-清除:无用对象全部干掉

  • 标记-整理:有用对象都向一边移动,边界以外的全部干掉

  • 复制算法:左边内存快满时,将其中要保留的对象复制到右边内存中,然后整体干掉左边内存。右边同理,内存利用率仅有一半

  • 分代算法:根据对象存活周期的不同将内存划分为几块,一般是新生代和老年代,新生代基本采用复制算法,老年代采用标记整理算法。

6.JVM 调优的工具?

JDK 自带了很多监控工具,都位于 JDK 的 bin 目录下,其中最常用的是 jconsole 和 jvisualvm 这两款视图监控工具。

• jconsole:用于对 JVM 中的内存、线程和类等进行监控;

• jvisualvm: JDK 自带的全能分析工具,可以分析:内存快照、线程快照、程序死锁、监控内存的变化、 gc 变化等。

7.常用的JVM调优参数?

• -Xms2048M最小内存2048M

• -Xmx2048M最大内存2048M

• -XX:NewRatio=4设置年轻的和老年代的内存比例为 1:4

• -XX:SurvivorRatio=8设置新生代 Eden 和 Survivor 比例为 8:2

• -XX:+UseConcMarkSweepGC指定使用 CMS + Serial Old 垃圾回收器组合;

• -XX:+PrintGC开启打印 gc 信息;

• -XX:+PrintGCDetails打印 gc 详细信息。

8.堆栈的区别?

  • 栈内存存储的是局部变量,堆内存存储的是实体;

  • 栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;

  • 栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

9.详细介绍一下 CMS 垃圾回收器?

CMS 是英文 Concurrent Mark-Sweep 的简称,是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动 JVM 的参数加上“-XX:+UseConcMarkSweepGC”来指定使用 CMS 垃圾回收器。

CMS 使用的是标记-清除的算法实现的,所以在 gc 的时候会产生大量的内存碎片,当剩余内存不能满足程序运行要求时,系统将会出现 Concurrent Mode Failure,临时 CMS 会采用 Serial Old 回收器进行垃圾清除,此时的性能将会被降低。

10.怎么判断对象是否可以被回收?

  • 引用计数器:为每个对象创建一个引用计数,有对象引用时计数器 +1,引用被释放时计数 -1,当计数器为 0 时就可以被回收。它有一个缺点不能解决循环引用的问题;

  • 可达性分析:从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是可以被回收的。

11.新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?

12.GC的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?

13.java类加载过程?

14.什么是类加载器,类加载器有哪些?

15.Eden和Survivor的比例分配等

16.volatile的语义,它修饰的变量一定线程安全吗

17.JVM 对象创建步骤流程是什么?

18.什么是 Class 文件? Class 文件主要的信息结构有哪些?

19.什么是内存溢出,内存泄漏

20.如何阻止内存泄漏?

21.垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗? 有什么办法主动通知虚拟机进行垃圾回收?

22.深拷贝和浅拷贝。

23.System.gc() 和 Runtime.gc() 会做什么事情?


猜你喜欢

转载自blog.51cto.com/14849432/2513506