这节我们总结一下JVM中的内存分配策略。目录如下:

内存分配策略

Java技术体系中所提倡的自动内存管理可以归结于两个部分:给对象分配内存以及回收分配给对象的内存。 
我们都知道,Java对象分配,都是在Java堆上进行分配的,虽然存在JIT编译后被拆分为标量类型并简介地在栈上进行分配。如果采用分代算法,那么新生的对象是分配在新生代的Eden区上的。如果启动了本地线程分配缓冲,将按线程优先在TLAB上进行分配。 
事实上,Java的分配规则不是百分百固定的,其取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数的设置。 
下面我们以上节我们讲过的Serial和Serial Old收集器做一个内存分配和回收的策略总结。

对象优先在新生代Eden分配

首先,让我们来看一下新生代的内存分配情况: 
内存分配情况: 
将JVM内存划分为一块较大的Eden空间(80%)和两块小的Servivor(各占10%)。当回收时,将Eden和Survivor中还存活的对象一次性采用复制算法直接复制到另外一块Servivor空间上,最后清理到院Eden空间和原先的Survivor空间中的数据。 
大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,JVM将发起一次Minor GC。 
在这里先说明两个概念:

  • 新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多是具有朝生夕灭的特性,所以Minor GC非常频繁,而且该速度也比较快。
  • 老年代GC(Major GC/Full GC):指发生在老年代的GC,出现了Major GC,一般可能也会伴随着一次Minor GC,但是与Minor GC不同的是,Major GC的速度慢十倍以上。

大对象直接进入老年代

我们先对所谓的大对象做一个定义:大对象,这里指的是需要大量连续内存空间的Java对象。最典型的大对象可以是很长的字符串和数组。 
JVM对大对象的态度: 
大对象对于JVM的内存分配来说是十分麻烦的,如果我们将大对象分配在新生代中,那样子的话很容易导致内存还有不少空间时就提前触发垃圾收集以获取足够的连续空间来“安置”它们。、 
为了避免上述情况的经常发生而导致不需要的GC活动所浪费的资源和时间,可采用的分配策略是将大对象直接分配到老年代中去,虚拟机中也提供了-XX:PretenureSizeThreshold参数,令大于这个设置值的对象直接在老年代里面分配内容。

长期存活的对象将进入老年代

当JVM采用分代收集的思想来管理内存时,为了识别哪些对象应该放在新生代、哪些对象应该放在老年代,JVM给每个对象定义了一个对象年龄计数器。 
对象年龄计数器:如果对象在Eden出生并经过第一次Minor GC后仍然存活,并且能被Survivor容纳的话,便可以被移动到Survivor空间中,年龄计数器将设置该对象的年龄为1.对于对象在Survivor区每经过一次Minor GC,年龄便增加1岁,当它的年龄增加到一定程度(可通过参数-XX:MaxTenuringThreshold设置),该对象便会进入到老年代中。成为老年代的对象。

动态对象年龄判定

事实上,有的虚拟机并不永远地要求对象的年龄必须达到MaxTeruringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Surivior空间的一半,年龄大于或等于该年龄的对象就可以直接进行老年代,无须等到MaxTeruringThreshold中所要求的年龄。

空间分配担保

在发生Minor GC之前,虚拟机会先检查老年代中最大的可用的连续空间是否大于新生代中所有对象总空间,如果这个条件成立,那么Minor GC可以确保是安全的,如果不成立,则虚拟机会查看HandlePromotionFaiure设置值是否允许担保失败。如果允许,那么会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试进行一次Minor GC,尽管这次GC是有风险的;如果小于,或者HandlePromotionFaiure设置不允许冒险,那么这时就要改为进行一次Full GC。 
所谓冒险:也就是说当用来轮转的Survivor区无法承受新生代中所存活的对象内存时,需要老年代进行分配担保,把Survivor无法容纳的对象直接进入老年代中,前提是老年代中

JVM总结(二):JVM的内存分配策略的更多相关文章

  1. JVM基础学习(二):内存分配策略与垃圾收集技术

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来 垃圾收集概述 Java内存模型中的堆和方法区是垃圾收集技术所需要关注的终点,因为其他的区域会跟 ...

  2. 深入了解java虚拟机(JVM) 第七章 内存分配策略

    理解了jvm内存分配策略不仅是程序性能调优的重要知识,还能够给养成自己一种良好的代码思路,一个程序的代码差异往往都是在这里体现出来的. 一.对象优先分配到Eden区域   一般来说,新创建的对象都会直 ...

  3. JVM笔记4:Java内存分配策略

    简单来说,对象内存分配主要是在堆中分配.但是分配的规则并不是固定的,取决于使用的收集器组合以及JVM内存相关参数的设定 以下介绍几条基本规则(使用的ParNew+Serial Old收集器组合): 一 ...

  4. 【转载】JVM 学习——垃圾收集器与内存分配策略

    本文主要是对<深入理解java虚拟机 第二版>第三章部分做的总结,文章中大部分内容都来自这章内容,也是博客 JVM 学习的第二部分. 简述 说到垃圾收集(Garbage Collectio ...

  5. JVM(3) 垃圾收集器与内存分配策略

    一.垃圾收集的概念 在Java虚拟机运行时数据区中程序计数器.虚拟机栈和本地方法栈3个区域随线程而生,随线程而灭:栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作,每一个栈帧中分配多少内 ...

  6. 深入理解JVM(三)垃圾收集器和内存分配策略

    3.1 关于垃圾收集和内存分配 垃圾收集和内存分配主要针对的区域是Java虚拟机中的堆和方法区: 3.2 如何判断对象是否“存活”(存活判定算法) 垃圾收集器在回收对象前判断其是否“存活”的两个算法: ...

  7. JVM(3) 垃圾回收器与内存分配策略

    文章内容摘自:深入理解java虚拟机 第三章   对象已死? 1. 引用计数算法: 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0 ...

  8. 深入理解JVM:垃圾收集器与内存分配策略

    堆里面存放着Java世界差点儿全部的对象实例,垃圾收集器在对堆进行回收前.第一件事情就是要确定这些对象之中哪些还存活,哪些已经死去.推断对象的生命周期是否结束有下面几种方法 引用计数法 详细操作是给对 ...

  9. jvm系列 (二) ---垃圾收集器与内存分配策略

    垃圾收集器与内存分配策略 前言:本文基于<深入java虚拟机>再加上个人的理解以及其他相关资料,对内容进行整理浓缩总结.本文中的图来自网络,感谢图的作者.如果有不正确的地方,欢迎指出. 目 ...

  10. JVM之垃圾收集器与内存分配回收策略(二)

    上一篇JVM垃圾收集器与内存分配策略(一),下面是jdk1.7版本的垃圾收集器之间的关系,其中连线两端的两种垃圾收集器可以进行搭配使用,下面来总结一下这些收集器的一些特点以及关系. 一.Serial收 ...

随机推荐

  1. Jquery获取和修改img的src值的方法

    转自:http://www.jb51.net/article/46861.htm 获取(代码): $("#imgId")[0].src; 修改(代码): $("#imgI ...

  2. 第三个spring冲刺第10天

    进入最后阶段冲刺最后一天了,基本的需求已经完成了,最后的布局问题也解决了,我们的软件正式推出了.

  3. 使用nodejs去做一个验证码

    let express = require('express'); let captchapng = require('captchapng'); let app = express(); app.g ...

  4. jsp servlet 的 请求转发和重定向

    以前对于servlet和servlet/jsp之间的跳转路径问题感到很迷惑,今天亲自动手实验了一把,总结如下: servlet已经是项目根路径下面的资源了,所以servlet跳转的时候,在跳转路径上面 ...

  5. python矩阵水平镜像

    方法1: label = label.T[::-1].transpose() 方法2: label = label[:,::-1] 方法3: 使用 numpy.fliplr https://docs. ...

  6. BZOJ3298[USACO 2011Open]cow checkers——威佐夫博弈

    题目描述 一天,Besssie准备和FJ挑战奶牛跳棋游戏.这个游戏上在一个M*N的棋盘上, 这个棋盘上在(x,y)(0<=x棋盘的左下角是(0,0)坐标,棋盘的右上角是坐标(M-1,N-1). ...

  7. 自学Zabbix2.3-服务器端server安装过程

    点击返回:自学Zabbix之路 ....

  8. 【codeforces 103E】 Buying Sets

    http://codeforces.com/problemset/problem/103/E (题目链接) 题意 给出$n$个数,每个数与一个集合相关联.从其中选出最小的若干个数,选出的数的个数与这些 ...

  9. WCF快速搭建Demo

    WCF快速搭建Demo ps:本Demo只是演示如何快速建立WCF 1.首先完成IBLL.BLL.Model层的搭建,由于数据访问层不是重点,WCF搭建才是主要内容,所以本Demo略去数据访问层. 新 ...

  10. BSGS

    北上广深/拔山盖世算法. yaT+b = z mod p p为质数,Hash表存b,枚举a,复杂度p0.5 记得特判y = 0的情况. inline void solve3() { Hash::cle ...