JVM 0 篇文章

JVM 探秘 5:垃圾收集算法

JVM 探秘 5:垃圾收集算法
垃圾收集算法垃圾收集算法主要有标记-清除算法、复制算法、标记-整理算法、分代收集算法这几种,对算法的具体实现不做过多探究,只对他们的设计思想进行介绍。标记-清除算法最基础的算法就是标记-清除(Mark-Sweep)算法,同它的名字一样,分为“标记”和“清除”两个阶段:首先标记出所有待回收的对象,标记完后统一回收所有被标记的对象。标记过程其实就是上一篇文章讲到的判断对象是否“死亡”的过程,通过引用计数

JVM 探秘 4:四种引用、对象的生存与死亡

JVM 探秘 4:四种引用、对象的生存与死亡
Java 虚拟机的内存区域中,程序计数器、Java 栈和本地方法栈是线程私有的,随线程而生随线程而灭,因此这几个区域的内存回收和分配都有确定性,所以主要探究的是 Java 堆和方法区的内存分配及回收。Java 堆在 Java 堆中存放着所有的对象实例,垃圾收集器在对堆进行回收前,第一件事就是判断这些对象中哪些还存活,哪些已经死去(即不会再被使用到的对象)。Java 中的引用在 JDK1.2 及之前,关于引用的定义是这样

JVM 探秘 3:内存溢出

JVM 探秘 3:内存溢出
在 Java 虚拟机内存区域中,除了程序计数器外,其他几个内存区域都可能会发生 OutOfMemoryError,这次通过一些代码来验证虚拟机各个内存区域存储的内容。在实际工作中遇到内存溢出异常时,需要做到能根据异常信息快速判断是哪个内存区域的溢出,知道什么样的代码会导致这些区域内存溢出,并且知道出现内存溢出后如何处理。Java 堆溢出 Java 堆用于存储对象实例,只要不断的扩展对象,并且保证 GCRoots 到

JVM 探秘 2:Java 对象

JVM 探秘 2:Java 对象
对象的创建虚拟机遇到一条 new 指令时,首先去检查这个指令的参数是否能在方法区常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,就必须先执行相应的类加载过程。类加载检查过后,虚拟机为新生对象分配内存。对象所需内存大小在类加载过后就完全确定,为对象分配空间就等同于,从 Java 堆中划分出一块确定大小的内存。此时有两种情况:如果 Java 堆中内存是规整的,那么虚

JVM 探秘 1:Java 内存区域

JVM 探秘 1:Java 内存区域
本系列笔记目前主要基于《深入理解 Java 虚拟机:JVM 高级特性与最佳实践第 2 版》,后续还会加入《实战 Java 虚拟机:JVM 故障诊断与性能优化》、《Java 性能权威指南》、《Java 性能优化权威指南》的阅读笔记。概述 Java 虚拟机为程序员分担了很多内存管理的工作,不再像 C/C++ 那样容易出现内存泄漏和内存溢出问题了,也正是这样,导致一旦出现了内存泄漏和溢出方面的问题,就难以排查。因此一个优秀的 Java