JVM面试题及答案

  • JVM运行时内存区域划分
  1. 程序计数器:主要是保存程序执行的下一跳指令的地址
  2. 虚拟机栈:主要是处理java代码中的方法,每个方法的执行都会创建一个对应的栈帧,每个方法从开始执行到执行完毕,对应的就是栈帧的出栈和入栈。包含局部变量表,操作数栈,动态链接,方法出口。局部变量表中主要存储基本数据类型以及对象的引用。局部变量表在代码编译期间大小就已经确定。

   会出现两种异常:内存溢出和栈溢出

当线程请求的栈深度大于虚拟机所容许的最大深度,则会抛出StackOverFlowError异常。如果栈的深度是可以动态变化的,当扩展到无法申请到足够的内存空间时,则抛出OutOfMemeryError

  1. 本地方法栈:Native方法,起作用和java虚拟机栈类似

以上三个都是线程私有的,垃圾回收器不会回收这三个区域

  1. 方法区:主要存放类信息,常量,静态变量,运行池常量池
  2. 堆:存放对象实例;垃圾回收的主要区域
  • 如何判断对象是否可以回收或存活

GCRoots:通过一系列名为“GC ROOTS”对象作为起始节点,从这些节点向下搜索,搜索所走过的路径称为引用链,当一个对象到GC ROOTS没有任何引用链相连时,则证明该对象不可用。

可作为GC ROOTS的对象有一下几种:

  1. java虚拟机栈中的局部变量表中的引用的对象
  2. 方法区的静态属性引用的对象
  3. 方法区的常量引用的对象
  4. 本地方法栈中JNI引用的对象

   但是一次没有引用链相连是不能够确定该对象是一定不可用的,还要看finalize()方法是否有必要执行。该对象没有实现finalize方法或者虚拟机已经调用过该方法,都认为该方法没有必要执行,即回收该对象。如果该对象实现了finalize方法且没使用过,虚拟机则会根据finalize方法中是否有该对象的引用,没有则回收,有了则不回收。(finalize维护一个队列,虚拟机会启动低优先级的线程去执行,但是并不保证该线程能执行完成,目的确保线程的安全)

  • 常见的GC回收算法及其含义
  1. 标记清除:会产生大量的内存碎片
  2. 标记整理:主要用于老年代
  3. 复制算法:内存利用率不高;主要使用在新生代中
  4. 分代算法
  • 常见的JVM性能监控和故障处理工具类:jps、jstat、jmap、jinfo、jconsole等
  •  
  • JVM如何设置参数

-xx

-xss

  • JVM性能调优
  • 类加载器、双亲委派模型、一个类的生命周期、类是如何加载到JVM中的
  • 类加载的过程:加载、验证、准备、解析、初始化
  • 强引用、软引用、弱引用、虚引用
  • Java内存模型JMM
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 什么是JVMJVMJava Virtual Machine)是Java虚拟机的缩写,是Java程序运行的环境。 2. JVM的组成部分有哪些? JVM由类加载器、运行时数据区、执行引擎和本地库接口组成。 3. 类加载器有哪些? 类加载器有三种:启动类加载器、扩展类加载器和应用程序类加载器。 4. 什么是类加载器? 类加载器是Java虚拟机的一个组成部分,它负责将类文件加载到JVM中。 5. 什么是类加载器的双亲委派模型? 类加载器的双亲委派模型是一种类加载器的层级结构,当一个类需要被加载时,它的父类加载器会先尝试加载这个类,如果父类加载器不能加载这个类,它才会把这个请求传给子类加载器。 6. 什么是内存泄漏? 内存泄漏是指应用程序在运行时未能及时释放无用的内存,导致内存空间的浪费和程序性能的下降。 7. JVM中的运行时数据区有哪些? JVM中的运行时数据区有程序计数器、虚拟机栈、本地方法栈、堆和方法区。 8. 什么是程序计数器? 程序计数器是一块较小的内存空间,它用于保存当前线程执行的字节码指令地址。 9. 什么是虚拟机栈? 虚拟机栈是一块内存空间,用于保存方法执行时的局部变量表、操作数栈、动态链接、方法出口等信息。 10. 什么是本地方法栈? 本地方法栈是一块内存空间,用于支持JVM调用本地方法的功能。 11. 什么是堆? 堆是JVM中最大的一块内存空间,用于存放对象实例和数组等数据。 12. 什么是方法区? 方法区是一块内存空间,用于存放类的元数据信息、常量池、静态变量、方法信息等。 13. JVM中的垃圾回收算法有哪些? JVM中的垃圾回收算法有标记-清除算法、复制算法、标记-整理算法和分代算法等。 14. 什么是标记-清除算法? 标记-清除算法是一种垃圾回收算法,它分为标记和清除两个阶段,先标记出所有需要回收的对象,然后再回收这些对象所占用的内存空间。 15. 什么是复制算法? 复制算法是一种垃圾回收算法,它将堆空间分为两个相等的区域,每次只使用其中一个区域,当这个区域用完时,将其中的存活对象复制到另一个区域中,然后清空原来的区域。 16. 什么是标记-整理算法? 标记-整理算法是一种垃圾回收算法,它先标记出所有需要回收的对象,然后将存活对象往一端移动,然后将空闲的内存空间清理掉。 17. 什么是分代算法? 分代算法是一种垃圾回收算法,它将堆空间分为新生代和老年代两个区域,新生代内存空间小,存活时间短,采用复制算法;老年代内存空间大,存活时间长,采用标记-清除算法或标记-整理算法。 18. 什么是强引用? 强引用是指在程序中直接定义的引用类型变量,只要强引用存在,垃圾回收器就不会回收被引用的对象。 19. 什么是软引用? 软引用是一种相对弱化的引用类型,如果JVM内存空间不足,垃圾回收器会回收被软引用引用的对象。 20. 什么是弱引用? 弱引用是一种更弱化的引用类型,它的引用对象只要没有被强引用或软引用所引用,就会被垃圾回收器回收。 21. 什么是虚引用? 虚引用是一种最弱化的引用类型,它本身并不能引用对象,它的作用是在对象被回收时收到一个通知。 22. 什么是类的生命周期? 类的生命周期包括加载、验证、准备、解析、初始化、使用和卸载等阶段。 23. 什么是类的加载阶段? 类的加载阶段是指将类的字节码文件加载到JVM中,并生成一个对应的Class对象。 24. 什么是类的验证阶段? 类的验证阶段是指对类的字节码文件进行验证,以确保它符合JVM规范。 25. 什么是类的准备阶段? 类的准备阶段是指为类的静态变量分配内存,并赋予默认值。 26. 什么是类的解析阶段? 类的解析阶段是指将类的符号引用转换为直接引用。 27. 什么是类的初始化阶段? 类的初始化阶段是指执行类的静态初始化代码块。 28. 什么是类的使用阶段? 类的使用阶段是指使用类的方法或变量。 29. 什么是类的卸载阶段? 类的卸载阶段是指将类从JVM中卸载,释放内存空间。 30. 什么是JVM调优? JVM调优是指通过调整运行时数据区、垃圾回收算法、内存分配策略等方式,优化JVM的性能和稳定性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值