JAVA 基础 之 JVM面试题知识点梳理(1)

JAVA 基础 之 JVM面试题知识点梳理(1)

JVM面试题主要考察知识点

  • 内存模型,主要考察JVM的内存结构,各个结构的定义、作用以及可能会出现的问题(Eg:栈溢出)
    • PC寄存器
    • Java虚拟机栈 -> 存放基本数据类型、对象的引用、方法出口等,线程私有
    • 本地方法栈 -> 和虚拟栈相似,只不过它服务于Native方法,线程私有
    • Java堆(Heap) -> Java内存最大的一块,所有对象实例、数组都存放在java堆,GC回收的地方,线程共享
    • 程序计数器 -> 当前线程所执行的字节码的行号指示器,用于记录正在执行的虚拟机字节指令地址,线程私有。
    • 方法区 -> 存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码数据等。(即永久带),回收目标主要是常量池的回收和类型的卸载,各线程共享

  • JVM内存的分代,主要考察年轻代、老年代、永久代各自的作用、GC的时机、如何设置调优参数、垃圾回收机制(GC)等等
    • 年轻代
    • 老年代
    • 永久代
  1. Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。
  2. 其中堆又分年轻代(young)和老年代(old),且年轻代还划分三个区**(Eden 、S0 、 S1)**。
  3. 年轻代GC当 Eden 区的空间满了, Java虚拟机会触发一次 Minor GC,以收集年轻代的垃圾,存活下来的对象,则会转移到 Survivor区,当Survivor区中的对象经历过一定次数的Minor GC就会进入到老年代【即长期存活的对象会进入老年代
  4. 大对象(需要大量连续内存空间的Java对象,如那种很长的字符串)直接进入老年态
  5. 老年代满了而无法容纳更多的对象时Minor GC 之后通常就会进行Full GCFull GC 清理整个内存堆 – 包括年轻代和年老代。
  6. Major GC 发生在老年代的GC,清理老年区,经常会伴随至少一次Minor GC,比Minor GC慢10倍以上。
  7. JVM的方法区,也被称为永久代。在这里都是放着一些被虚拟机加载的类信息,静态变量,常量等数据。这个区中的东西比老年代和新生代更不容易回收。

关于年轻代、老年代和永久代
Minor GC和Full GC区别
Java回收算法:
(1)两个最基本的java回收算法:复制算法和标记清理算法
(2)复制算法:两个区域A和B,初始对象在A,继续存活的对象被转移到B。此为新生代最常用的算法
(3)标记清理:一块区域,标记要回收的对象,然后回收,一定会出现碎片,那么引出
(4)标记-整理算法:多了碎片整理,整理出更大的内存放更大的对象;
(5)新生代基本采用复制算法,老年代采用标记整理算法。cms采用标记清理。

  • 类加载器,双亲委派机制
    • 类加载器的定义
    • 双亲委派模型

  1. 类加载器是根据指定全限定名称将class文件加载到JVM内存,转为Class对象
  2. 启动类加载器(Bootstrap ClassLoader):由C++语言实现(针对HotSpot),负责将存放在<JAVA_HOME>\lib目录或-Xbootclasspath参数指定的路径中的类库加载到内存中。
  3. 其他类加载器:由Java语言实现,继承自抽象类ClassLoader。如:
  4. 扩展类加载器(Extension ClassLoader):负责加载<JAVA_HOME>\lib\ext目录或java.ext.dirs系统变量指定的路径中的所有类库。
  5. 应用程序类加载器(Application ClassLoader)。负责加载用户类路径(classpath)上的指定类库,我们可以直接使用这个类加载器。一般情况,如果我们没有自定义类加载器默认就是用这个加载器。
  6. 当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。

Java类加载机制和类加载器详解

  1. 双亲委派模型
  2. 如果一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器完成。每个类加载器都是如此,只有当父加载器在自己的搜索范围内找不到指定的类时(即ClassNotFoundException),子加载器才会尝试自己去加载。
  3. 为什么需要双亲委派模型?防止内存中出现多份同样的字节码

如果没有双亲委派,那么用户是不是可以自己定义一个java.lang.Object的同名类,java.lang.String的同名类,并把它放到ClassPath中,那么类之间的比较结果及类的唯一性将无法保证。

  • 强引用、软引用、弱引用、虚引用
  1. 强引用

我们平时new了一个对象就是强引用,例如 Object obj = new Object();即使在内存不足的情况下,JVM宁愿抛出   OutOfMemory错误也不会回收这种对象。

  1. 软引用

如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。

  1. 弱引用

具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。

  1. 虚引用

如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。虚引用主要用来跟踪对象被垃圾回收器回收的活动。

  • 4
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值