写在前面

本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见100个问题搞定Java虚拟机

解答

Java 虚拟机将堆划分为新生代和老年代。其中,新生代又被划分为 Eden 区,以及两个大小相同的 Survivor 区(From Survivor 和 To Survivor)。
之所以这样划分,是为了更好的进行垃圾回收,新生代中 Java 对象都是朝生暮死的,非常适合复制算法。
新建 Java 对象优先放到 Eden 区,当 Eden 区的空间耗尽时, Java 虚拟机便会触发一次 Minor GC,来收集新生代的垃圾。
Eden 区和 from 指向的 Survivor 区中的存活对象会被复制到 to 指向的 Survivor 区中,然后交换 from 和 to 指针,以保证下一次 Minor GC 时,to 指向的 Survivor 区还是空的。注意JDK8开始商用的 G1 垃圾回收器进行垃圾回收时不再区分新生代和老年代,G1 开创性的基于 Region 进行堆内存划分。

补充

默认情况下,Java 虚拟机采取的是一种动态分配的策略(对应 Java 虚拟机参数 -XX:+UsePSAdaptiveSurvivorSizePolicy),根据生成对象的速率,以及 Survivor 区的使用情况动态调整 Eden 区和
Survivor 区的比例。

当然,你也可以通过参数 -XX:SurvivorRatio 来固定这个比例。但是需要注意的是,其中一个 Survivor 区会一直为空,因此比例越低浪费的堆空间将越高。

Java堆是如何划分的?相关推荐

  1. JVM(java堆)

    Java堆 对于大多数应用来说,Java堆(Java Hcap)是Java虚拟机所管理的内存中最大的一块.Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建. 此内存区域的唯一目的就是存放对 ...

  2. 容器java堆内存什么时候回收_JVM内存垃圾回收方法

    概要: why:为什么回收,见what what:垃圾回收哪些内存(不可达对象的确定) when:何时执行GC(安全点.安全区域) how:如何回收(原理--垃圾回收算法.实现--垃圾收集器) 1.垃 ...

  3. java堆是什么_java中的堆是什么意思?

    java中的堆是什么意思? 发布时间:2020-06-10 19:27:03 来源:亿速云 阅读:198 作者:鸽子 对于大多数应用来说,Java堆(Java Heap)是Java虚拟机所管理的内存中 ...

  4. Java必突-JVM知识专题(一): Java代码是如何跑起来的+类加载到使用的过程+类从加载到使用核心阶段(类初始化)+类加载的层级结构+什么是JVM的内存区域划分?Java虚拟机栈、Java堆内存

    前言: 该章节知识点梳理:本文主要是入门和了解jvm,不做深入 1.Java代码是如何运行起来的? 2.类加载到使用的过程? 3.验证准备和初始化的过程? 4.类从加载到使用核心阶段:初始化.类加载器 ...

  5. Java堆内存分配与回收策略

    java主要在堆上分配内存,而Java堆又分为新生代(YoungGen)和老年代(OldGen)两个部分,新生代又再分为Eden区和Survivor区两部分,本文根据java堆的划分,描述hotspo ...

  6. Java堆内存是线程共享的!面试官:你确定吗?

    作者 l Hollis 来源 l Hollis(ID:hollischuang) Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点,所以,即使是一个Java的初学者,也一定或 ...

  7. 史上最全java堆,将知识点掰碎了给你嚼,还不信学不会。

    目录 一.开局一张图 二.堆的核心概述(注意"可能"."几乎"这几个关键字,后面会谈到) 举例 三.堆的内存细分结构 1.现在垃圾收集器大部分都基于分代收集理论 ...

  8. 46栈内存溢出、内存区域(程序计数器、Java 虚拟机栈、本地方法栈、Java 堆、方法区、直接内存、内存溢出)与内存溢出(对象实例化分析)

    46.什么情况下会发生栈内存溢出 46.1.Java 内存区域与内存溢出 46.1.1.内存区域 46.1.1.1.程序计数器 46.1.1.2.Java 虚拟机栈 46.1.1.3.本地方法栈 46 ...

  9. 1、虚拟机内存管理、运行时数据区、线程共享区、Java堆、新生代、老年代、Eden区域分配、方法区、线程独占区、虚拟机栈

    1.Java虚拟机内存管理 1.1.运行时数据区[Runtime Data Area] 1.1.1.线程共享区 1.1.1.1.Java堆[heap] 1.1.1.1.1.新生代.老年代.Eden区域 ...

最新文章

  1. 机器学习理论基础到底有多可靠?
  2. Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】...
  3. Python高手之路【二】python基本数据类型
  4. MFC VS2012对话框背景填图
  5. 学习总结之数据挖掘三大类六分项
  6. api签名_使用签名保护基于HTTP的API
  7. 企业的网站遭受木马攻击了,导致网站目录下所有文件都被篡改了
  8. Python的第三方库openpyxl
  9. 【 D3.js 入门系列 --- 4 】 怎样使用scale(比例)
  10. 腾讯校园招聘笔试 2019-8-17 第四题 另一种解法
  11. Orchard是如何运行的
  12. 百度下半年惩罚网站的低质量,坏消息到来硕士
  13. Ae:Roto 笔刷和调整边缘
  14. 做一个网站要多少钱?
  15. 微信小程序服务器配置流程 免费开启HTTPS
  16. dota英雄装备攻略,最全的英雄出装攻略介绍
  17. dcs常用的冗余方式_冗余技术在DCS平台应用分析
  18. android自动对焦第一次对焦,Android自定义相机实现自动对焦和手动对焦
  19. 安卓最新版本_小米穿戴app下载安装-小米穿戴app官方版下载v1.2.1 安卓最新版本...
  20. 【两天搞定小米商城】【第三步】小米商城之导航部分

热门文章

  1. 名字不带 Pro, 体验依然 Pro —— ONEPLUS 8 评测
  2. Linux_查看系统cpu个数、核心数、线程数
  3. 这个季节戴腕表,会让你的气质成倍提升!
  4. 学校机房如何监控?手把手教你操作
  5. Typora入门:全网最全教程
  6. 2020茂名市高中学校教学管理人才跟岗学习培训班莅临智慧教育装备展示体验中心参观学习
  7. matplotlib绘制网格线、水平参考线及垂直参考区域(1)
  8. 有限状态机FSM详解(2)——采用状态模式的FSM
  9. Extjs中EditorGridPanel粘贴Excel复制的数据
  10. mac 修改文件权限为777