内存分配策略

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. js中的eval方法

    eval(string) eval函数接收一个参数string,如果string不是字符串,则直接返回string.否则执行string语句.如果string语句执行结果是一个值,则返回此值,否则返回 ...

  2. 常用HTML转义字符,html转义符,JavaScript转义符,html转义字符表,HTML语言特殊字符对照表(ISO Latin-1字符集)

    HTML字符实体(Character Entities),转义字符串(Escape Sequence) 为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,> ...

  3. node不要使用最新版本,使用LTS版本

    错误现象 const { Math, Object, Reflect } = primordials; 原因 使用了最新的node版本 解决 使用稳定版本,参考官网说明,目前10.x的版本是稳定版本( ...

  4. 02. xadmin的过滤器queryset()

    需求: 每个老师都只能看到自己的课程 # models.py from django.contrib.auth.models import AbstractUser class UserProfile ...

  5. Linux 脚本语言入门

    0.脚本编写初步介绍 (1)脚本第一行以 #!/bin/sh 开始,也可以用 #!/bin/bash 开始,但是第一行必须以这种方式开始. (2)脚本名需要以.sh结尾 (3)#开头的句子表示注释 ( ...

  6. iphone订阅服务在那里取消

    打开手机,找到设置,点击进去   往下拉,找到“APP Store与iTunes Store”点击进去,找到你的ID,再点击进去,输入你的密码   找到“订阅”这个选项,点击进去   进到里面后你会发 ...

  7. django使用pyecharts(4)----django加入echarts_增量更新

    四.Django 前后端分离_定时增量更新图表 1.安装 djangorestframework linux pip3 install djangorestframework windows pip ...

  8. Python的json操作

    对数据:    json = json.dumps(data)  编码  dict->string  排序sort_keys=True, 缩进indent=4, 分隔符separators=(' ...

  9. SAS学习笔记51 SAS数据集

    结构 SAS数据集是关系型的,包含两个部分:描述部分(变量)和数据部分(观察值) 形式 SAS系统中共有两种类型的数据集: 1.SAS 数据文件(SAS datafiles) 2.SAS 数据视窗(S ...

  10. 是否应该学习qt源码(碰到问题的时候,或者文档对函数描述不清楚的时候,可以看一下)

    是否应该学习qt源码 如果你想调用某个函数,但是文档并没有清晰描述这个函数的功能的时候,你就需要去阅读源码,看看Qt究竟是怎么实现的.比如用QNetworkAccessManager发送一个QHttp ...