JVM的内存分配和回收策略】的更多相关文章

之前看过<深入了解Java虚拟机>感觉容易忘,今天写一篇博客加深一下印象. JVM的内存分配和垃圾回收(GC)主要发生在Java堆中.而Java堆根据对象的存活时间可以分为新生代和老年代,而新生代又细分为Eden区.From Survivor区.To Survivor区,这是由于新生代中的垃圾回收算法基本都是复制算法. 1.对象优先在Eden区中分配 当Eden区没有足够空间进行分配时,虚拟机会发起一次新生代GC(Minor GC).因为Java对象大多数都具有朝生夕灭的特性,所以Minor…
对象的Class加载 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那必须先执行相应的类加载过程.然后会为Class对象分配内存. 对象的内存分配 在类加载检查通过后,接下来虚拟机将为新生对象分配内存.对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来,有两种分法(选择哪种分配方式由Java堆是否规整决定,而Java堆…
Java技术体系中所提倡的自动内存管理最终可以归结为自动化的解决了两个问题:给对象分配内存以及回收分配给对象的内存. 对象的内存分配,往大方向讲,就是在堆上分配(但也可能经过JIT编译后被拆散为标量类型并间接的栈上分配),对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配.少数情况下也可能会直接分配到老年代中,分配的规则并不是百分之百固定的,其细节取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数的设置. 接下来我们将会讲解几条最普遍的…
1.java堆中各代分布 (1)Young:主要是用来存放新生的对象. (2)Old:主要存放应用程序中生命周期长的内存对象. (3)Permanent:是指内存的永久保存区域,主要存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域. 它和和存放Instance的Heap区  域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现Per…
在<Java对象在Java虚拟机中的创建过程>了解到对象创建的内存分配,在<Java内存区域 JVM运行时数据区>中了解到各数据区有些什么特点.以及相关参数的调整,在<Java虚拟机垃圾回收(一) 基础>中了解到如何判断对象是存活还是已经死亡?在<Java虚拟机垃圾回收(二) 垃圾回收算法>了解到Java虚拟机垃圾回收的几种常见算法,在<Java虚拟机垃圾回收(三) 7种垃圾收集器>了解到几种收集器的特点和应用等. 下面来了解总结前面的一些内容:…
新生代垃圾收集器 1. Serial收集器 serial收集器即串行收集器,是一个单线程收集器. 串行收集器在进行垃圾回收时只使用一个CPU或一条收集线程去完成垃圾回收工作,并且会暂停其他的工作线程(stop the world),直至回收完成.适用于运行在client模式下的JVM. 在单CPU年代,串行收集器是默认的垃圾回收器,minor GC和major GC的过程都是用一个线程去处理的. 启用方式:-XX: +UseSerialGC 2. ParNew收集器 parNew收集器即并行收集…
内存分配与回收策略 对象的内存分配,就是在堆上分配(也可能经过 JIT 编译后被拆散为标量类型并间接在栈上分配),对象主要分配在新生代的 Eden 区上,少数情况下可能直接分配在老年代,分配规则不固定,取决于当前使用的垃圾收集器组合以及相关的参数配置. 以下列举几条最普遍的内存分配规则,供大家学习. 对象优先在 Eden 分配 大多数情况下,对象在新生代 Eden 区中分配.当 Eden 区没有足够空间进行分配时,虚拟机将发起一次 Minor GC. Minor GC vs Major GC/F…
内存分配与回收策略 Minor GC 和 Full GC Minor GC:发生在新生代上,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行, 执行的速度一般也会比较快. Full GC:又称Major GC,发生在老年代上,老年代对象其存活时间长, 因此 Full GC 很少执行,执行速度会比 Minor GC 慢很多. 内存分配策略 堆内存: 分配策略: 1. 对象优先在 Eden 分配 大多数情况下,对象在新生代 Eden 区分配,当 Eden 区空间不够时,发起 Minor…
在上一篇中,已经介绍了内存结构是什么样的. 这篇来介绍一下 内存是怎么分配的,和怎么回收的.(基本取自<深入理解Java虚拟机>一书) java技术体系中所提倡的自动内存管理最终可以归结为自动化的解决了两个问题--给对象分配内存以及回收分配给对象的内存.我们下面就来介绍这些是怎么自动化完成的. 下面继续提出问题: 1.怎么判断对象是否能被回收? 2.垃圾回收是怎么进行的? 3.方法区存在垃圾回收吗? 4.垃圾回收都有什么算法? 5.MinorGC,FullGC,新生代,老年代,永久代,Eden…
对象的内存分配,主要是在java堆上分配(有可能经过JIT编译后被拆为标量类型并间接地在栈上分配),如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配.少数情况下也是直接分配到老年代,分配规则不是固定的,细节还是取决于垃圾收集器的组合,以及虚拟机和内存相关参数的配置. JVM 堆中分为 新生代 老年代 永久代,新生代分为 Eden区,SurvivorFrom区域和SurvivorTo区域 关于这几个概念的说明,可以参考 :http://ju.outofmemory.cn/entry/346…
[概述] Java 技术体系中所提倡的自动内存管理最终可以归结为自动化地解决两个问题:给对象分配内存以及回收分配给对象的内存. 对象的内存分配,往大方向讲,就是在堆上分配,对象主要分配在新生代的 Eden 区上,如果启动了本地线程分配缓存(使用 ThreadLocal 类),则将线程优先在 TLAB(Thread Local Allocation Buffer) 上分配.少数情况下也可能会直接分配在老年代上,分配的规则并不是百分之百固定的,其细节取决于当前使用的是哪一种垃圾收集组合,还有虚拟机中…
内存分配策略 1.对象优先分配在新生代Eden区 多数情况下,对象分配在新生代的Eden,若Eden区域内存不够,则引发一次Minor GC 2.大对象直接进入老年代 大对象直接分配在老年代,避免新生代里出现从Eden到Survivor频繁的内存复制 可用-XX:PretenureSizeThreshold设置,大于此值的对象直接分配在老年代 典型的大对象有长字符串或者数组等 3.长久存活的对象进入老年代 有的对象经过几次MinorGC都没有被回收,则可以被移入老年代 可用-XX:MaxTenu…
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 内存分配一般关注的是对象在堆上分配的情况,对象主要分配在新生代的Eden区中,如果启用了本地线程分配缓冲,将按线程优先在TLAB上分配.少数情况下也会直接分配在老年代中,这取决于使用的垃圾收集器组合,以及设置的JVM参数. 对象优先在Eden分配 大多数情况下,对象在Eden区中分配.当Eden区没有足够空间进行分配时,虚拟机会发起一次Minor GC. Minor GC:发生在新生代的垃圾收…
1.对象优先在Eden区分配 大多数情况下,对象在新生代Eden区分配.当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC. 虚拟机提供了 -XX:+PrintGCDetails这个收集器参数,告诉虚拟机在发生垃圾回收时打印内存回收日志.并且在进程退出时输出当前的内存各区域分配情况. 2.大对象直接进入老年代 所谓的大对象是指需要大量连续内存空间的Java对象.大对象对虚拟机的内存分配来说是一个坏消息,经常出现大对象导致内存还有不少空间时就提前触发垃圾回收以获得足够的连续空间…
一.导论 java技术体系中所提到的内存自动化管理归根结底就是内存的分配与回收两个问题,之前已经和大家谈过java回收的相关知识,今天来和大家聊聊java对象的在内存中的分配.通俗的讲,对象的内存分配就是在堆上的分配,对象主要分配在新生代的Eden上(关于对象在内存上的分代在垃圾回收中会补上,想了解的也可以参考<深入理解java虚拟机>),如果启动了本地线程分配缓冲,讲按线程优先在TLAB上分配.少数情况下也是直接在老年代中分配. 二.经典的分配策略 1.对象优先在Eden上分配 一般情况下对…
作者:平凡希 原文地址:https://www.cnblogs.com/xiaoxi/p/6557473.html 前言 对象的内存分配,往大的方向上讲,就是在堆上分配,少数情况下也可能会直接分配在老年代中,分配的规则并不是百分之百固定的,其细节决定于当前使用的是哪种垃圾收集器组合,当然还有虚拟机中与内存相关的参数.垃圾收集器组合一般就是Serial+Serial Old和Parallel+Serial Old,前者是Client模式下的默认垃圾收集器组合,后者是Server模式下的默认垃圾收集…
一.内存分配策略 新生代中98%的对象都是"朝生夕死"的,所以并不需要按照1:1的比例来划分内存空间,而是将内存(新生代内存)分为一块较大的Eden(伊甸园)空间和两块较小的Survivor(幸存者)空间,每次使用Eden和其中一块Survivor(两个Survivor区域一个称为From区,另一个称为To区域).当进行垃圾回收时,将Eden和Survivor中还存活的对象一次性复制到另一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间.当Survivor空…
对象的内存分配,大方向上讲,就是在堆上分配,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配.少数情况下也可能会直接分配在老年代中,分配规则并不是百分百固定,其细节取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数的设置. 1.对象优先在Eden分配 大多数情况下,对象在新生代Eden区中分配.当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minior GC. 2.大对象直接进入老年代 所谓大对象是指,需要大量连续内存空间的J…
对象优先在Eden分配 大多数情况下,对象在新生代Eden区中分配. 当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC. Minor GC:新生代GC,指发生在新生代的垃圾收集动作,因为Java对象大多具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快. Major GC/Full GC:老年代GC,指发生在老年代的GC,出现了Major GC,经常会伴随至少一次Minor GC(但非绝对的,在Parallel Scavenge收集器的收集策略中就有直接进…
开发十年,就只剩下这套架构体系了! >>>   之前讲过虚拟机中的堆,他是整个内存模型中占用最大的一部分,而且不是连续的.当有需要分配内存的时候,一般有两个方法分配,指针碰撞和空闲列表.该部分的内存回收是由虚拟机的垃圾收集器GC进行管理的.    刚刚粗略的回忆了上一博文所讲的内容,而这一章我们的重点还在堆上面.之前有简单的提到过新生代和老年代,今天就给大家好好梳理下这部分.    堆是存放对象以及数组的区域,但不是胡乱的有空间就分配的内存.堆在内存中分为了年轻代.年老代.    我们先…
一.垃圾回收日志说明 [GC[DefNew: 7307K->494K(9216K), 0.0043710 secs] 7307K->6638K(19456K), 0.0044894 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 1.日志开发的“[GC”说明了这次垃圾回收的停顿类型,如果有FULL,说明这次GC是发生了Stop-The-World的. 2.接下来的“[DefNew”表示GC发生的区域,这里显示的区域名称与使用的GC收集器是密切…
1 对象优先分配在Eden区 对象优先在Eden进行分配,大多数情况下,对象在新生代Eden区进行分配.当Eden区没有足够的空间进行分配时,虚拟机会发起一次Minor GC. 新生代GC(Ninor GC)指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕死的特征,因此Minor GC非常频繁,一般回收速度也比较快   老年代GC(Major GC / Full GC)指发生在老年代的GC,出现在Major GC,经常会伴随至少一次的Minor GC.Major GC的速度一般会比…
1 对象优先分配在Eden区 对象优先在Eden进行分配,大多数情况下,对象在新生代Eden区进行分配.当Eden区没有足够的空间进行分配时,虚拟机会发起一次Minor GC. 新生代GC(Ninor GC)指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕死的特征,因此Minor GC非常频繁,一般回收速度也比较快   老年代GC(Major GC / Full GC)指发生在老年代的GC,出现在Major GC,经常会伴随至少一次的Minor GC.Major GC的速度一般会比…
1.对象优先在Eden分配 -Xms20M -Xmx20M java堆的大小20M -Xmn10M 新生代10M 老年代10M -XX:SurvivorRatio=8 新生代Eden与一个Survivor区的空间比例8:1 /** * -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 */ public class TestAllocation { private static final int _1MB = 102…
    JAVA技术体系中的自动内存管理实际上就是自动化的解决了给对象分配内存以及回收给对象分配的内存这两个问题.回收部分通过之前的<GC设计思路分析>和<垃圾收集器>这两篇博文进行了总结,那么接下来主要就是谈谈自己对JVM是如何给对象分配内存这一部分的理解.JVM的内存空间是有限的,并且堆内存是共享的,那么不同线程共用堆内存如何保证线程安全都是需要考虑的问题.       通过之前对JVM中的内存模型的分析以及GC的学习,我们知道JAVA内存分配往大了说就是在JAVA堆上分配内存…
上一篇博客我简单介绍了下如何手动计算一个Java对象到底占用多少内存?今天就想聊下这个内存JVM到底是是如何分配和回收的. Java整体来说还是一个GC比较友好的语言,无论是分代的垃圾收集,还是基于GC Roots的可达性算法都是业界普遍的经典做法,关于Java的内存区域划分以及GC的一些基本知识,我这里就不赘述了,可以看我之前的博客:http://zhanjindong.info/category/note/dsbj/ <深入理解Java虚拟机第2版>这本书非常值得一看,最近几篇读博客都算这…
1.内存分配与回收策略 内存自动管理:自动化的解决了对象内存分配和回收对象内存的问题. 一般在堆上分配对象,也可能经过JTI编译后间接在栈上分配. 主要分配在新生代的Eden区,如果启动了本地线程分配缓冲(线程缓冲区TLAB)就优先在TLAB上分配. 2.对象优先在Eden 分配 大多数情况下,对象优先在新生代Eden区分配,当Eden区没有足够的空间分配时发生一次Minor GC. 如果Minor GC 之后筛选出的存活对象无法放入Survivor区那么这些对象就会被放入老年代. Minor…
前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 学习导图 一.为什么要学习GC&内存分配? 时代发展到现在,如今的内存动态分配与内存回收技术已经相当成熟,一切看似进入了"自动化"时代,不免发出疑问:"为啥我们还要了解垃圾收集和内存分配?" 答案很简单,当需要排查各种内存溢出/泄漏问题的时候,当垃圾收集成为系统达到更高并发量的瓶颈的时候,我们必须对"自动化"技术进行必要的监控和调节. 所以,我们要了…
请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] 带你建立核心竞争力. 前言 Bitmap 是 Android 应用的内存占用大户,是最容易造成 OOM 的场景.为此,Google 也在不断尝试优化 Bitmap 的内存分配和回收策略,涉及:Java 堆.Native 堆.硬件等多种分配方案,未来会不会有新的方案呢? 深入理解 Bitmap 的内存…
简单介绍一下Java技术体系下的Java虚拟机内存分配与回收策略.  1.对象优先在Eden分配  大多数情况下,对象在新生代Eden区中分分配.当Eden区已没有足够空间进行分配时,虚拟机将发起一次 Minor GC. 新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多数都具备朝生夕灭的特征,所以Minor GC 非常频繁,一般回收速度也比较快. 老年代GC(Major GC / Full GC):指发生在老年代的GC出现了Major GC,经常会伴随至少一次的…