一个Java进程对应一个JVM实例 ,一个JVM实例只存在一个堆内存,一个Java进程对应多个线程,线程之间共用一个堆。

堆也是Java内存管理的核心区域。

Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。

  • 堆内存的大小是可以调节的。

《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。(内存映射)

所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)。(完整的堆空间是共享的吗?不是)==》 并发性更好

-Xms10m:最小堆内存

-Xmx10m:最大堆内存

《Java虚拟机规范》中对Java堆的描述是:所有的对象实例以及数组都应当在运行时分配在堆上。(The heap is the run-time data area from which memory for all class instances and arrays is allocated)

我要说的是:“几乎”所有的对象实例都在这里分配内存。—从实际使用角度看的。

  • 因为还有一些对象是在栈上分配的

数组和对象可能永远不会存储在栈上,因为栈帧中保存引用,这个引用指向对象或者数组在堆中的位置。

在方法结束后,堆中的对象不会马上被移除,仅仅在垃圾收集的时候才会被移除。

  • 也就是触发了GC的时候,才会进行回收

  • 如果堆中对象马上被回收,那么用户线程就会收到影响,因为有stop the word

堆,是GC(Garbage Collection,垃圾收集器)执行垃圾回收的重点区域。

public class SimpleHeap {private int id;public SimpleHeap(int id) {this.id = id;}public void show() {System.out.println("My Id is " + id);}public static void main(String[] args) {SimpleHeap s1 = new SimpleHeap(1);SimpleHeap s2 = new SimpleHeap(2);int[] arr = new int[10];Object[] arr1 = new Object[10];}}

堆的内存细分

现代垃圾收集器大部分都基于分代收集理论设计,堆空间细分为:

Java 7及之前堆内存逻辑上分为三部分:新生区+养老区+永久区

  • Young Generation Space 新生区 Young/New

    • 又被划分为Eden区和Survivor区

  • Tenure generation space 养老区 Old/Tenure

  • Permanent Space永久区 Perm

Java 8及之后堆内存逻辑上分为三部分:新生区+养老区+元空间

  • Young Generation Space新生区 Young/New

    • 又被划分为Eden区和Survivor区

  • Tenure generation space 养老区 Old/Tenure

  • Meta Space 元空间 Meta

约定:新生区 == 新生代 == 年轻代 、 养老区 == 老年区 == 老年代、 永久区 == 永久代

JDK1.7堆空间内部结构

 堆空间内部结构,JDK1.8之后从永久代 替换成 元空间

设置堆空间大小为10MB,

可以发现Eden + Surviver0 + Surviver1 = 3MB,Old为7MB

加起来一共10MB,可见元空间并没有算在堆内存中

JVM-堆-堆的核心概述-01相关推荐

  1. JVM之堆Heap体系概述

    JVM之堆Heap 目录: JVM体系结构概览 JVM之堆Heap解析 2.1 Heap 堆 2.2 新生区解析 2.3 永久带解析 1. JVM体系结构概览 2. JVM之堆Heap解析 2.1 H ...

  2. JVM之堆Heap参数调优入门

    JVM之堆Heap参数调优入门 目录: JVM体系结构概览 JVM之堆Heap参数调优入门 2.1 java7和 java8堆结构图 2.2 堆内存调优简介 1. JVM体系结构概览 2. JVM之堆 ...

  3. Java8 JVM运行时数据区概述 (极其详细长文)

    文章目录 运行时数据区概述 JVM中的线程说明 PC寄存器(PC Register) PC寄存器介绍 使用举例 问题:使用PC寄存器存储字节码指令地址有什么用?为什么使用PC寄存器存储? 问题:为什么 ...

  4. Xilinx Vitis HLS教程1--Vitis HLS概述[01/12]

    Xilinx Vitis HLS教程1--Vitis HLS概述[01/12] 前言 1 软件工程师的设计原则 1.1 简介 1.2 吞吐量和性能 1.3 架构问题 1.4 FPGA编程的3大范式 1 ...

  5. (全栈旅行足迹地图打卡网站 0-1)-项目概述-01(WebGIS Vue-js-go-mysql)

    专栏介绍 首先本专栏是一个全栈项目的旅行足迹地图打卡网站,定位是一个想要做开发的小伙伴,还有就是刚刚开始学习Web项目的大学生,想要做项目或者其他设计的学习源.也定位于目标想要快速上手 WebGIS ...

  6. 欧尼酱讲JVM(14)——堆

    目录 位置图解 堆的简介 堆空间中关于对象创建和GC 堆的细分内存结构 堆空间大小设置和查看 查看设置的参数 OOM异常说明与举例 新生代与老年代相关参数设置 图解对象分配的一般过程 对象分配过程概述 ...

  7. 测试串行回收与堆初始值有关系01

    吞吐量到底是什么意思啊,我们开始是实战的做调优了,首先吞吐量是什么意思呢,你们可以找到一个文档,它会专门有一个测试报告,Average是平均响应的时间,响应时间是21秒,我们主要是看这个数字Throu ...

  8. mysql8 堆应该给多大_深入进阶:图解分析JVM内存堆布局

    JAVA能够实现跨平台的一个根本原因,是定义了class文件的格式标准,凡是实现该标准的JVM都能够加载并解释该class文件,据此也可以知道,为啥Java语言的执行速度比C/C++语言执行的速度要慢 ...

  9. JVM内存堆布局图解分析

    转载原文出处:http://www.codeceo.com/article/jvm-memory-stack.html JAVA能够实现跨平台的一个根本原因,是定义了class文件的格式标准,凡是实现 ...

最新文章

  1. 分享我们用Leangoo看板工具做的采购看板,超级好用
  2. 【Network Security!】网络安全常用术语
  3. 【赠书】如何掌握好自然语言处理中的预训练语言模型?你需要读这本书
  4. NDK学习笔记-多线程与生产消费模式
  5. SpringBoot整合Swagger 自动生成在线API文档 偷懒必备 同时也是我们的基本操作啦!!!
  6. TCP之keepalive机制的应用场景
  7. git 删除分支_常用Git操作命令指南
  8. github上的优秀项目和开发环境配置
  9. Linux下安装qt5步骤
  10. 22轴三菱Q系列程序案例点胶机,QJ71C24串口与位移传感器通信案例
  11. 梦幻西游热门服务器卡顿延迟,Win10梦幻西游很卡反应很慢该如何处理
  12. 模拟电路全系列复习题 恶补知识点
  13. 卫星轨道的计算是利用计算机的,轨道计算
  14. 京东返利PHP采集关键字,php-爬虫练习:抓取京东商品列表与详情-2019年10月18日...
  15. TypeScript 导出 Excel 表格(带斑马纹样式)
  16. Android创建子线程和回调主线程的几种方式
  17. 桂林电子科技大学计算机考研资料汇总
  18. python类初始化返回实例_Python基础——类、实例及初始化
  19. python定义公民类_Python-理解函数为”一等公民”
  20. vue.js 表格表单序号

热门文章

  1. 星巴克的成功,一切与咖啡无关
  2. [天坑]python从文件中读取数据排序_关于os.listdir()乱序问题
  3. Discuz!十问戴志康: Discuz! Q的未来不只是社区!
  4. 来看看CAD软件中那些你不知道的UCS图标问题吧!
  5. [日志]小沈阳搞笑经典语录
  6. 网页设计用表格设计一个计算器界面 用于小白入门 安排
  7. Ubuntu版本 AndroidStudio 中搜狗输入法不跟随焦点
  8. 人手一份核武器 - Hacking Team 泄露(开源)资料导览手册
  9. 计算机考控制科学工程,2016考研工学类专业介绍:控制科学与工程
  10. 苹果闪照如何第二次查看_六款苹果已购游戏共享【博德之门1+2】【战地霸主+搏击长空】【阿尔托的冒险+奥德赛】IOS帐号分享...