新生代垃圾收集器 1. Serial收集器 serial收集器即串行收集器,是一个单线程收集器. 串行收集器在进行垃圾回收时只使用一个CPU或一条收集线程去完成垃圾回收工作,并且会暂停其他的工作线程(stop the world),直至回收完成.适用于运行在client模式下的JVM. 在单CPU年代,串行收集器是默认的垃圾回收器,minor GC和major GC的过程都是用一个线程去处理的. 启用方式:-XX: +UseSerialGC 2. ParNew收集器 parNew收集器即并行收集…
内存分配策略 1.对象优先分配在新生代Eden区 多数情况下,对象分配在新生代的Eden,若Eden区域内存不够,则引发一次Minor GC 2.大对象直接进入老年代 大对象直接分配在老年代,避免新生代里出现从Eden到Survivor频繁的内存复制 可用-XX:PretenureSizeThreshold设置,大于此值的对象直接分配在老年代 典型的大对象有长字符串或者数组等 3.长久存活的对象进入老年代 有的对象经过几次MinorGC都没有被回收,则可以被移入老年代 可用-XX:MaxTenu…
内存分配与回收策略 对象的内存分配,就是在堆上分配(也可能经过 JIT 编译后被拆散为标量类型并间接在栈上分配),对象主要分配在新生代的 Eden 区上,少数情况下可能直接分配在老年代,分配规则不固定,取决于当前使用的垃圾收集器组合以及相关的参数配置. 以下列举几条最普遍的内存分配规则,供大家学习. 对象优先在 Eden 分配 大多数情况下,对象在新生代 Eden 区中分配.当 Eden 区没有足够空间进行分配时,虚拟机将发起一次 Minor GC. Minor GC vs Major GC/F…
在<Java对象在Java虚拟机中的创建过程>了解到对象创建的内存分配,在<Java内存区域 JVM运行时数据区>中了解到各数据区有些什么特点.以及相关参数的调整,在<Java虚拟机垃圾回收(一) 基础>中了解到如何判断对象是存活还是已经死亡?在<Java虚拟机垃圾回收(二) 垃圾回收算法>了解到Java虚拟机垃圾回收的几种常见算法,在<Java虚拟机垃圾回收(三) 7种垃圾收集器>了解到几种收集器的特点和应用等. 下面来了解总结前面的一些内容:…
内存分配与回收策略 Minor GC 和 Full GC Minor GC:发生在新生代上,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行, 执行的速度一般也会比较快. Full GC:又称Major GC,发生在老年代上,老年代对象其存活时间长, 因此 Full GC 很少执行,执行速度会比 Minor GC 慢很多. 内存分配策略 堆内存: 分配策略: 1. 对象优先在 Eden 分配 大多数情况下,对象在新生代 Eden 区分配,当 Eden 区空间不够时,发起 Minor…
之前几篇我们介绍了jvm的内存模型以及垃圾回收机制,而本篇我们将介绍几个JVM中对象在分配内存是应该遵循的策略.毕竟,想要去优化程序,不仅要考虑垃圾回收的过程,还要从对象内存分配的角度减少gc的代价. 一.gc日志格式 在这里先介绍一下gc日志的格式,分析gc日志是了解gc过程最直接的方式.对于大量的日志分析,直接查看日志文件当然不方便,我们一般会使用日志分析工具,后边会有介绍,但是对于简短的日志(如十几条),一般直接查看就行了.开启日志输出的JVM参数如下: -XX:+PrintGCDetai…
在上一篇中,已经介绍了内存结构是什么样的. 这篇来介绍一下 内存是怎么分配的,和怎么回收的.(基本取自<深入理解Java虚拟机>一书) java技术体系中所提倡的自动内存管理最终可以归结为自动化的解决了两个问题--给对象分配内存以及回收分配给对象的内存.我们下面就来介绍这些是怎么自动化完成的. 下面继续提出问题: 1.怎么判断对象是否能被回收? 2.垃圾回收是怎么进行的? 3.方法区存在垃圾回收吗? 4.垃圾回收都有什么算法? 5.MinorGC,FullGC,新生代,老年代,永久代,Eden…
对象的内存分配,主要是在java堆上分配(有可能经过JIT编译后被拆为标量类型并间接地在栈上分配),如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配.少数情况下也是直接分配到老年代,分配规则不是固定的,细节还是取决于垃圾收集器的组合,以及虚拟机和内存相关参数的配置. JVM 堆中分为 新生代 老年代 永久代,新生代分为 Eden区,SurvivorFrom区域和SurvivorTo区域 关于这几个概念的说明,可以参考 :http://ju.outofmemory.cn/entry/346…
之前看过<深入了解Java虚拟机>感觉容易忘,今天写一篇博客加深一下印象. JVM的内存分配和垃圾回收(GC)主要发生在Java堆中.而Java堆根据对象的存活时间可以分为新生代和老年代,而新生代又细分为Eden区.From Survivor区.To Survivor区,这是由于新生代中的垃圾回收算法基本都是复制算法. 1.对象优先在Eden区中分配 当Eden区没有足够空间进行分配时,虚拟机会发起一次新生代GC(Minor GC).因为Java对象大多数都具有朝生夕灭的特性,所以Minor…
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 内存分配一般关注的是对象在堆上分配的情况,对象主要分配在新生代的Eden区中,如果启用了本地线程分配缓冲,将按线程优先在TLAB上分配.少数情况下也会直接分配在老年代中,这取决于使用的垃圾收集器组合,以及设置的JVM参数. 对象优先在Eden分配 大多数情况下,对象在Eden区中分配.当Eden区没有足够空间进行分配时,虚拟机会发起一次Minor GC. Minor GC:发生在新生代的垃圾收…