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为什么要分代回收_浅谈Java堆内存分代回收相关推荐

  1. java手动回收_浅谈java是如何做资源回收补救的

    学习java的过程,我们经常谈论一个对象的回收,尤其是资源类型,如果没有显示的关闭,对象就被回收了,说明出现了资源泄漏.java本身为了防止这种情况,做了一些担保的方式,确保可以让未关闭的资源合理回收 ...

  2. java接口与类相同不同_浅谈java的接口和C++虚类的相同和不同之处

    C++虚类相当于java中的抽象类,与接口的不同之处是: 1.一个子类只能继承一个抽象类(虚类),但能实现多个接口 2.一个抽象类可以有构造方法,接口没有构造方法 3.一个抽象类中的方法不一定是抽象方 ...

  3. java中修饰常量的事_浅谈java中的声明常量为什么要用static修饰

    今天定义一个类常量,想着也只有这个类可以用到,就没用static关键字修饰.结果sonar代码检查提示: Rename this field "PERSON_TYPE_USER" ...

  4. java gc 可以对方法区进行回收_浅谈 Java 之 GC

    阅读本文假设你对java内存模型已有一些了解. 1.Java虚拟机中哪些内存需要回收? 先来看看jvm内存模型,如下图 线程隔离的区域随线程而生,随线程而灭:程序计数器可保存着虚拟机字节码指令的地址( ...

  5. java程序的装载与检查_浅谈Java类型装载、连接与初始化

    类型装载.连接与初始化 Java虚拟机通过装载.连接和初始化一个Java类型,使该类型可以被正在运行的Java程序所使用.其中装载就是把二进制形式的Java class文件读入Java虚拟机中去;连接 ...

  6. java中的标识符和关键字_浅谈java中的标识符、修饰符和关键字

    合法标识符 Java语言中,对于变量,常量,函数,语句块均有名字,我们统统称之为Java标识符.标识符是用来给类.对象.方法.变量.接口和自定义数据类型命名的. 组成:Java标识符由数字,字母和下划 ...

  7. java守护线程的使用场景_浅谈Java守护线程

    一.在Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 1.Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾回收 ...

  8. 简述java中流的概念和划分_浅谈Java中流的概念与用途

    Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.Java的I/O流提供了读写数据的标准方法.任何Java中表示数据源的对象都会提供以数据流的方式读写它的 ...

  9. java线程池和线程实例化_浅谈Java 线程池原理及使用方式

    一.简介 什么是线程池? 池的概念大家也许都有所听闻,池就是相当于一个容器,里面有许许多多的东西你可以即拿即用.java中有线程池.连接池等等.线程池就是在系统启动或者实例化池时创建一些空闲的线程,等 ...

最新文章

  1. CentOS6.8下安装JDK1.8
  2. “cvSnakeImage”: 找不到标识符
  3. ubuntu 11.10上安装osdlyrics 歌词插件
  4. lucene源码分析(1)基本要素
  5. 四张照片合成一张怎么弄_精美!多张照片组合成一张的拼贴画,每一幅都令人惊叹...
  6. Docker网络通信openvswitch(来自龙果学院学习资料 + 自己实验结果)
  7. 一次性上传多个文件到服务器端(一)
  8. jsp输出所有请求头的名称
  9. python post 请求登录后的页面_python - 学习模拟登录,卡在发送POST请求之后?
  10. Hibernate_01_初体验
  11. 七月算法机器学习1 相关数学基础
  12. Word中插入的Excle打开后闪退如何解决? - Office2019
  13. Final类型数据的初始化
  14. 基于 InVEST 模型的水涵养功能评估数据获取
  15. linux mint 下如何制作win7启动盘
  16. unity给头发添加物理_U3D实时渲染教程之角色头发各向异性表达(上)
  17. nohup与前台后台操作
  18. 云计算的发展趋势(一)云计算相关领域介绍
  19. CSPS2019Day1T1(格雷码)题解
  20. AndroidSDK目录和源码目录详解

热门文章

  1. 吴恩达神经网络和深度学习-学习笔记-17-batch归一化(Batch Normalization)(BN)
  2. 吴恩达神经网络和深度学习-学习笔记-5-参数和超参数
  3. mac电脑开发环境配置
  4. SpringBoot:第一篇 新建spring boot 应用
  5. 初识AngularJS 之 HelloWorld和数据绑定
  6. 用ajax向处理页面传送路径问题解决方法
  7. 深入理解Java虚拟机2——内存管理机制及工具
  8. 系统也需和谐共存——Win7与XP安装同一盘符方法解析
  9. #语音信号处理基础(十一)——梅尔倒谱系数的提取
  10. [转载] 【Python】向json文件中追加新的对象