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这 ...
随机推荐
- bzoj1045: [HAOI2008] 糖果传递(思维题)
首先每个人一定分到的糖果都是所有糖果的平均数ave. 设第i个人给i-1个人Xi个糖果,则有Ai-Xi+X(i+1)=ave. 则A1-X1+X2=ave,A2-X2+X3=ave,A3-X3+X4= ...
- 【博弈论】【P1288】取数游戏II
传送门 Description 有一个取数的游戏.初始时,给出一个环,环上的每条边上都有一个非负整数.这些整数中至少有一个0.然后,将一枚硬币放在环上的一个节点上.两个玩家就是以这个放硬币的节点为起点 ...
- mybatis生成的pojo 中的属性或方法不够我们当做dto使用时
我们在写代码的时候,如果一个 mybatis生成的pojo 中的属性或方法不够我们使用(当做dto和前台交互)时,我们有两种方法: 第一: 直接在 原 pojo 中增加属性或者方法 第二:我们可以再写 ...
- HDU 3487 Splay tree
Play with Chain Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- [洛谷P3401] 洛谷树
洛谷题目连接:洛谷树 题目背景 萌哒的Created equal小仓鼠种了一棵洛谷树! (题目背景是辣鸡小仓鼠乱写的QAQ). 题目描述 树是一个无环.联通的无向图,由n个点和n-1条边构成.树上两个 ...
- 使用JMeter录制脚本并调试
仍然以禅道中添加bug为例进行录制 第一步:在JMeter中添加线程组,命名为AddBugByJMeter 第二步:在线程组下添加HTTP请求默认值 添加->配置元件->HTTP请求默认值 ...
- 教你 Shiro 整合 SpringBoot,避开各种坑(山东数漫江湖)
依赖包 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-sprin ...
- HDU 1574 RP问题 (dp)
题目链接 Problem Description 在人类社会中,任何个体都具有人品,人品有各种不同的形式,可以从一种形式转换为另一种形式,从一个个体传递给另一个个体,在转换和传递的过程中,人品不会消失 ...
- node遇到的一些坑,npm无反应,cordova安装以后显示不是内部或外部命令
1.输入npm -v 以后一直无反应 C:\Users\用户名 目录下找到 .npmrc文件,删除以后,执行npm -v顺利显示版本号 2.安装cordova以后一直报错,不是内部或外部命令也不是可运 ...
- 【Eclipse】Eclipse中修改项目的映射名称与端口
1.正常部署(映射的名字为项目名字,端口为8080)