之前讲过虚拟机中的堆,他是整个内存模型中占用最大的一部分,而且不是连续的。当有需要分配内存的时候,一般有两个方法分配,指针碰撞和空闲列表。该部分的内存回收是由虚拟机的垃圾收集器GC进行管理的。 
  刚刚粗略的回忆了上一博文所讲的内容,而这一章我们的重点还在堆上面。之前有简单的提到过新生代和老年代,今天就给大家好好梳理下这部分。 
  堆是存放对象以及数组的区域,但不是胡乱的有空间就分配的内存。堆在内存中分为了年轻代、年老代。 
  我们先看看年轻代,这个区域又被分为了一个Eden和两个Survivor区,即伊甸园和存活区。看一张图: 
 
  从图中可以清楚的看到他们的关系是8:1。那为什么Eden占用这么多呢?因为对象都会在Eden区创建。每次只使用Eden区和一个Survivor区,当这两个区满了之后就会将还存活的对象复制到另一个空白区(MINOR GC),大家是不是在想那空间怎么会够用呢?其实年轻代的对象有98%都是朝生夕死的,所以根本不用担心不够用,这也是为什么比例是8:1而不是1:1的原因。而且!就算是不够用,我们不是还有年老代吗! 
  我们暂且先不说年老代,还有个问题没有解决,刚刚我们提到了复制,所以这里我们抱着求知的欲望来讲讲是怎么个复制法。首先看图: 
 
  图中分为了两个部分,每次只使用其中的一部分(这里不是完全按照刚刚伊甸园和空白区的占用比例来讲,可以理解为通用版)。当这部分满了后,就会将还存活的复制到另一个区,再将这个区清空,如图: 
 
  但这种方法也有弊端,就是会浪费了一半的内存空间。但是对于年轻代这种朝生夕死的特征是一个很好的解决方法,因为只要对一半的空间进行操作,把范围大大的缩小了。 
  对于年老区域,刚刚也说了,如果年轻代不够放了就放在年老代,还有一种情况就是对象在年轻代中存活的太久了,就会放到年老区,就像人的岁数大了就会变老年人,对象在年轻代也有岁数:每当进行一次复制回收的时候,还在年轻代中存活的对象就会加1岁,默认15岁后就到年老代。可以通过-XX:MaxTenuringThreshold=15来设置多少岁后进入年老区。 
  年老和永久区垃圾收集的方法都是“标记-清除-整理”,看图: 
 
  这里如果还使用年轻代的回收方法的话肯定不适用了,那边的特性是朝生夕死,而年老代存活的一般是大对象或者很难死去的对象(回收),所以不符合条件。当年老代内存不足的话就会触发垃圾收集,这个回收叫做FULL GC.默认是占用了68%后收集,可用参数-XX:CMSInitiatingOccupancyFraction=68自行设置。 
  收集方法中的标记这里先不说,标记好了就清除掉,最后整理成逻辑连续的区域。最后的结果: 
 
  这样可以有效的避免了内存碎片。

JVM(3) 之 内存分配与回收策略的更多相关文章

  1. JVM探秘:内存分配与回收策略

    本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 内存分配一般关注的是对象在堆上分配的情况,对象主要分配在新生代的Eden区中,如果启用 ...

  2. Java虚拟机垃圾回收:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法

    在<Java对象在Java虚拟机中的创建过程>了解到对象创建的内存分配,在<Java内存区域 JVM运行时数据区>中了解到各数据区有些什么特点.以及相关参数的调整,在<J ...

  3. JVM垃圾回收器、内存分配与回收策略

    新生代垃圾收集器 1. Serial收集器 serial收集器即串行收集器,是一个单线程收集器. 串行收集器在进行垃圾回收时只使用一个CPU或一条收集线程去完成垃圾回收工作,并且会暂停其他的工作线程( ...

  4. JVM学习十 -(复习)内存分配与回收策略

    内存分配与回收策略 对象的内存分配,就是在堆上分配(也可能经过 JIT 编译后被拆散为标量类型并间接在栈上分配),对象主要分配在新生代的 Eden 区上,少数情况下可能直接分配在老年代,分配规则不固定 ...

  5. Java虚拟机内存分配与回收策略

    内存分配与回收策略 Minor GC 和 Full GC Minor GC:发生在新生代上,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行, 执行的速度一般也会比较快. Full GC ...

  6. jvm内存分配和回收策略

    在上一篇中,已经介绍了内存结构是什么样的. 这篇来介绍一下 内存是怎么分配的,和怎么回收的.(基本取自<深入理解Java虚拟机>一书) java技术体系中所提倡的自动内存管理最终可以归结为 ...

  7. JVM的内存分配和回收策略

    对象的Class加载 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那必须先执行相应 ...

  8. JVM 内存分配和回收策略

    对象的内存分配,主要是在java堆上分配(有可能经过JIT编译后被拆为标量类型并间接地在栈上分配),如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配.少数情况下也是直接分配到老年代,分配规则不 ...

  9. JVM:内存分配与回收策略

    Java技术体系中所提倡的自动内存管理最终可以归结为自动化的解决了两个问题:给对象分配内存以及回收分配给对象的内存. 对象的内存分配,往大方向讲,就是在堆上分配(但也可能经过JIT编译后被拆散为标量类 ...

  10. A4. JVM 内存分配及回收策略

    [概述] Java 技术体系中所提倡的自动内存管理最终可以归结为自动化地解决两个问题:给对象分配内存以及回收分配给对象的内存. 对象的内存分配,往大方向讲,就是在堆上分配,对象主要分配在新生代的 Ed ...

随机推荐

  1. cp 复制文件或目录

    1. 命令功能 cp --copy files and directories.复制文件或目录. 2. 语法格式 cp  [option]  source des cp  [option]  sour ...

  2. error: must use ‘class’ tag to refer to type ‘XXX’ in this scope

    开发环境: Qt Creator 4.8.2 在写程序的时候,遇到了编译器报错 error: must use 'class' tag to refer to type 'XXX' in this s ...

  3. VNware上安装虚拟机Ubuntu16.10 并安装petalinux(版本问题的坑 弃帖 另开一帖)

    1.下载Ubuntu镜像文件 最新版本:https://ubuntu.com/download/desktop 老版本:http://old-releases.ubuntu.com/releases/ ...

  4. django之重定向redirect

    一:redirect的场景 加入登录成功后,需要跳转到主页:登录退出后,跳转到主页面.

  5. Mac Pro 安装win10记录(不用优盘版)

    用启动转换助理 就可以了提前下好win10 iso系统镜像文件,然后Mac会自动安装.然后一直下一步就可以了. 我这次装好之后无法连接网络,发现是因为win网卡驱动没有,所以回到Mac系统下 把需要的 ...

  6. 用java实现文件的断点续传并发下载

    需求: 支持文件批量下载.现在有很多小图片需要批量下载,不希望在服务器打包下载. 支持大文件断点下载.比如下载10G的文件. PC端全平台支持.Windows,macOS,Linux 全浏览器支持.i ...

  7. oracle中where子句和having子句中的区别

    1.where  不能放在GROUP BY 后面2.HAVING 是跟GROUP BY 连在一起用的,放在GROUP BY 后面,此时的作用相当于WHERE3.WHERE  后面的条件中不能有聚集函数 ...

  8. bootstrap 前端框架学习笔记

    下面是一个基于 bootstrap 前端架构的最最基本的模板: (这里添加慕课网的学习笔记.) 1.认识一下 bootstrap 带来的优雅效果: 代码: <!DOCTYPE html> ...

  9. 学习如何使用Markdown

    Markdown 新手指南点击查看 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 ---段落 引用 这是一个无序列表 这是一个无序列表 这是一个父无序列表 这是一个子无序列表 这是一个有 ...

  10. Newtonsoft.Json源码的solution打开之后,无法加载project

    无法加载项目 https://github.com/JamesNK/Newtonsoft.Json C:\repository\GitHub\Other\Newtonsoft.Json\Src\New ...