内容简介:程序计数器:每个线程执行程序指令的行号虚拟机栈:存放每个方法的栈帧,帧的入栈跟出栈就是方法执行的过程本地方法栈:Native方法的栈
程序计数器:每个线程执行程序指令的行号
虚拟机栈:存放每个方法的栈帧,帧的入栈跟出栈就是方法执行的过程
本地方法栈: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),???
-
循环优化、向量优化
以上所述就是小编给大家介绍的《JVM面试知识点梳理》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 数据仓库知识点梳理(1)
- JS核心知识点梳理——数据篇
- MySQL基本知识点梳理和查询优化
- iOS开发进阶:HTTP知识点梳理
- JS核心知识点梳理——原型、继承(上)
- 从0到1:Python爬虫知识点梳理
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。