《JVM第7课》堆区
1.概念
堆是JVM中最重要的一块区域,JVM规范中规定所有的对象和数组都应该存放在堆中,在执行字节码指令时,会把创建的对象存入堆中,对象的引用地址存入虚拟机栈的栈帧中。不过当方法执行完之后,刚刚所创建的对象并不会立马被回收,也就是说对象并不会随着栈帧的消失而消失,而是要等JVM后台执行GC后,对象才会被回收。
2.指定堆大小
-Xms:指定堆的初始内存大小,ms(memory start)。等价于 -XX:InitialHeapSize;
-Xmx:指定堆的最大内存大小,mx(memory max)。等价于 -XX:MaxHeapSize;
一般会把 -Xms 和 -Xmx 设置为一样,这样JVM就不需要在GC后去修改堆的内存大小了,提高了效率。默认情况下,-Xms等于物理内存大小/64,-Xmx等于物理内存大小/4。
3.新生代和老年代
垃圾回收算法有很多,但基本上都会把内存分为新生代和老年代两块区域。新生代存放新创建的对象,老年代存放执行了许多次GC(默认为15次)后还存活的对象。
可以通过 -XX:NewRatio 参数来配置老年代和新生代的比例,默认为 -XX:NewRatio=2,表示新生代占1,老年代占2。一般是不需要调整的,只有明确知道存活时间比较长的对象偏多或偏少,才需要调整 -XX:NewRatio 的比值。
3.1 新生代
新生代又可以分为 Eden(伊甸园区)和 S0、S1 区。
Eden: 伊甸园区,新对象都会先放到Eden区。
S0、S1区: Survivor0、Survivor1区,也可以叫做from、to区,用来存放MinorGC(YGC)后存在的对象。
默认情况下 Eden、S0、S1 的比例为 8:1:1,也就是说Eden区占新生代大小的 8/10。可以通过 -XX:SurvivorRatio 来调整。
3.2 老年代
老年代存放执行了许多次GC后还存活的对象。老年代默认占内存区域的2/3。
3.3 动画演示
动画演示对象在内存各区域中的流转过程
- 对象会先被放到Eden区。
- 执行 Young GC 后会被放到S0或S1区,S0和S1不能同时非空,对象会在S0和S1之间反复跳跃。
- 在执行一定次数(默认为15次)的 Young GC 后假设对象还没有被回收掉,就会进入老年代区域。
- 如果新对象大小超过了 Eden 区剩余空间大小,则会直接进入S0或S1,如果S0或S1放不下则会直接进入老年代。
- 老年代继续执行 Old GC 对其中对象进行回收。
- 这里的 Young GC 和 Old GC 也可叫做 Minor GC 和 Major GC,它们并不是垃圾回收器的名字,只是代表年轻代和老年代的垃圾回过程。
4.分代收集理念
上面的新生代老年代就是分代收集理念,有些时候会被叫做分代收集算法,但其实它是一种理念。默认几乎所有的垃圾回收算法都是采用分代收集理念。
为什么垃圾回收算法要把内存区域分为新生代和老年代,新生代里又包含Eden区、Survivor0、Survivor1区呢?
这是因为不同的对象存活时长是不一样的,所以要针对存活时长不同的对象采取不同的垃圾回收算法。
- 新生代中的对象存活时间比较短,那么就可以采取“复制算法”(后面的章节会介绍)。
- 老年代中的对象存活时间比较长,所以不太适合用复制算法,可以用“标记-清除算法”或“标记-整理算法”(后面的章节会介绍)。
《JVM第7课》堆区的更多相关文章
- JVM内存结构之堆、栈、方法区以及直接内存、堆和栈区别
JVM内存结构之堆.栈.方法区以及直接内存.堆和栈区别 一. 理解JVM中堆与栈以及方法区 堆(heap):FIFO(队列优先,先进先出):二级缓存:*JVM中只有一个堆区被所有线程所共享:对象和数 ...
- 转 方法区(method) )、栈区(stack)和堆区(heap)之JVM 内存初学
JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指 ...
- JVM笔记五-堆区
JVM笔记五-堆区 在JVM中,堆区是重中之重.通过前面文章的学习,我们知道了,栈区是不会有垃圾回收的,所以,经常说的垃圾回收,其实就是回收的是堆区的数据.在这里,我们将会看到传说中的,新生代.老年代 ...
- JVM之栈、堆、方法区(三)
一.CPU和内存的交互 今天除夕,祝大家新年快乐,其实,我们知道的,我们的CPU跟内存会有非常频繁的交互,因为如果这个频繁的交互是交给我们的磁盘的话,那么随着我们的CPU运转速度越来越快,那么我们的磁 ...
- JVM入门——运行时数据区
这张图我相信基本上对JVM有点接触的都应该很熟悉,可以说这是JVM入门的第一课.其中的“堆”和“虚拟机栈(栈)”更是耳熟能详.下面将围绕这张图对JVM的运行时数据区做一个简单介绍. 程序计数器(Pro ...
- 「每日五分钟,玩转JVM」:线程共享区
前言 上一篇中,我们了解了JVM中的线程独占区,这节课我们就来了解一下JVM中的线程共享区,JVM中的线程共享区是跟随JVM启动时一起创建的,包括堆(Heap)和方法区()两部分,而线程独占区的程序计 ...
- Java把内存划分为4个部分 1. 代码区 1、栈区 3、堆区 4、静态区域
1.栈区(stacksegment)—由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放JVM内存资源 2.堆区(heapsegment)—一般由程序员分配释放 ...
- 【转】 Java虚拟机内存的堆区(heap),栈区(stack)和静态区(static/method)
JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区:1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令 ...
- 深入理解JVM(2)——运行时数据区
1.运行时数据区 1.1.程序计数器 记录当前线程正在执行的字节码指令的地址,如果正在执行的是 Native 方法,这个计数器值则为空. 1.2.虚拟机栈 每个 Java 方法在执行的同时会创建一个栈 ...
- JVM异常之:方法区溢出OutOfMemoryError: PermGen space
1.方法区溢出(Perm持久代溢出) 在jdk1.6及之前的版本中,常量池放在Perm区也即是方法区中,所以在jdk1.6版本中,常量池溢出可以说是方法区溢出. 示例一: 方法区溢出的示例见<J ...
随机推荐
- windows中好用的工具
windows中好用的工具和浏览器插件 一.geek卸载软件 软件介绍 geek一款非常简洁的卸载软件,并且非常强大,强大到可以清理注册表,用过的都说好. 下载地址: https://geekunin ...
- WPF自定义控件之ItemsControl鱼眼效果
原理 先获取鼠标在控件中的坐标,在获取其每一项相对于ItemsControl的坐标,然后计算每一项离当前鼠标的距离,在根据这个距离,对其每一项进行适当的缩放 实现 创建一个类,命名为FishEyeIt ...
- CORDIC算法解释及FPGA实现(圆坐标系)
CORDIC算法解释及Verilog仿真(圆坐标系) CORDIC算法原理阐述 CORDIC(Coordinate Rotation Digital Computer)算法,即坐标旋转数字计算方法,是 ...
- 基于surging的产品项目-木舟开源了!
一 . 概述 因为前段时间电脑坏了,导致代码遗失,踌躇满志马上上线的平台产品付之东流,现在熬夜在写代码希望能尽快推出企业正常使用的平台产品,而这次把代码开源,一是让大家对surging 使用有个深入的 ...
- Excel 导入的开发经验
2020 年开始接触 Java Excel 导入的开发工作. 一家建筑机器人的公司离职后,来到广州找的是一家工厂,开始接触导入的开发工作.之前也没有什么使用开发经验, 是 教学视频 中看到过有些老 ...
- C语言基础函数
C语言 文件操作 fopen(filename, "r") // 只读模式打开文件 -r // 只读 -w // 可写 -b // 二进制 fgetc(fd) // 从fd获取ch ...
- 卡农 -- HNOI2011 -- DP&组合
卡农 -- \(HNOI2011\) $$luogu$$ $$HZOI$$ 题意 给定一个 集合 $ A= { 1 \le x \le n | x } $ , 求出其 \(m\) 个不相同的且不为空集 ...
- .NET 6 使用Nlog 记录日志到本地并写入SQLserver数据库
1. 安装Nlog 对应Nuget包版本 NLog:5.0.4 NLog.Database:5.0.4 NLog.Web.AspNetCore:5.1.4 Microsoft.Data.SqlClie ...
- Centos8下Redis设置Session共享存储
Redis-Session共享存储 前提条件: 1.安装Redis 2.安装Apache或Nginx 3.安装php 本机环境: php:7.3 Redis:5.0.7 开始部署: 我是分别用Cent ...
- Flutter Engage China 开发者常见问题解答 | 下篇
再次感谢大家对 Flutter Engage China 活动 的关注和积极参与!我们在活动前后收到了很多来自开发者的反馈和问题,Flutter 团队和演讲嘉宾在直播 Q&A 环节中也针对部分 ...