首页
关于
留言
归档
动态
友链
推荐
虫洞
开往
憶夣
累计撰写
57
篇文章
累计创建
11
个标签
累计收到
2
条评论
栏目
首页
关于
留言
归档
动态
友链
推荐
虫洞
开往
目 录
CONTENT
深入理解Java虚拟机-憶夣
以下是
深入理解Java虚拟机
相关的文章
2023-04-04
3、圾收集器与内存分配策略
**摘要** 本文系统介绍了Java虚拟机的垃圾收集机制与内存分配策略,核心内容涵盖以下方面: 1. **GC三大问题**:明确哪些内存需回收(堆和方法区的动态分配区域)、何时回收、如何回收。 2. **对象存活判定**:虚拟机采用可达性分析算法(以GC Roots为起点搜索引用链),而非引用计数法。引用分为强、软、弱、虚四种,强度依次递减。对象死亡需经两次标记,方法区还回收废弃常量和无用类。 3. **收集算法**:包括标记-清除、复制、标记-整理及分代收集算法。新生代对象"朝生夕死",适合复制算法(Eden+Survivor,默认8:1);老年代存活率高,适合标记-整理或标记-清除算法。 4. **HotSpot实现**:通过OopMap在安全点记录引用信息,配合主动式中断和安全区域机制保证GC停顿的准确性。 5. **垃圾收集器**:涵盖Serial、ParNew、Parallel Scavenge(吞吐量优先+自适应调节)、CMS(低停顿但存在CPU敏感、浮动垃圾和碎片问题)及G1(Region化分区、可预测停顿、空间整合)等多种收集器,各有适用场景。 6. **内存分配策略**:对象优先在Eden区分配,大对象直接进老年代,长期存活对象按年龄晋升(默认阈值15),并支持动态年龄判定和空间分配担保机制。 文章强调,没有万能的收集器组合,需根据实际应用需求选择最优方案。
2023-04-04
61
0
0
Java
2023-04-04
2、自动内存管理机制
## 摘要 本章系统介绍了Java虚拟机的**自动内存管理机制**,涵盖运行时数据区划分、对象创建与布局原理以及常见OOM异常实战。 **运行时数据区**包括七大区域:①**程序计数器**(线程私有,记录当前执行位置,唯一不会OOM的区域);②**虚拟机栈**(线程私有,存储栈帧及局部变量表,过深或扩展失败可抛出StackOverflowError/OOM);③**本地方法栈**(服务Native方法);④**Java堆**(线程共享,存放对象实例,GC主要管理区域,分新生代与老年代);⑤**方法区**(线程共享,存储类信息、常量、静态变量等);⑥**运行时常量池**(方法区的一部分,存放编译期和运行期常量);⑦**直接内存**(非JVM规范区域,NIO中使用,分配回收成本高但读写性能优)。 **对象探秘**部分详解了:通过`new`指令触发类加载检查后,采用"指针碰撞"或"空闲列表"分配内存,使用**CAS+TLAB**保障线程安全;对象内存由**对象头**(Mark Word+类型指针)、**实例数据**、**对齐填充**三部分组成;对象访问有**句柄**和**直接指针**两种方式,前者稳定性好,后者性能更优。 **OOM实战**分别演示了Java堆溢出(不断创建对象)、栈溢出(递归过深)、方法区与常量池溢出(大量动态生成类)以及直接内存溢出(Unsafe分配)的场景与排查思路。总体而言,即使有GC机制,理解各区域内存模型对排查内存问题至关重要。
2023-04-04
62
0
0
Java
1
2