Clear Blog

Look what's happening here,it's magical

垃圾回收机制

简单的记录下对象存活(可达分析算法)流程: 1.枚举根节点:在该过程中会出现stop the world。 这是因为在该过程中必须保证jvm中的对象引用关系不会发生变化, 这就导致了必须停顿所有的java线程。 2.准确式GC:当执行系统停顿后,通过OopMap的数据结构来得知哪些地方存放对象引用。 3.安全点(SafePoint):主动式中断所有线程(不包括JNI线程),设置一个中断标...

内存分配与回收策略

对象优先在Eden区分配 大多数时候,对象在新生代Eden区分配,当Eden区中没有足够的空间进行分配时,虚拟机将发起一次Minor GC。 Minor GC(新生代GC):速度非常快,非常频繁 Majar GC/Full GC(老年代GC):速度比Minor GC慢10倍以上 大对象直接进入老年代 JVM提供了-XX:PretenureSizeThreshold参数,设置大于该值的对象直...

对象存活判定算法

JVM中虚拟机使用的是可达性算法来判定对象是否存活。 简单的说下可达性算法: 通过一系列的GC Roots对象作为起点向下搜索,搜索的路径称为引用链, 当一个对象到GC Roots没有任何引用链相连时,证明此对象是不可用的。 GC Roots没有引用到对象会被第一次标记,并且进行筛选。 筛选的条件是:此对象是否有必要执行finalize方法,如果对象已经执行过finalize()方法 或对象...

JVM对象内存布局

对象的内存布局分三个部分: 对象头(Header) 实例数据(Instance Data):有效信息 对齐填充(Padding):占位符,补齐8的倍数 对象头 ①Mark Word:包含一系列的标记位,比如轻量级锁的标记位,偏向锁标记位等等。在32位系统占4字节,在64位系统中占8字节 ②Class Pointer:用来指向对象对应的Class对象的内存地址。在32位系统占4字节,在64位系...

JVM性能调优

JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代)、Tenured(年老代)、永久代(Perm) 其中New和Tenured属于堆内存,堆内存会从JVM启动参数(-Xmx:3G)指定的内存中分配, Perm不属于堆内存,有虚拟机直接分配,但可以通过-XX:PermSize -XX:MaxPermSize 等参数调整其大小。 年轻代(Ne...

JVM内存溢出调试代码

常量池导致溢出(结合不同jdk版本,会有不一样的异常情况) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 import java.util.ArrayList; import java.util.List; public class StringOomMock { static String base = "string"; public stati...

JVM内存划分方案

对象创建,内存划分的方式 分两种方式: ①堆内存绝对规整,采用指针碰撞方式 ②堆内存不是规整的,采用空间列表方式 Java堆是否规整取决GC是否带有压缩整理功能。 并发情况下分配内存的两种方案 ①对分配内存的操作进行同步处理 ②把内存分配的动作按照线程划分在不同的空间之中进行, 每个线程都预先分配一小块内存(Thread Local Allocation Buffer). 只有TLAB用完...

JVM直接内存

直接内存 在1.4加入Nio后,引入了Channel和Buffer的I/O方式,可使用native函数库直接分配堆外内存, 然后通过DirectByteBuffer对象作为这块内存的引用进行操作,这样做可使Java堆与native堆免于来回复制, 提高了性能。 开发中我们可以使用java.nio.DirectByteBuffer对象进行堆外内存的管理和使用, 它会在对象创建的时候就分配堆外内...

JVM线程共享内存区域

Java堆 虚拟机中管理内存最大的一块,唯一的功能就是存放对象实例。 该区域是垃圾收集器管理的主要区域,很多时候被称为GC堆. 堆内存垃圾收集器采用的是分代收集算法,Java堆中可细分为新生代和老年代, 再细致一点新生代可分为Eden空间,From Survivor空间和To Survivor空间。 可通过-Xmx和-Xms控制堆内存的最大最小内存值,将两个值设为一样可避免自动扩展, 内存变...

JVM线程私有内存区域

程序计数器 可看做当前线程所执行的字节码的行号指示器 虚拟机栈 它的功能就是为Java虚拟机执行Java方法(字节码服务),我们常说的栈指的就是虚拟机栈, 或者说是虚拟机栈中对的局部变量表部分。 栈中存放了编译器可知的八种基本数据类型(byte,char,short,int,long,double,float,boolean) 以及对象引用(对象引用不等同对象本身,可能是指向对象起始地址的...