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这 ...
随机推荐
- JavaScript URL汉字编码转换
在使用url进行参数传递时,经常会传递一些中文名的参数或URL地址,在后台处理时会发生转换错误.在有些传递页面使用GB2312,而在接收页面使用UTF8,这样接收到的参数就可能会与原来发生不一致.使用 ...
- 面向小数据集构建图像分类模型Keras
文章信息 本文地址:http://blog.keras.io/building-powerful-image-classification-models-using-very-little-data. ...
- 如何给apk文件签名
1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本 ...
- ACE主动对象模式(2)
转载于:http://www.cnblogs.com/TianFang/archive/2006/12/12/590153.html 我们简单的介绍了一下ACE主动对象实现方式,同时提出了两个问题: ...
- 关于AVPlayerItem对象的属性duration返回播放总时长的坑
最近在使用AVPlayer播放网络流媒体,发现一个坑: 就是playerItem.duration有可能不返回该网络多媒体资源的播放总时间长度,而是返回了一个奇怪的数据:nan, 因为我通过CMTim ...
- HDU 4417 离线+树状数组
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- POJ1236:Network of Schools (思维+Tarjan缩点)
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24880 Accepted: 99 ...
- Magic FZU - 2280 无脑HASH暴力
Kim is a magician, he can use n kinds of magic, number from 1 to n. We use string Si to describe mag ...
- 打开cmd窗口新技巧get
1.在当前目录下,按住shift键+点击右键,选择在此处打开命令窗口 很多时候我们需要打开命令行然后进入到相应目录进行一些操作. 常规的做法是: Win+R打开运行窗口 输入"cmd&quo ...
- [LeetCode][Facebook面试题] 通配符匹配和正则表达式匹配,题 Wildcard Matching
开篇 通常的匹配分为两类,一种是正则表达式匹配,pattern包含一些关键字,比如'*'的用法是紧跟在pattern的某个字符后,表示这个字符可以出现任意多次(包括0次). 另一种是通配符匹配,我们在 ...