3.5.内存分配与回收策略

3.5.1.对象优先在Eden分配

大多数情况下,对象在新生代Eden区中分配。当 Eden区没有高足够的空间进行分配

时,虚拟机将发起一次Minor GC。

虚拟机提供-XX:+PrintGCDetails这个收集器日志参数,告诉虚拟机在发生垃圾收集行为时,打印内存回收日志,并且在进程退出的时候输出当前内存各区域的分配情况。

Minor GC 和 Full GC 的区别:

新生代 GC(Minor GC):指发生在新生代的垃圾收集动作,因为 Java 对象大多都具备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度也比较快。

老年代 GC(Major GC / Full GC):指发生在老年代的 GC,出现了 Major GC,经常会伴随至少一次的Minor GC(但非绝对的,在 ParallelScavenge收集器的收集策略里就有直接进行 Major GC 的策略选择过程)。MajorGC 的速度一般会比Minor GC慢10倍以上。

3.5.2.大对象直接进入老年代

所谓大对象就是指,需要大量连续内存空间的Java对象,最典型的大对象就是那种很长的字符串及数组。

虚拟机提供了一个-XX:PretenureSizeThreshold参数,令大于这个设置值的对象直接在老年代中分配。

PretenureSizeThreshold参数只对 Serial 和ParNew 两款收集器有效, Parallel Scavenge 收集器不认识这个参数, Parallel Scavenge 收集器一般并不需要设置。如果遇必须使用此参数的场合,可以考虑 Pa rNew 和 CMS 的收集嚣组合。

3.5.3.长期存活的对象将进入老年代

虚拟机既然采用了分代收集的思想来管理内存,虚拟机给每个对象定义了一个对象年龄(Age)计数器。如果对象在 Eden 出生并经过第一次 Minor GC 后仍然存活,并且能被 Survivor 容纳的话,将被移动到 Survivor 空间中,并将对象年龄设为1。对象在 Survivor 区中每熬过一次 Minor GC,年龄就增加1岁,当它的年龄增加到一定程度(默认为 15 岁)时,就会被晋升到老年代中。对象晋升老年代的年龄阈值,可以通过参数 -XX:MaxTenuringThreshold 来设置。

3.5.4.动态对象年龄判定

虚拟机并不总是要求对象的年龄必须达到MaxTenuringThreshold才能晋升老年代,如果在Survivor 空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到 MaxTenuringThreshold 中要求的年龄。

3.5.5.空间分配担保

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

如果出现HandlePromoti onFailure失败,那就只好在失败后重新发起一次Full GC。虽然担保失败时绕的圈子是最大的,但大部分情况下都还是会将HandlePromotionFailure开关打开,避免Full GC过于频繁。

深入理解Java虚拟机读书笔记七相关推荐

  1. Java虚拟机不能满足_深入理解Java虚拟机--读书笔记1/3

    <深入理解Java虚拟机-JVM高级特性与最佳实践> Chap 2 Java内存区域与内存溢出异常 1.Java运行时数据区域 A.程序计数器:当前线程所执行字节码的行号指示器,线程私有( ...

  2. 深入理解java虚拟机-读书笔记

    内存动态分配与内存回收技术已经相当成熟,看起来进入了自动化的时代,为什么还要去了解垃圾收集和内存分配? 当需要排查各种内存溢出.内存泄漏问题时 当垃圾收集成为系统达到更高并发量的瓶颈时 我们就必须对内 ...

  3. 深入理解Java虚拟机读书笔记十二

    第 7 章虚拟机类加载机制 7. 1.概述 虚拟机把描述类的'数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. ...

  4. 深入理解java虚拟机---读书笔记

    第一章 走近java 1. java 技术体系: java 程序设计语言 各种硬件平台上的java虚拟机 class 文件格式 java API 类库 来自商业机构或者开源机构的第三方java类库 j ...

  5. 深入理解Java虚拟机——读书笔记01

    基础知识 JDK:Java程序设计语言.Java虚拟机.Java API类库 JRE:Java API类库中的Java SE API子集和Java虚拟机 Java技术基础支撑点:JAR文件格式.JDB ...

  6. 深入理解java虚拟机-读书笔记2-垃圾收集器和内存分配策略

    垃圾回收重点区域:堆和方法区部分区域. 引用计数算法: 1,引用计数算法: 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器都为0的对象 ...

  7. java虚拟机读书笔记 第三章 垃圾收集器和内存分配策略

    java虚拟机读书笔记 第三章 垃圾收集器和内存分配策略 GC需要完成的三件事情:哪些内存需要回收.什么时候回收.如何回收 垃圾回收器在对堆进行回收前,首先要确定那些对象存活,哪些对象已经死去,判断的 ...

  8. 深入理解JVM虚拟机读书笔记——内存模型与线程

    注:本文参考自周志明老师的著作<深入理解Java虚拟机(第3版)>,相关电子书可以关注WX公众号,回复 001 获取. 1. Java内存模型 JMM概述: Java 内存模型指的是 JM ...

  9. 《深入理解Java虚拟机》笔记4——类文件结构

    代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步. 由于最近十年内虚拟机以及大量建立在虚拟机之上的程序语言如雨后春笋般出现并蓬勃发展,将我们编写的程序编译成二进 ...

最新文章

  1. Oracle RMAN 设置和配置(一)
  2. [网络安全自学篇] 五十七.PE文件逆向之什么是数字签名及Signtool签名工具详解(一)
  3. oracle dba 手动创建数据实例
  4. 任务平均分配的小算法
  5. Mybatis Plus简介_代码_以及文档地址_以及前置知识---Mybatis Plus工作笔记001
  6. [转载] 老友记——潘石屹 任志强《天台论道》(下)
  7. 因为项目的原因,要学习J2EE了
  8. 使用 Docker 一步搞定 ZooKeeper 集群的搭建
  9. SQL学习笔记四之MySQL数据操作
  10. Oracle 单实例 迁移到 RAC 实例 -- 使用导出导入方法
  11. Linux(centos7下载安装)
  12. qt 飞扬青云_Qt编写图片及视频TCP/UDP网络传输
  13. 网络安全——sql注入漏洞拓扑图
  14. open数据库Timeout expired 错误
  15. 计算机语言属于人类意识的客观内容,《2008年考研政治800题精解》世界的物质性和人的实践活动(5)...
  16. 爬取ajax加载的豆瓣电影
  17. 【STM32F407开发板用户手册】第7章 STM32F407下载和调试方法(IAR8)
  18. Calling Extraterrestrial Intelligence Again
  19. 分享李嘉诚的98个建议和忠告给年轻人
  20. 训练神经网络的常用方法之共轭梯度法

热门文章

  1. PixiJS 渲染优化
  2. Web 架构师的能力 转载之程序员官方blog
  3. 大数据能力提升项目|学生成果展系列之五
  4. ERP销售人员快速上手
  5. 【板绘入门】拥有数位板之后第一步该学什么?线条!
  6. 12.3 收敛级数的性质
  7. 移动端布局之flex布局
  8. 软件著作权申请 源代码编辑
  9. Linux intel-xed反汇编引擎使用
  10. RedisTemplate写入Redis数据出现无意义乱码前缀\xac\xed\x00\x05