JVM内存分配与回收
1.内存分配与回收策略
- 内存自动管理:自动化的解决了对象内存分配和回收对象内存的问题。
- 一般在堆上分配对象,也可能经过JTI编译后间接在栈上分配。
- 主要分配在新生代的Eden区,如果启动了本地线程分配缓冲(线程缓冲区TLAB)就优先在TLAB上分配。
2.对象优先在Eden 分配
- 大多数情况下,对象优先在新生代Eden区分配,当Eden区没有足够的空间分配时发生一次Minor GC。
- 如果Minor GC 之后筛选出的存活对象无法放入Survivor区那么这些对象就会被放入老年代。
- Minor GC是新生代的GC,新生代对象朝生夕死所以Minor GC非常频繁,速度也比较快。
- Major GC 是老年代的GC ,一般Major GC 会伴随着一次Minor GC 但并非绝对,Parallel Scavenger收集器就有直接进行 Major GC 的选择策略。Major GC 速度一般是Minor GC 的10倍以上。
Full GC 是整个堆的GC,会清理老年代和新生代。
3.大对象直接进入老年代
- 需要大量连续的内存空间,如很长的字符串,数组,该给避免创建朝生夕死的大对象,以免带来频繁的GC。
- -XX:PretenureSizeThreshold 参数可以指定超过此参数值得对象直接放入老年代。
4.长期存活的对象进入老年代
- 虚拟机给每个对象都对了一个年龄计数器。
- 在Eden区出生并经过一次GC后存活,并且被Survivor容纳则计数加1,每熬过一次GC年龄就加一,默认到15就移入老年代。
- -XX: MaxTenuringThreshold 可以设置年龄阀值。
5.动态年龄判断。
- jvm并非要求对象年龄达到阀值才晋升到老年代。
- 在Survivor空间中如果相同年龄的所有对象的大小总和大于Survivor一半则,那么年龄大于或者等于该年龄的对象就将直接进入老年代。
6.空间分配担保
- 在发起Minor GC前会检查老年代最大可用连续空间是否大于该新生代全部对象之和,若大于则进行GC,这次GC是安全的,若不大于则查看HandlePromotionFailure设置值是否允许担保失败。
- HandlePromotionFailure如果设置是允许担保失败则继续检查 老年代最大连续可用空间是否大于历次晋升到老年代的对象平均大小,如果大于就进行一次Minor GC,此次GC是有风险的 ,如果小于或者设置为不允许担保那么就进行Full GC。
- 如果发起不安全的Minor GC 失败后就会进行Full GC。
- 大部分情况下担保是允许的,避免频繁Full GC.
JVM内存分配与回收的更多相关文章
- 最简单例子图解JVM内存分配和回收
一.简介 JVM采用分代垃圾回收.在JVM的内存空间中把堆空间分为年老代和年轻代.将大量(据说是90%以上)创建了没多久就会消亡的对象存储在年轻代,而年老代中存放生命周期长久的实例对象.年轻代中又被分 ...
- 最简单例子图解JVM内存分配和回收(转)
本文转自http://ifeve.com/a-simple-example-demo-jvm-allocation-and-gc/ http://www.idouba.net/a-simple-exa ...
- 窥探JVM内存分配和回收的过程
一.环境 JDK 垃圾收集器 是否启用TLAB 通用JVM参数(堆内存分配见下图) 1.6.0_65 Serial + Serial Old 否 -Xms20m -Xmx20m -Xmn10m -XX ...
- JVM内存分配和回收
本文内容来自<Java编程思想(第四版)>第二章<一切都是对象>和第五章<初始化与清理>.作为一个使用了好几年的Javaer,再次看编程思想的前面章节(不要问我为什 ...
- jvm内存分配和回收策略
在上一篇中,已经介绍了内存结构是什么样的. 这篇来介绍一下 内存是怎么分配的,和怎么回收的.(基本取自<深入理解Java虚拟机>一书) java技术体系中所提倡的自动内存管理最终可以归结为 ...
- 图解JVM内存分配和回收
一.简介 JVM采用分代垃圾回收.在JVM的内存空间中把堆空间分为年老代和年轻代.将大量(据说是90%以上)创建了没多久就会消亡的对象存储在年轻代,而年老代中存放生命周期长久的实例对象.年轻代中又被分 ...
- JVM 内存分配和回收策略
对象的内存分配,主要是在java堆上分配(有可能经过JIT编译后被拆为标量类型并间接地在栈上分配),如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配.少数情况下也是直接分配到老年代,分配规则不 ...
- A4. JVM 内存分配及回收策略
[概述] Java 技术体系中所提倡的自动内存管理最终可以归结为自动化地解决两个问题:给对象分配内存以及回收分配给对象的内存. 对象的内存分配,往大方向讲,就是在堆上分配,对象主要分配在新生代的 Ed ...
- JVM——内存分配与回收策略
1.对象优先在Eden区分配 大多数情况下,对象在新生代Eden区分配.当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC. 虚拟机提供了 -XX:+PrintGCDetails这 ...
随机推荐
- BZOJ1096:[ZJOI2007]仓库建设——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1096 L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于 ...
- 洛谷 U32911 道路维护 解题报告
U32911 道路维护 题目背景 最近很多人投诉说C国的道路破损程度太大,以至于无法通行. C国的政府很重视这件事,但是最近财政有点紧,不可能将所有的道路都进行维护,所以他们决定按照下述方案进行维护. ...
- 数组分组chunk的一种写法
lodash的_.chunk函数可以将数组按照数量分成若干组, 例如: const data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; const groupByN ...
- 解决无法安装cnpm,cnpm卡顿问题
# 注册模块镜像 npm set registry https://registry.npm.taobao.org # node-gyp 编译依赖的 node 源码镜像 npm set disturl ...
- Jupyter生成中文PDF的Notebook
修改模板文件,将article.tplx文件中的\documentclass[11pt]{article}改为\documentclass[11pt]{ctexart} Linux下的文件路径一般在: ...
- rocketmq单机搭建
RocketMQ 是alibaba开源的消息队列. 本文使用的是开源版本v3.18 系统: centos6.x最小化安装 需要用到的软件包: jdk-7u67-linux-x64.tar.gz ali ...
- Value does not fall within the expected range 值不在预期的范围内
用vs2012 打开web.config时,提示如下错误:“Value does not fall within the expected range”; 中文提示:“值不在预期的范围内” 解决方案: ...
- photoshop的魔棒工具怎么用来抠图
魔棒工具是photoshop中提供的一种可以快速形成选区的工具,对于颜色边界分界明显的图片,能够一键形成选区,方便快捷. 本教程通过一个简单的实例,教新手怎么用Photoshop魔棒工具快速形成抠图选 ...
- for in、each; for 、forEach、map
1.jQuery.each(object, [callback]) 用于例遍任何对象.回调函数拥有两个参数:第一个为对象的成员或数组的索引,第二个为对应变量或内容.如果需要退出 each 循环可使回调 ...
- 关于Solaris系统“mpt_sas”驱动
1.mpt_sas 驱动源文件所在系统源代码中目录: illumos-soulos/usr/src/uts/common/sys/scsi/adapters/mpt_sas -- 头文件 illum ...