转载

JVM面试知识点梳理

程序计数器:每个线程执行程序指令的行号

虚拟机栈:存放每个方法的栈帧,帧的入栈跟出栈就是方法执行的过程

本地方法栈:Native方法的栈

Java堆:保存Java对象的地方,细分为 Eden区, From Survivor空间, To Survivor空间(线程共享)

方法区:线程共享,存放已经被虚拟机加载进来的类信息,常量、静态变量,JIT编译后的数据代码。java的class文件首先进入的到方法区里面去。

运行时常量池

方法区的一部分。

四大引用

强引用:只要强引用还在,引用的对象永远不会被回收

软引用: 发生内存溢出之前会清除

弱引用:垃圾回收的时候会收走

虚引用:对象生命周期不会受到它影响,只是在被回收掉的时候,收到通知。

对象的存活

  • 引用计数器
  • 可达性算法(堆外的引用, GC Roots)

垃圾回收算法

  • 标记清除法
  • 复制算法
  • 标记整理法
  • 分代收集

安全点、Minor GC、Full GC、 STW、TLAB

safePoint、安全区域 。(不操作内存的写,不跟主存打交道) STW(stop the world)

eden, survior中调用 Minor GC,之所以没有用STW,添加了统计老生代到 新生代数据引用的卡表(脏位)

新生代(eden + from + to)TLAB(Thread Local Allocation Buffers)由于to Survior的空间不够,找老年代做 内存担保

当经历过几次 从from 到 to过程后依旧活着的对象就可以进入到 老生代中去了。

垃圾收集器

  • Serial (单线程,新生代,copy算法)

  • Parallel New(多线程,新生代,copy算法,时间优先)

  • Parallel Scavenge(多线程,新生代,copy算法,吞吐量优先)

  • Serial Old(单线程,老生代, 标记清除)

  • Parallel Old(多线程,老生代, 标记清除)

  • CMS:垃圾收集器跟应用并行(多线程,老生代, 标记清除)分两次清理,第一次清理的时候,工作线程跟垃圾线程并行,第二次STW。(Java 9 被废除)

  • G1 (新生代 + 老生代)

类加载过程

  • 加载:验证Class文件是否按Class的结构走的,然后加载完成之后变成内存的结构
  • 验证:不会等加载结束,其实交替进行的(文件格式验证、元数据验证、字节码验证、符号引用验证)
  • 准备:分配内存,虚方法动态分配的方便发表。创建符号引用(所以跟验证是交叉的)
  • 解析:(符号引用到直接引用:字段解析、类方法解析、接口方法解析)
  • 初始化 (cinit<>)

即时编译(JIT优化)

热点方法,循环热点

C、C++属于静态编译,运行时候不会。java属于动态编译,虚方法动态分配,激进优化等使之更彻底,但是占用CPU。

优化方式:

  • 内联优化(省去了方法的加载,压栈等。诡异的TR1图)

  • 逃逸分析(对象没有被方法外引用的时候,直接到接近CPU的栈上分配存储空间。方法仅被一个线程调用到的时候,去掉同步锁。)

  • 指令集(Compare And Sweep, Compare and Set),???

  • 循环优化、向量优化

原文  https://juejin.im/post/5bf94ae9e51d4523ec265619
正文到此结束
Loading...