内存分配策略

1、对象优先分配在新生代Eden区

多数情况下,对象分配在新生代的Eden,若Eden区域内存不够,则引发一次Minor GC

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

大对象直接分配在老年代,避免新生代里出现从Eden到Survivor频繁的内存复制

可用-XX:PretenureSizeThreshold设置,大于此值的对象直接分配在老年代

典型的大对象有长字符串或者数组等

3、长久存活的对象进入老年代

有的对象经过几次MinorGC都没有被回收,则可以被移入老年代

可用-XX:MaxTenuringThreshold 用来定义年龄的阈值

4、动态对象年龄判断

有时也不需要存活对象的年龄达到设置的年龄阀值,如果在 Survivor 中相同年龄所有对象大小的总和大于 Survivor 空间的一半,则年龄大于或等于该年龄的对象可以直接进入老年代

5、空间分配担保

在MinorGC之前,检查一下老年代连续可用内存空间是否大于新生代中所有对象大小和,若大于,则可以进行一次MinorGC

若小于,则检查HandlePromotionFailure,若允许担保,则查看老年代连续可用内存大小是否大于上一次MinorGC进入老年代的平均大小

如果大于,则尝试一次MinorGC,若小于或者系统不允许冒险,则进行一次FullGC

内存回收策略

Minor GC

1、回收范围与特点:回收新生代区域的对象,因为新生代对象存活时间短,所以MinorGC会频繁进行,花费的时间短

2、触发条件:当Eden区域内存满了的时候

Full GC

1、回收范围与特点:回收老年代和新生代两块区域,老年代对象存活时间长,所以FullGC进行的不频繁,但是执行速度比MinorGC慢很多

2、触发条件:

  • System.gc()

    • 只是建议虚拟机进行一次FullGC,并不能控制虚拟机一定执行,不建议这种方式,而是让虚拟机管理内存
  • 老年代空间不够
  • 空间分配担保失败
  • jdk1.7及以前的永久代空间不够
  • Concurent Mode Failure

JVM系列三:内存分配与回收策略的更多相关文章

  1. JVM探秘:内存分配与回收策略

    本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 内存分配一般关注的是对象在堆上分配的情况,对象主要分配在新生代的Eden区中,如果启用 ...

  2. Java虚拟机垃圾回收:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法

    在<Java对象在Java虚拟机中的创建过程>了解到对象创建的内存分配,在<Java内存区域 JVM运行时数据区>中了解到各数据区有些什么特点.以及相关参数的调整,在<J ...

  3. JVM垃圾回收器、内存分配与回收策略

    新生代垃圾收集器 1. Serial收集器 serial收集器即串行收集器,是一个单线程收集器. 串行收集器在进行垃圾回收时只使用一个CPU或一条收集线程去完成垃圾回收工作,并且会暂停其他的工作线程( ...

  4. JVM学习十 -(复习)内存分配与回收策略

    内存分配与回收策略 对象的内存分配,就是在堆上分配(也可能经过 JIT 编译后被拆散为标量类型并间接在栈上分配),对象主要分配在新生代的 Eden 区上,少数情况下可能直接分配在老年代,分配规则不固定 ...

  5. Java虚拟机内存分配与回收策略

    内存分配与回收策略 Minor GC 和 Full GC Minor GC:发生在新生代上,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行, 执行的速度一般也会比较快. Full GC ...

  6. jvm内存分配和回收策略

    在上一篇中,已经介绍了内存结构是什么样的. 这篇来介绍一下 内存是怎么分配的,和怎么回收的.(基本取自<深入理解Java虚拟机>一书) java技术体系中所提倡的自动内存管理最终可以归结为 ...

  7. JVM:内存分配与回收策略

    Java技术体系中所提倡的自动内存管理最终可以归结为自动化的解决了两个问题:给对象分配内存以及回收分配给对象的内存. 对象的内存分配,往大方向讲,就是在堆上分配(但也可能经过JIT编译后被拆散为标量类 ...

  8. JVM的内存分配和回收策略

    对象的Class加载 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那必须先执行相应 ...

  9. JVM 内存分配和回收策略

    对象的内存分配,主要是在java堆上分配(有可能经过JIT编译后被拆为标量类型并间接地在栈上分配),如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配.少数情况下也是直接分配到老年代,分配规则不 ...

随机推荐

  1. SecureCRT配色方案(转)

    1. 设置背景颜色和字体颜色: 选项(Options)==>会话选项(Sessions options)==>终端(Terminal)==>仿真(Emulation)  选项(Opt ...

  2. cordon、drain、delete node区别

    cordon.drain.delete node区别 主要目的:导致node处于不可调度状态,新创建的pod容器不会调度在node上. cordon将node置为SchedulingDisabled不 ...

  3. 【GStreamer开发】GStreamer基础教程14——常用的element

    目标 本教程给出了一系列开发中常用的element.它们包括大杂烩般的eleemnt(比如playbin2)以及一些调试时很有用的element. 简单来说,下面用gst-launch这个工具给出一个 ...

  4. 【剑指offer】面试题 42. 连续子数组的最大和

    面试题 42. 连续子数组的最大和 NowCoder 题目描述 输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值. 示例: 输入: [-2,1 ...

  5. 《Mysql - 为什么只查一行的数据,也这么慢?》

    概念 - 在某些情况下,“查一行”,也会执行得特别慢. - 下面分析在什么情况下,会出现这个现象. - 基础工作(构建数据库环境) - 建立 t 表,并写入 10W 的数据. CREATE TABLE ...

  6. zabbix+orabbix安装

    zabbix + orabbix 监控oracle数据库 zabbix 监控搭建 一,LNMP环境搭建 LNMP环境搭建.md 二,zabbix服务端安装配置 (1)下载zabbix并安装 所有版本下 ...

  7. 异常:[vue/no-parsing-error] Parsing error:x-invalid-end-tag

  8. BUG:WSL 的 ssh server 无法启动

    BUG 使用 sudo service ssh start 启动 ssh 服务,提示: * Restarting OpenBSD Secure Shell server sshd Could not ...

  9. Bigdecimal除法异常

    1.异常信息摘要(详细请见文末): java.lang.ArithmeticException: Non-terminating decimal expansion; no exact represe ...

  10. R_基础_01

    R语言介绍:R是一种区分大小写的解释型语言.R中有多种数据类型,包括向量.矩阵.数据框(与数据集类似)以及列表(各种对象的集合),广泛用于数据统计. R的特点:一次交互式会话期间的所有数据对象都被保存 ...