JVM
文章平均质量分 63
xMustang
知识点,串成线,织成网
展开
-
5. JVM 性能优化
1. 内存溢出 内存溢出的方式: 栈溢出 堆溢出 方法区溢出 本级内存直接溢出 1.1 栈溢出 StackOverflowError: 方法自己调用自己,死递归导致的溢出。 OutOfMemoryError: 栈内存分配有限,每个线程占据一个内存空间,比如 1M,如果线程多了,会导致内存溢出。 1.2 堆溢出 1.3 方法区溢出 方法区垃圾回收效率很低,因此在加载动态语言、CGLIB、JSP、OSGI 时可能会内存溢出。 1.4 本地直接内存溢出 限制了本地直接内存的大小,分配时超过了其大小。 2. 内原创 2022-05-22 14:23:55 · 293 阅读 · 0 评论 -
4. 执行子系统
1. class 文件 Class文件是一组以8位字节为基础单位的二进制流,类似于结构体的伪结构来存储数据: 只有两种数据类型:无符号数和表,无符号数属于基本的数据类型,以u1、u2、u4、u8。 表是由多个无符号数或者其他表作为数据项构成的复合数据类型。 class 文件结构详解: 魔数与Class文件的版本 常量池 访问标志 类索引、父类索引与接口索引集合 字段表集合 方法表集合 属性表集合 2. 字节码指令 指令分类: 加载和存储指令 运算指令 类型转换指令 对象创建与访问指令 操作数栈管理原创 2022-05-22 10:45:09 · 145 阅读 · 0 评论 -
3. 垃圾回收
1. 判断对象是否存活 判断对象存活的方式: 引用计数算法:会发生循环引用问题 可达性分析 在 Java 中可作为 GC Roots 的对象有: 方法区中类静态属性引用的对象。 方法区中常量引用的对象。 虚拟机栈(本地变量表)中引用的对象。 本地方法栈 JNI(Native方法)中引用的对象。 finalize 理论上可以把对象拯救,但是不保证 finalize 一定执行。 2. 引用类型 强引用 = 软引用 SoftReference 弱引用 WeakReference 虚引用 Phanto原创 2022-05-21 10:13:58 · 121 阅读 · 0 评论 -
2. JVM 中对象
1. 对象分配 虚拟机遇到一条 new 指令时: 对象划分内存方式有:指针碰撞、空闲列表。 在对象划分内存时解决并发安全问题的方式:本地线程缓冲(TLAB)、CAS + 失败重试。 2. 对象内存布局 对象包括对象头、实例数据、对齐填充。 对象头包括 hashcode/GC 回收年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等。 3. 对象访问方式 对象访问有 2 种方式: 使用句柄 直接指针 句柄是一种特殊的智能指针 。 句柄与普通指针的区别在于:指针包含的是引用对象的内存地址,而句原创 2022-05-20 18:56:59 · 191 阅读 · 0 评论 -
0. 前置
1. Java SE 体系架构 2. 虚拟机种类 HotSpot VM JRockit VM J9 VM Dalvik VM 3. 未来的 Java 技术 4. JVM 执行流程概览原创 2022-05-19 12:49:46 · 134 阅读 · 0 评论 -
1. 内存区域
1. 概览 线程私有的区域是用来运行指令的,线程共享的区域是用来存储数据的。 2. 线程私有区域 线程私有区域是用来运行指令的。 2.1 程序计数器 程序计数器指向当前线程正在运行的字节码指令的地址(行号)。 为什么需要程序计数器? Java 是多线程的,在运行过程中需要线程切换,程序计数器保证在多线程情况下程序正常执行。 程序计数器是 JVM 中唯一不会发生 OOM 的内存区域。 2.2 栈 为什么 JVM 要使用栈? 可以很好地兼容方法调用方法这一个过程。 1. 虚拟机栈 大小设置:-Xss。 存储当原创 2022-05-19 14:09:50 · 239 阅读 · 0 评论