jvm及并发面试题

JVM常见面试题

https://blog.csdn.net/qq_41701956/article/details/100074023

1. JVM的内存空间

线程独有:
程序计数器
虚拟机栈
本地方法栈
线程共有:

方法区

2.JAVA堆内存分配 JVM内存为什么要分成新生代,老年代,持久代。新生代中为什么要分为Eden和Survivor

3.垃圾回收

触发

Minor GC:eden区满
Major GC:
Full GC:

  1. System.gc()
  2. 老年代满
  3. 方法区满

确定垃圾的方法

1.引用计数
2.可达性分析:通过GCroots(虚拟机栈引用的对象、本地方法栈引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象)作为起点搜索,若对象至少两次没有可达路径,则为可回收对象

算法

  1. 标记-清理
  2. 标记-复制
  3. 标记-整理
  4. 分代回收
  5. 分区收集算法:
  • 将整个堆空间划分为多个连续的小区间,每个区间单独使用,独立回收,这样可以控制一次回收多个小区间,每次合理的回收若干个小区间而不是整个堆。

进入老年代的条件:
在SurvivalTo区没有足够的空间存储某个对象时,会直接进入老年代;其他正常情况下,活过15次GC的对象会进入老年代。

垃圾收集器
新生代

  • Serial: 单线程垃圾收集器, 标记-复制
  • Par New: 多线程版本,标记-复制
  • Parallel Scavenge: 面向吞吐量的垃圾收集器,标记-复制
    老生代:
  • Serial Old: 老年代版本,标记-整理
  • Parallel Scavenge:Parallel Scavenge 的老年代版本,标记整理
  • CMS: 追求最短回收停顿时间的垃圾收集器,标记清理; 初始标记,并发标记,重新标记,并发清理

新生代+老年代

  • G1 : 追求可预测的停顿时间 ,标记整理算法;初始标记,并发标记,最终标记,并发清理

4.垃圾回收流程 初始标记,并发标记,最终标记,并发清理

5.内存溢出和内存泄露

内存溢出:没有足够的内存分配
内存泄露:分配的内存没有回收

6.类加载机制

https://www.jianshu.com/p/dd39654231e0

  • 加载:根据类的全限定名称获取类的字节码,根据字节码生成在内存中生成一个Class对象,作为类的入口
  • 链接:
    验证: 确保class文件符合JVM规范 1. 4.符号验证
    准备:初始化类变量为零值
    解析:将符号标记引用为指针引用
  • 初始化:调用方法,该方法是JVM自动收集类变量的赋值 和static代码块生成

7.双亲委派模型

类加载器 :启动类加载器,扩展类加载器,应用类加载器
如何打破双亲委派模型?

8.synchronize和Reentrantlock

原文地址:https://www.cnblogs.com/zhouyu0-0/p/14811742.html