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这 ...
随机推荐
- ZOJ3874 Permutation Graph 【分治NTT】
题目链接 ZOJ3874 题意简述: 在一个序列中,两点间如果有边,当且仅当两点为逆序对 给定一个序列的联通情况,求方案数对\(786433\)取模 题解 自己弄了一个晚上终于弄出来了 首先\(yy\ ...
- 【简单算法】18.实现strStr()
题目: 实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不存 ...
- scanf函数用法小记
By francis_hao Aug 26,2017 scanf – 输入格式转换 概述 #include <stdio.h>int scanf(const char *fo ...
- 题解【luoguP4053 bzojP1029 [JSOI2007]建筑抢修】
洛谷题链 bzoj题链 PS: \(t_i\) : 在什么时候建筑 \(i\) 自爆 \(a_i\) : 修复 \(i\) 所花时间 题解 算法:贪心+堆维护 贪心策略: 直接按 \(t\) 贪心?显 ...
- Mac 访问隐藏文件方法! 网上方法在我电脑上都不可用!
百度的方法: 如果你想打开整个系统的隐藏文件可以在终端下输入以下命令 defaults write com.apple.finder AppleShowAllFiles -bool true 关闭显示 ...
- Python爬虫学习笔记之微信宫格验证码的识别(存在问题)
本节我们将介绍新浪微博宫格验证码的识别.微博宫格验证码是一种新型交互式验证码,每个宫格之间会有一条 指示连线,指示了应该的滑动轨迹.我们要按照滑动轨迹依次从起始宫格滑动到终止宫格,才可以完成验证,如 ...
- UVA 1635 Irrelevant Elements
https://vjudge.net/problem/UVA-1635 题意:n个数,每相邻两个求和,最后变成1个数,问这个数除m的余数与第几个数无关 n个数使用次数分别为C(n-1,i) i∈[0, ...
- [洛谷P4774] [NOI2018]屠龙勇士
洛谷题目链接:[NOI2018]屠龙勇士 因为markdown复制过来有点炸格式,所以看题目请戳上面. 题解: 因为杀死一条龙的条件是在攻击\(x\)次,龙恢复\(y\)次血量\((y\in N^{* ...
- PHP扩展--APC缓存安装与使用
apc安装 wget http://pecl.php.net/get/APC-3.1.13.tgz tar zxvf APC-3.1.13.tgz cd APC-3.1.13 /usr/local/p ...
- zk-web
Ref:https://github.com/qiuxiafei/zk-web zk-web是一个用clojure with noir and boostrap写的Zookeeper WEB UI管理 ...