深入理解Java虚拟机之读书笔记三 内存分配策略

  一般的内存分配是指堆上的分配,但也可能经过JIT编译后被拆散为标量类型并间接地在栈上分配。对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配,少数情况下直接分配在老年代中,分配的规则并不是百分之百固定的。细节取决于哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数的设置。

  一、对象优先在Eden分配

  优先在新生代的Eden区中分配,当不够时,发起一次Minor GC。

  二、大对象直接进入老年代

  需要连续大量内存空间的Java对象,长字符串和数组等。

  三、长期存活的对象将进入老年代

  虚拟机给每个对象定义了一个对象年龄计数器。Eden区的对象,经过一次Minor GC后,如果能进入Survivor区,年龄为1,以后没经过一次Minor GC,年龄加1,默认到15时进入老年代。可参数调节阈值。

  四、动态对象年龄判定

  如果在Survivor中相同年龄的所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等阈值年龄。

  五、空间分配担保

  在发生Minor GC前,虚拟机会检测之前每次晋升到老年代的平均大小是否大于老年代的剩余空间大小,如果大于,改为直接进行Full GC。如果小于,检查HandlePromotionFailure设置是否允许担保失败;如果允许,只Minor GC;或者Full GC。

  如果发生了HandlePromotionFailure失败,失败后发起一次Full GC,默认允许担保失败。

  

  

时间: 2024-08-11 07:38:13

深入理解Java虚拟机之读书笔记三 内存分配策略的相关文章

深入理解Java虚拟机系列——垃圾回收器与内存分配策略(二)

判断对象是否存活的算法: 简单版:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,当引用失效时,计数器值就减1.任何时刻计数器为0的对象就是不可能再被使用的. 但主流的Java虚拟机都没有引用计数算法来管理内存,最重要的原因就是它很难解决对象之间相互循环引用的问题. 可达性分析算法(Reachability Analysis): 在主流的程序语言(Java,C#等)的主流实现中,都是通过可达性分析来判定对象是否存活. 算法思想:通过一系列的成为"GC Roots"的对

《深入理解Java虚拟机》——垃圾收集器与内存分配策略

GC需要完成: 哪些内存需要回收 什么时候回收 如何回收 如何确定对象不再使用 引用计数算法 给对象添加一个引用计数器,当有一个地方引用它时,计数器值进行加1操作:当引用失效时,计数器值进行减1操作:当计数器值为0,则说明对象不可能再被使用.但是它无法解决循环引用的问题. public class ReferenceCountingGC { public Object instance = null; public static void testGC(){ ReferenceCountingG

深入理解java虚拟机(3)垃圾收集器与内存分配策略

一.根搜索算法: (1)定义:通过一系列名为"GC Roots"的对象作为起点,从这些起点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连的时候,则证明此对象不可用 (2)GC Roots对象包括这几种:虚拟机栈中引用的对象:方法区中的类静态属性引用的对象:方法区中常量的引用对象:本地方法中JNI的引用对象 二.垃圾收集算法 1.标记-清楚算法: (1)基本思想:首先标记出要回收的对象,在标记完后回收掉所有被标记的对象 (2)缺点:第一是标记和清楚

《深入理解Java虚拟机》读书笔记---第二章 Java内存区域与内存溢出异常

Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来.这一章就是给大家介绍Java虚拟机内存的各个区域,讲解这些区域的作用,服务对象以及其中可能产生的问题. 1.运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. 1.1程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型中里,字

《深入理解Java虚拟机》读书笔记---第一章 走进Java

一.为什么要读此书 <深入理解Java虚拟机>这本书读了很多次,每次读都会有不一样的感受.首先说一下为什么要读这本书,如果把Java比喻成乾坤大挪移,那了解虚拟机的工作原理就是练习九阳神功,java语言是招式,对虚拟机的认识是内功心法,只有内功心法强大,所使的招式才强大,这就是为什么阳顶天只能把乾坤大挪移练到第四层,而张无忌能练到第七层.由于java虚拟机的强大,把很多功能都隐藏了,例如内容管理,垃圾回收机制等,使得很多java程序猿对这一块的知识所有缺失,编码的时候也是似懂非懂的,以至于遇到

《深入理解Java虚拟机》读书笔记:Java内存区域

xmind文件下载地址 <深入理解Java虚拟机>读书笔记:Java内存区域,布布扣,bubuko.com

《深入理解Java虚拟机》读书笔记——第1章 走近Java

(注:原文请见<深入理解Java虚拟机>周志明 著,知识点部分参考百度百科) 总述 第1章分为两个部分:Java概述及自己动手编译JDK的教程. 1 Java概述 介绍了Java的整体特性.Java的技术体系组成.Java及JVM的发展史. 1.1 Java的总体特性 1)Java不仅仅是一门编程语言,更是由一系列计算机软件和规范组成的技术体系. 2)Java具有众多优点: a.Java虚拟机在千差万别的物理机上建立了统一的运行平台,实现了跨平台性.(主要) b.提供了相对安全的内存管理和访问

深入理解Java虚拟机之读书笔记一 自动内存管理机制

一.运行时数据区域 1.程序计数器是线程的私有空间,每个线程都有.针对线程执行的是Java代码还是Native代码有两种取值,Java代码时:虚拟机字节码指令的地址:Native代码时:计数值为Undefined.不可能出现OutOfMemeoryError情况. 2.Java虚拟机栈是线程的私有空间,每个线程都有.栈中局部变量表的部分是在编译期间完成分配的,每个局部变量空间的大小为32为长度.栈的深度太长,抛出StackOverflowError异常.栈可扩展时,如果内存不够,会抛出OutOf

java虚拟机之垃圾收集器与内存分配策略

哪些内存需要回收? java内存运行时区域的各个部分,其中程序计数器,虚拟机栈,本地方法栈3个区域随线程而生,随线程而灭,栈中的栈帧随着方法的进入和退出而有条不絮的执行着出栈和入栈操作.每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的.因此这几个区域的内存分配和回收都具有确定性,所以这部分不需要过多考虑内存回收.但是方法区和堆不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也不一样,我们只有在程序处于运行期间才能知道会创建哪些对象,这部分的分配和回收都