1.概述

与C++不同的是, 在Java中我们无需关心对象占用空间的释放, 这主要得益于Java中的垃圾处理器(简称GC)帮助我们自动的进行对象占用空间的释放.

下面我们带着几个问题来学习:

  • 堆内存是如何分代的?
  • 各分代之间是如何配合工作的?

2.堆内存是如何分代的

用一张图片来描述(面积大小不代表实际占用空间大小)

堆内存分为: 年轻代(Young) + 老年代(Old), 年轻代又分为: Eden区 + Survivor区 * 2.

通常年轻代中的各区比值为: Eden区: Survivor0 : Survivor1 = 8:1:1

要尽可能的让对象不进入Old区.

S0和S1默认情况下会动态的自动调整大小, 可以使用-XX:UseAdaptiveSizePolicy来关闭动态调整.

3.各分代之间是如何配合工作的

以一个对象的在每个区之间的复制来描述这个问题, 我们假定这个对象一直存活着.

当我们写一段如下代码时

User user = new User();

user对象首先被放入到Eden区, 当Eden区满的时候会发生第一次Minor GC, 这时垃圾收集器会在S0和S1中随机选择一个区(假设选中了S0)来存放Eden区剩余存活的对象. 当Eden区再次满的时候会发生第二次Minor GC, 这时垃圾收集器会把Eden区存活的对象 + S0中存活的对象复制到S1中, 当Eden区再次满的时候会发生第三次Minor GC, 这时垃圾收集器会把Eden区存活的对象 + S1中存活的对象复制到S0中, 如此循环复制.

那么对象什么情况下会进入到Old区?

  • Eden区满时, 在对象将要进入S0或S1中时, 如果S0或S1存放不下Eden区中某个对象时, 这个对象将被复制到Old区.
  • 如果一个对象在S0和S1中经历了指定次数(-XX:MaxTenuringThreshold=15)的复制之后, 会被复制到Old区.

顺便说一下: 年轻代垃圾回收使用 复制算法, 老年代回收使用 标记清除算法.

浅谈Java堆内存分代回收的更多相关文章

  1. AJPFX浅谈Java 性能优化之垃圾回收(GC)

    ★JVM 的内存空间 在 Java 虚拟机规范中,提及了如下几种类型的内存空间: ◇栈内存(Stack):每个线程私有的.◇堆内存(Heap):所有线程公用的.◇方法区(Method Area):有点 ...

  2. 浅谈Java的内存模型以及交互

    本文的内存模型只写虚拟机内存模型,物理机的不予描述. Java内存模型 在Java中,虚拟机将运行时区域分成6中,如下图:              程序计数器:用来记录当前线程执行到哪一步操作.在多 ...

  3. 浅谈Java虚拟机内存中的对象创建,内存布局,访问定位

    参考于 深入理解Java虚拟机 这里介绍HotSpot虚拟机(自带的虚拟机) 1.对象的创建 对于程序员来说,创建对象的方法: User user1 = new User(); User user2 ...

  4. Java虚拟机:JVM内存分代策略

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! Java虚拟机根据对象存活的周期不同,把堆内存划分为几块,一般分为新生代.老年代和永久代(对HotSpot虚拟机而言),这就是JVM的内存 ...

  5. 转载:JVM内存分代策略

    Java虚拟机根据对象存活的周期不同,把堆内存划分为几块,一般分为新生代.老年代和永久代(对HotSpot虚拟机而言),这就是JVM的内存分代策略. 为什么要分代? 堆内存是虚拟机管理的内存中最大的一 ...

  6. JVM内存区域以及各区域的内存溢出异常,内存分代策略,垃圾收集算法,各种垃圾收集器

    本文整理自周志明老师的<深入理解Java虚拟机-JVM高级特性与最佳实践>第3版的第二章和第三章. 加上了一些网上拼拼凑凑的图片,个人认为很多博客复制来复制去,最后的东西都看不懂,所以从书 ...

  7. Android内存管理(11)*常见JVM回收机制「Java进程内存堆分代,JVM分代回收内存,三种垃圾回收器」

    参考: http://www.blogjava.net/rosen/archive/2010/05/21/321575.html 1,Java进程内存堆分代: 典型的JVM根据generation(代 ...

  8. JVM调优-Java垃圾回收之分代回收

    为什么要进行分代回收? JVM使用分代回收测试,是因为:不同的对象,生命周期是不一样的.因此不同生命周期的对象采用不同的收集方式. 可以提高垃圾回收的效率. Java程序运行过程中,会产生大量的对象, ...

  9. 谈JAVA的内存回收(一)

    谈JAVA的内存回收 程序员需要通过关键字new创建Java对象,即可视为Java对象申请内存空间,JVM会在堆内存中为每个对象分配空间,当一个Java对象失去引用时,JVM的垃圾回收机制会自动清除他 ...

随机推荐

  1. JSON数据、PHP数组 转换 Excel表格

    //excel输出 header("Content-type:application/vnd.ms-excel"); header("Content-Dispositio ...

  2. 腾讯云cos对象在线显示

    问题 前端使用了一张cos的图片,但是无法显示图片,使用的是cdn的加速域名地址. 对比:使用服务器的直接域名是可以显示的. 两者地址直接访问时,一者在线显示,一者直接下载到本地. 原因: 使用默认提 ...

  3. delphi 调用QQ邮箱发送邮件

    procedure TForm1.FormCreate(Sender: TObject); begin try IdSMTP1.AuthenticationType := atLogin; IdSMT ...

  4. Win10安装docker的一些注意事项

    安装环境:Win10专业版本64位,Win7.Win8 等需要利用 docker toolbox 来安装. 一.占用C盘空间问题的解决 1. 把vhdx虚拟硬盘从默认的C盘转移到其他盘,这样下载镜像后 ...

  5. bash: ./LM35_make_fs: Permission denied 解决办法

    执行命令的时候 ./LM35_make_fs 遇到 permission denied, bash: ./LM35_make_fs: Permission denied权限的问题,可以运行 ls -l ...

  6. Spring面试问答

    1.什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台.Spring帮助开发者解决了开发中基础性的问题, ...

  7. [蓝桥杯]PREV-22.历届试题_国王的烦恼

    问题描述 C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了m座大桥,每座大桥连接两座小岛.两个小岛间可能存在多座桥连接.然而,由于海水冲刷,有一些大桥面临着不能使用的危险. 如果两个小岛间 ...

  8. 学习笔记《Java多线程编程实战指南》一

    1.1什么是多线程编程 多线程编程就是以线程为基本抽象单位的一种编程范式,和面向对象编程是可以相容的,事实上Java平台中的一个线程就是一个对象.多线程编程不是线程越多越好,就像“和尚挑水”的故事一样 ...

  9. 了解unix操作系统发展阶段

    UNIX操作系统简介 UNIX操作系统(尤尼斯),是一个强大的多用户.多任务操作系统,支持多种处理器架构,按照操作系统的分类,属于分时操作系统,最早由KenThompson.Dennis Ritchi ...

  10. 转载 修改oracle用户密码永不过期

    1.查看用户的proifle是哪个,一般是default: sql>SELECT username,PROFILE FROM dba_users; 2.查看指定概要文件(如default)的密码 ...