Java虚拟机面试题

Java虚拟机面试题

1、简述一下JVM的内存结构?(高频)

JVM在执行Java程序时,会把它管理的内存划分为若干个的区域,每个区域都有自己的用途和创建销毁时间。如下图所示,可以分为两大部分,线程私有区和共享区。
在这里插入图片描述

2、堆和栈的区别?(高频)

① 功能不同:栈内存用来存储局部变量和方法调用,而堆内存用来存储Java中的对象。无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。

② 共享性不同:栈内存是线程私有的。堆内存是所有线程共有的。

③ 异常错误不同:如果栈内存或者堆内存不足都会抛出异常。栈空间不足:java.lang.StackOverFlowError。堆空间不足:java.lang.OutOfMemoryError。

④ 空间大小:栈的空间大小远远小于堆的。

3、如何判断一个对象是否为垃圾?(高频)

两种算法:

① 引用计数法:堆中每个对象实例都有一个引用计数。当一个对象被创建时,且将该对象实例分配给一个变量,该变量计数设置为1。当任何其它变量被赋值为这个对象的引用时,计数加1(a = b,则b引用的对象实例的计数器+1),但当一个对象实例的某个引用超过了生命周期或者被设置为一个新值时,对象实例的引用计数器减1。任何引用计数器为0的对象实例可以被当作垃圾收集。
特点:简单、无法解决循环引用问题

② 可达性分析算法 : 可达性分析算法又叫做跟搜索法,就是通过一系列的称之为"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径被称为(Reference Chain),当一个对象到GC Roots没有任何引用链相连时(即从GC Roots节点到该节点不可达),则证明该对象是不可用的。

4、可达性算法中,哪些对象可作为GC Roots对象?(高频)

可以作为GC ROOTS对象的情况:

1、虚拟机栈中引用的对象

2、方法区静态成员引用的对象

3、方法区常量引用对象

4、本地方法栈引用的对象

5、Java中都有哪些引用类型?(高频)

① 强引用

只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,不会去回收。

② 软引用

软引用是用来描述一些非必需但仍有用的对象。在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回

收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。这种特性常常被用来实现缓存技术,比如网页缓存,图片缓存等。在 JDK1.2 之后,用java.lang.ref.SoftReference类来表示软引用。

③ 弱引用

弱引用的引用强度比软引用要更弱一些,无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收。在 JDK1.2之后,用java.lang.ref.WeakReference来表示弱引用。

④ 虚引用

虚引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收

5、常见的垃圾回收算法都有哪些?(高频)

① 标记清除

② 标记整理

③ 复制算法

④ 分代回收

6、对象在内存中是如何进行分配的?(高频)

① 对象优先在Eden分配:对象优先在『伊甸园』分配,当『伊甸园』没有足够的空间时,触发 ‘Minor GC’(小范围的GC)

② 大对象直接晋升至老年代

7、常见的垃圾收集器都有哪些?(高频)

常见的垃圾收集器如下所示:

在这里插入图片描述

不同的垃圾收集器,作用的堆内存空间是不一样的;上面的 serial , parnew , Paraller Scavenge 是新生代的垃圾回收
器;CMS , Serial Old , Paralle Old是老年代的垃圾收集器 , G1垃圾收集器可以作用于新生代和老年代; 连线表示垃圾收集器可以搭配使用;

① Serial

特点:

  1. Serial是一个单线程的垃圾收集器
  2. “Stop The World”,它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。在用户不可见的情况下把用户正常工作的线程全部停掉。

应用场景:

  1. 使用场景:多用于桌面应用,Client端的垃圾回收器
  2. 桌面应用内存小,进行垃圾回收的时间比较短,只要不频繁发生停顿就可以接受

Serial Old收集器是Serial的老年代版本和Serial一样是单线程,使用的算法是"标记-整理"

② ParNew

概述: ParNew 收集器其实就是 Serial 收集器的多线程版本

特点:

1、会触发stop the world

2、多线程方式进行垃圾回收

应用场景:它却是许多运行在 Server 模式下的虚拟机中首选的新生代收集器

注意:如果是单核cpu即使使用该垃圾回收器也无法提高执行效率

③ Parallel Scavenge

概述:Parallel Scavenge 收集器是一个新生代收集器,它也是使用复制算法的收集器,又是并行的多线程收集器

特点:由于与吞吐量关系密切,Parallel Scavenge 收集器也经常称为“吞吐量优先”收集器

所谓吞吐量就是 CPU 用于运行用户代码的时间与 CPU 总消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间),虚拟机总共运行了 100 分钟,其中垃圾收集花掉 1 分钟,那吞吐量就是 99% 应用场景: 高吞吐量则可以高效率地利用 CPU 时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。

④ CMS(重点)

概述:CMS (Concurrent Mark Sweep)收集器是-种以获取最短回收停顿时间为目标的收集器。

特点:

  1. CMS 收集器是基于“标记-清除”算法实现的

  2. 目前很大一部分的Java应用集中在互联网站或者B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用

    户带来较好的体验。

CMS垃圾收集器执行流程:

  • 初始标记(CMS initial mark) -------- 标记一下 GC Roots 能直接关联到的对象,速度很快(stop the world)
  • 并发标记(CMS concurrent mark) -------- 对初始标记标记过的对象,进行trace(进行追踪,得到所有关联的对象,进行标记)
  • 重新标记(CMS remark) -------- 为了修正并发标记期间因用户程序导致标记产生变动的标记记录(stop the world)
  • 并发清除(CMS concurrent sweep)

缺点:会产生垃圾碎片

⑤ G1

概述: G1是一个分代的,并行与并发的"标记-整理"垃圾回收器。 它的设计目标是为了适应现在不断扩大的内存和不断增加的处理器数量,进一步降低暂

停时间(pause time),同时兼顾良好的吞吐量。

相比于CMS:

  1. G1垃圾回收器使用的是"标记-整理",因此其回收得到的空间是连续的。

  2. G1回收器的内存与CMS回收器要求的内存模型有极大的不同。G1将内存划分一个个固定大小的region,每个region可以是年轻代、老年代的一个。内

    存的回收是以region作为基本单位的;

8、什么是类加载器,类加载器有哪些?(高频)

类加载器的作用:负载将的class文件加载到java虚拟机中,并为之创建一个Class对象从Java虚拟机的角度来讲,只存在如下两种不同的类加载器:

  1. 启动类加载器(Bootstrap ClassLoader), 这个类加载器使用C++语言实现,是虚拟机自身的一部分
  2. 其他类加载器,这些类加载器都由Java语言实现,独立于虚拟机外部,并且全部都继承自抽象类(java.lang.ClassLoader)

从Java开发人员的角度来讲,类加载器还可以划分的更细致一下,绝大部分Java程序都会使用到以下3种系统提供的类加载器:

  1. 启动类加载器(Bootstrap class loader):它是虚拟机的内置类加载器,通过表示为null

  2. 平台类加载器(Platform class loader) :它是平台类加载器; 负责加载JDK中一些特殊的模块;

  3. 系统类加载器(System class loader) :它也被称为应用程序类加载器, 它负责加载用户类路径上所指定的类库,一般情况下这个就是程

    序中默认的类加载器

9、Java的双亲委托机制是什么?(高频)

概述

我们的应用程序都是由这三种类加载器互相配合进行加载的,如果有必要,还可以加入自定义的类加载器。这些类加载器之间的层次关系一般

会如下图所示:

在这里插入图片描述

上图所展示的类加载器之间的这种层次关系,就称之为类加载器的双亲委派模型。双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应该有自己的父类加载器。这里的类加载器的父子关系不是真正物理意义上的继承,而是逻辑上的继承。

工作过程

双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己尝试加载这个类,而是把这请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父类加载器返回自己无法完成这个加载请求(它的搜索返回中没有找到所需的类)时,子类加载器才会尝试自己去加载。

10、调优命令有哪些?

1、jps,JVM Process Status Tool显示指定系统内所有的HotSpot虚拟机进程。

2、jstat,JVM statistics Monitoring是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运

3、jmap,JVM Memory Map命令用于查看堆内存的分配情况以及生成heap dump文件

4、jhat,JVM Heap Analysis Tool命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的

5、jstack,用于生成java虚拟机当前时刻的线程快照。

6、jinfo,JVM Configuration info 这个命令作用是实时查看和调整虚拟机运行参数

11、你知道哪些JVM性能调优参数?(高频)

1、设定堆内存大小:

​ -Xms 设置最小堆内存大小(不能小于1024K); -Xms 堆内存初始大小,可以通过jmap工具进行查看

​ -Xmx 设置最大堆内存大小(不能小于1024K); -Xmx 堆内存最大值,可以通过jmap工具进行查看

2、设定新生代大小:

​ -XX:NewSize:新生代大小

​ -XX:NewRatio 新生代和老生代占比

3、-XX:SurvivorRatio:伊甸园空间和幸存者空间的占比

4、设定垃圾回收器

​ 年轻代用 -XX:+UseParNewGC

​ 年老代用-XX:+UseConcMarkSweepGC

12、你用过哪些性能调优工具?(高频)

常用调优工具分为两类

1、jdk自带监控工具

  • jconsole,Java Monitoring and Management Console是从java5开始,在JDK中自带的java监控和管理控制台,用于对JVM中内存,线程和类

    等的监控

  • jvisualvm,jdk自带全能工具,可以分析内存快照、线程快照;监控内存变化、GC变化等。

2、第三方

  • MAT,Memory Analyzer Tool,一个基于Eclipse的内存分析工具,是一个快速、功能丰富的Java heap分析工具,它可以帮助我们查找

    内存泄漏和减少内存消耗

  • GChisto,一款专业分析gc日志的工具

13、你都有哪些手段用来排查内存溢出?(高频)

内存溢出包含很多种情况,我在平常工作中遇到最多的就是堆溢出。有一次线上遇到故障,重新启动后,使用jstat命令,发现Old区在一直增长。我使用jmap命令,导出了一份线上堆栈,然后使用MAT进行分析。通过对GC Roots的分析,我发现了一个非常大的HashMap对象,这个原本是有位同学做缓存用的,但是一个无界缓存,造成了堆内存占用一直上升。后来,将这个缓存改成 Guava Cache,并设置了弱引用,故障就消失了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、什么是JVM  JVM是Java Virtual Machine(Java虚拟)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算,是通过在实际的计算上仿真模拟各种计算功能来实现的。Java虚拟包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的器指令执行。  Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟在执行字节码时,把字节码解释成具体平台上的器指令执行。这就是Java的能够“一次编译,到处运行”的原因。二、JVM的组成我们先把JVM这个虚拟画出来,如下图所示:从这张图中我们可以看出,JVM是运行在操作系统之上的,它与硬件没有直接的交互,我们再来看JVM由哪些部分组成,如下图所示:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值