Java虚拟机面试题

本文详细介绍了Java虚拟机的运行时区域,包括程序计数器、虚拟机栈、本地方法栈、堆和方法区。接着讨论了垃圾收集机制,如引用计数算法和可达性分析算法,以及何时触发Full GC。此外,还阐述了JVM中的类加载器(bootstrap、extension和application)以及双亲委派机制的工作原理,分析了其优势和可能需要打破此模型的情况。最后,简要提及了JVM调优、垃圾收集算法和垃圾收集器的相关内容。
摘要由CSDN通过智能技术生成
  1. JVM内存模型?
    Java虚拟机的运行时区域分为:程序计数器、虚拟机栈、本地方法栈、堆、方法区。五个部分。
    其中堆和方法区是线程公有的,其他部分是线程私有的。

  2. GC机制和原理?
    首先需要判断对象是否死亡。可以通过两种方式:引用计数算法、可达性分析算法。
    引用计数算法就是给每个对象分配一个引用计数器,每当对象被引用了一次,引用计数器+1。当引用计数器的值为0时,则判定为对象死亡进行垃圾回收。但是当两个对象相互引用时则永不为0。所以现在主流的使用中引用计数算法已经基本被淘汰了。
    可达性分析算法就是通过一些根节点Roots从上至下进行扫描,形成一个引用链。当某个对象没有与任何引用链相连时,则判定为对象死亡。

  3. 什么时候触发Full GC?
    当老年代内存不足时:例如要把一个大对象直接存入老年代,老年代最大的连续空间小于对象所需内存,发生Full GC。
    当永久代的内存不足时:老年代存放各种静态成员,常量,类… 在永久代请求内存得不到满足时发生Full GC。
    当分配担保失效时:老年代中最大的连续内存小于历史存入的内存,分配担保失效,进行Full GC。
    当老年代中的最大连续内存小于新生代的内存时发生Full GC。
    使用System.gc() 进行Full GC。

  4. JVM里的几种classloader,为什么会有多种?
    三种classloader:bootstrap classloader、extension classloader、application classloader。
    启动类加载器:负责加载Java中的核心类库
    扩展类加载器:负责加载Java中的扩展类库
    应用程序类加载器:负责加载Java中的自定义的类库
    如果没有自定义的类加载器,那么默认使用的就是应用程序类加载器(系统类加载器)

  5. 什么是双亲委派机制?
    双亲委派机制就是利用三个类加载器的层次结构形成的一种模型

  6. 介绍双亲委派机制的运作过程以及好处
    当一个类加载器收到类加载请求时,类加载器并不会尝试自己去加载这个类,而是委托它的父类加载器去加载这个类。以此类推最终会到bootstrap classloader中,如果父类加载器不能加载这个类,子类加载器才会尝试自己去加载这个类。
    优点:保证了类库的安全性。
    缺点:效率低。

  7. 什么情况下需要破坏双亲委派模型?
    在Java1.2之前的自定义的classloader
    当需要使用了父类加载器时,又需要使用到子类加载器的信息
    热点技术。把代码块当成外设。

  8. 常见的JVM调优方法有哪些?可以具体到调整哪个参数,调成什么值?
    不知道…

  9. 垃圾收集算法、垃圾收集器?
    算法:复制算法、标记 - 清除、标记 - 整理、分代收集算法。
    收集器:G1、CMS、Serial / Serial old、
    ParNew / ParNew Old、Parallel Scavenge

  10. class文件结构是如何解析的 ?
    很复杂…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值