面试阿里我居然倒在这一JVM面试题下

面试阿里我居然倒在这一JVM面试题下

 

面试阿里我居然倒在这一JVM面试题下

 

前言:java

面试阿里倒在了JVM垃圾回收机制,什么时候触发MinorGC等操做这道面试题下,回去从新刷了一遍常问的JVM面试题,特地整理出22道分享给你们。八月已经来临了,离跳槽高峰金九银十还远嘛,是时候为了跳槽为了高薪奋斗了,后续也会更新更多各方面的面试题,你们记得关注我哦,因为篇幅的限制本文只有前十个在文章中带答案,以后的须要答案的能够关注个人公众号 Java周某人面试

1.JVM内存分配算法

面试阿里我居然倒在这一JVM面试题下

 

面试阿里我居然倒在这一JVM面试题下

 

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() 会作什么事情?

最后重申一下欢迎作Java的工程师朋友们能够关注个人公众号 Java周某人 免费获取这写些面试题剩下的答案,还有更多免费的Java架构学习资料,其中覆盖了互联网的方方面面,期间碰到各类产品各类场景下的各类问题,但愿能够帮助你们扩展本身的技术广度和知识面。

记得必定要关注我哦,会不定时的福利赠送,包括整理的面试题,学习资料,源码等~~