JVM-堆-堆的核心概述-01
一个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相关推荐
- JVM之堆Heap体系概述
JVM之堆Heap 目录: JVM体系结构概览 JVM之堆Heap解析 2.1 Heap 堆 2.2 新生区解析 2.3 永久带解析 1. JVM体系结构概览 2. JVM之堆Heap解析 2.1 H ...
- JVM之堆Heap参数调优入门
JVM之堆Heap参数调优入门 目录: JVM体系结构概览 JVM之堆Heap参数调优入门 2.1 java7和 java8堆结构图 2.2 堆内存调优简介 1. JVM体系结构概览 2. JVM之堆 ...
- Java8 JVM运行时数据区概述 (极其详细长文)
文章目录 运行时数据区概述 JVM中的线程说明 PC寄存器(PC Register) PC寄存器介绍 使用举例 问题:使用PC寄存器存储字节码指令地址有什么用?为什么使用PC寄存器存储? 问题:为什么 ...
- 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 ...
- (全栈旅行足迹地图打卡网站 0-1)-项目概述-01(WebGIS Vue-js-go-mysql)
专栏介绍 首先本专栏是一个全栈项目的旅行足迹地图打卡网站,定位是一个想要做开发的小伙伴,还有就是刚刚开始学习Web项目的大学生,想要做项目或者其他设计的学习源.也定位于目标想要快速上手 WebGIS ...
- 欧尼酱讲JVM(14)——堆
目录 位置图解 堆的简介 堆空间中关于对象创建和GC 堆的细分内存结构 堆空间大小设置和查看 查看设置的参数 OOM异常说明与举例 新生代与老年代相关参数设置 图解对象分配的一般过程 对象分配过程概述 ...
- 测试串行回收与堆初始值有关系01
吞吐量到底是什么意思啊,我们开始是实战的做调优了,首先吞吐量是什么意思呢,你们可以找到一个文档,它会专门有一个测试报告,Average是平均响应的时间,响应时间是21秒,我们主要是看这个数字Throu ...
- mysql8 堆应该给多大_深入进阶:图解分析JVM内存堆布局
JAVA能够实现跨平台的一个根本原因,是定义了class文件的格式标准,凡是实现该标准的JVM都能够加载并解释该class文件,据此也可以知道,为啥Java语言的执行速度比C/C++语言执行的速度要慢 ...
- JVM内存堆布局图解分析
转载原文出处:http://www.codeceo.com/article/jvm-memory-stack.html JAVA能够实现跨平台的一个根本原因,是定义了class文件的格式标准,凡是实现 ...
最新文章
- 分享我们用Leangoo看板工具做的采购看板,超级好用
- 【Network Security!】网络安全常用术语
- 【赠书】如何掌握好自然语言处理中的预训练语言模型?你需要读这本书
- NDK学习笔记-多线程与生产消费模式
- SpringBoot整合Swagger 自动生成在线API文档 偷懒必备 同时也是我们的基本操作啦!!!
- TCP之keepalive机制的应用场景
- git 删除分支_常用Git操作命令指南
- github上的优秀项目和开发环境配置
- Linux下安装qt5步骤
- 22轴三菱Q系列程序案例点胶机,QJ71C24串口与位移传感器通信案例
- 梦幻西游热门服务器卡顿延迟,Win10梦幻西游很卡反应很慢该如何处理
- 模拟电路全系列复习题 恶补知识点
- 卫星轨道的计算是利用计算机的,轨道计算
- 京东返利PHP采集关键字,php-爬虫练习:抓取京东商品列表与详情-2019年10月18日...
- TypeScript 导出 Excel 表格(带斑马纹样式)
- Android创建子线程和回调主线程的几种方式
- 桂林电子科技大学计算机考研资料汇总
- python类初始化返回实例_Python基础——类、实例及初始化
- python定义公民类_Python-理解函数为”一等公民”
- vue.js 表格表单序号
热门文章
- 星巴克的成功,一切与咖啡无关
- [天坑]python从文件中读取数据排序_关于os.listdir()乱序问题
- Discuz!十问戴志康: Discuz! Q的未来不只是社区!
- 来看看CAD软件中那些你不知道的UCS图标问题吧!
- [日志]小沈阳搞笑经典语录
- 网页设计用表格设计一个计算器界面 用于小白入门 安排
- Ubuntu版本 AndroidStudio 中搜狗输入法不跟随焦点
- 人手一份核武器 - Hacking Team 泄露(开源)资料导览手册
- 计算机考控制科学工程,2016考研工学类专业介绍:控制科学与工程
- 苹果闪照如何第二次查看_六款苹果已购游戏共享【博德之门1+2】【战地霸主+搏击长空】【阿尔托的冒险+奥德赛】IOS帐号分享...