java为什么要分代回收_浅谈Java堆内存分代回收
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堆内存分代回收相关推荐
- java手动回收_浅谈java是如何做资源回收补救的
学习java的过程,我们经常谈论一个对象的回收,尤其是资源类型,如果没有显示的关闭,对象就被回收了,说明出现了资源泄漏.java本身为了防止这种情况,做了一些担保的方式,确保可以让未关闭的资源合理回收 ...
- java接口与类相同不同_浅谈java的接口和C++虚类的相同和不同之处
C++虚类相当于java中的抽象类,与接口的不同之处是: 1.一个子类只能继承一个抽象类(虚类),但能实现多个接口 2.一个抽象类可以有构造方法,接口没有构造方法 3.一个抽象类中的方法不一定是抽象方 ...
- java中修饰常量的事_浅谈java中的声明常量为什么要用static修饰
今天定义一个类常量,想着也只有这个类可以用到,就没用static关键字修饰.结果sonar代码检查提示: Rename this field "PERSON_TYPE_USER" ...
- java gc 可以对方法区进行回收_浅谈 Java 之 GC
阅读本文假设你对java内存模型已有一些了解. 1.Java虚拟机中哪些内存需要回收? 先来看看jvm内存模型,如下图 线程隔离的区域随线程而生,随线程而灭:程序计数器可保存着虚拟机字节码指令的地址( ...
- java程序的装载与检查_浅谈Java类型装载、连接与初始化
类型装载.连接与初始化 Java虚拟机通过装载.连接和初始化一个Java类型,使该类型可以被正在运行的Java程序所使用.其中装载就是把二进制形式的Java class文件读入Java虚拟机中去;连接 ...
- java中的标识符和关键字_浅谈java中的标识符、修饰符和关键字
合法标识符 Java语言中,对于变量,常量,函数,语句块均有名字,我们统统称之为Java标识符.标识符是用来给类.对象.方法.变量.接口和自定义数据类型命名的. 组成:Java标识符由数字,字母和下划 ...
- java守护线程的使用场景_浅谈Java守护线程
一.在Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 1.Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾回收 ...
- 简述java中流的概念和划分_浅谈Java中流的概念与用途
Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.Java的I/O流提供了读写数据的标准方法.任何Java中表示数据源的对象都会提供以数据流的方式读写它的 ...
- java线程池和线程实例化_浅谈Java 线程池原理及使用方式
一.简介 什么是线程池? 池的概念大家也许都有所听闻,池就是相当于一个容器,里面有许许多多的东西你可以即拿即用.java中有线程池.连接池等等.线程池就是在系统启动或者实例化池时创建一些空闲的线程,等 ...
最新文章
- CentOS6.8下安装JDK1.8
- “cvSnakeImage”: 找不到标识符
- ubuntu 11.10上安装osdlyrics 歌词插件
- lucene源码分析(1)基本要素
- 四张照片合成一张怎么弄_精美!多张照片组合成一张的拼贴画,每一幅都令人惊叹...
- Docker网络通信openvswitch(来自龙果学院学习资料 + 自己实验结果)
- 一次性上传多个文件到服务器端(一)
- jsp输出所有请求头的名称
- python post 请求登录后的页面_python - 学习模拟登录,卡在发送POST请求之后?
- Hibernate_01_初体验
- 七月算法机器学习1 相关数学基础
- Word中插入的Excle打开后闪退如何解决? - Office2019
- Final类型数据的初始化
- 基于 InVEST 模型的水涵养功能评估数据获取
- linux mint 下如何制作win7启动盘
- unity给头发添加物理_U3D实时渲染教程之角色头发各向异性表达(上)
- nohup与前台后台操作
- 云计算的发展趋势(一)云计算相关领域介绍
- CSPS2019Day1T1(格雷码)题解
- AndroidSDK目录和源码目录详解