【JVM】运行时内存分配
程序计数器
用于标识线程执行到了字节码文件(class文件)的哪一行,当执行native方法时,值为undefined,各个线程私有
Java虚拟机栈
每个线程独有,每个方法执行时会创建一个栈帧,用于存储局部变量表等方法信息,即方法的执行会伴随着一个栈帧的入栈出栈。
栈帧的组成

如果线程请求的栈深度大于虚拟机允许的最大深度,将抛出StackoverflowError异常
栈最大深度由栈内存大小和局部变量表大小确定,即栈大小固定,局部变量表越大,栈深度越小,栈大小可通过-Xss参数设置,默认为1m
如果栈动态扩展失败,会抛出OutOfMemoryError异常,不过hotspot虚拟机不支持栈动态扩展,申请时失败了,会抛出OOM异常
本地方法栈
虚拟机执行native方法时使用,与Java虚拟机栈类似,hotspot将二者合在一起
Java堆
用于存储Java实例对象,垃圾收集器管理的内存区域,也称为GC堆(Garbage Collected Heap)。垃圾收集就发生在该区域,一般分为eden,servivor1,servivor2,old。
另外在Java8之前还有一个永久代,不过永久代实际上不属于堆内存,属于虚拟机内存,同时受垃圾收集器管理(fullgc时触发垃圾回收)。Java8之后删除了永久代,将方法区移动至元空间(Metaspace),使用native内存,移除虚拟机,防止OOM异常,元空间大小可以通过 -XX:MaxMetaspaceSize参数控制,fullgc时会对元空间进行垃圾回收;将字符串常量(JDK 7)迁移到Java堆中。
Java堆所有线程共享,不过可以通过设置TLAB(ThreadLocalAllocationBuffer)给各线程预留内存,提高内存分配时的效率。
Java堆可以通过-Xms和-Xmx设置初始大小和最大大小(虽然现在的项目一般将两个值设为相同以减少GC次数),当动态申请内存不足时,会抛出OOM异常。
方法区
用于存储已经被Java虚拟机加载的类型信息,常量,静态变量和即时编译器编译后的代码缓存等数据。Java8之前通过永久代实现,Java8之后通过元空间实现,实际为一个逻辑内存区域,多线程共享。Java的元空间会在fullgc时进行垃圾回收,主要进行类的卸载时方法区的垃圾回收。当内存分配出现不足时,会抛出OOM异常。
运行时常量池
属于方法区的一部分,用于存储类的版本,方法,字段,接口等描述信息,同时接受新的常量,例如String.intern()方法将字符串放入常量池中,实际将char[]存储到堆中的字符串常量池中,将引用存储到运行时常量池中。当内存不足时,抛出OOM异常。
注意,运行时常量池不等于字符串常量池,上面说了,字符传常量池在(JDK 7后移入)堆(老年代)中,而运行时常量池实际存储在元空间中
直接内存
直接内存不属于JVM虚机内存的一部分,属于native内存,JDK1.4后推出的NIO即可以直接操作Native内存,通过在Java堆中创建DirectByteBuffer对象控制Native内存。
【JVM】运行时内存分配的更多相关文章
- JVM 运行时内存结构
1.JVM内存模型 JVM运行时内存=共享内存区+线程内存区 1).共享内存区 共享内存区=持久带+堆 持久带=方法区+其他 堆=Old Space ...
- JVM运行时内存结构
原文转载自:http://my.oschina.net/sunchp/blog/369707 1.JVM内存模型 JVM运行时内存=共享内存区+线程内存区 1).共享内存区 共享内存区=持久带+堆 持 ...
- JVM运行时内存组成分为一些线程私
JVM运行时内存组成分为一些线程私有的,其他的是线程共享的. 线程私有 程序计数器:当前线程所执行的字节码的行号指示器. Java虚拟机栈:java方法执行的内存模型,每个方法被执行时都会创建一个栈帧 ...
- [转]JVM运行时内存结构
[转]http://www.cnblogs.com/dolphin0520/p/3783345.html 目录[-] 1.为什么会有年轻代 2.年轻代中的GC 3.一个对象的这一辈子 4.有关年轻代的 ...
- java程序运行时内存分配详解
java程序运行时内存分配详解 这篇文章主要介绍了java程序运行时内存分配详解 ,需要的朋友可以参考下 一. 基本概念 每运行一个java程序会产生一个java进程,每个java进程可能包含一个 ...
- JVM02——JVM运行时内存
在上一篇文章中,我们介绍了 JVM 的内存区域,本文我们将继续围绕 JVM 展开话题,介绍 JVM 运行时内存.关注我的公众号「Java面典」了解更多 Java 相关知识点. Java 堆从 GC 的 ...
- 基础篇:JVM运行时内存布局
目录 1 JVM的内存区域布局 2 JVM五大数据区域介绍 3 JVM运行时内存布局和JMM内存模型区别 4 JMM内存模型交互操作 欢迎指正文中错误 关注公众号,一起交流 参考文章 1 JVM的内存 ...
- 详细了解JVM运行时内存
详细了解JVM运行时内存 1.程序计数器 概念 程序计数器也叫作PC寄存器,是一块很小的内存区域,可以看做是当前线程执行的字节码的行号指示器.字节码的解释工作就是通过改变程序计数器里面的值来获得下一条 ...
- JVM运行时内存区
JVM运行时内存区是如何划分的? 方法区(Method Area):存储类的字节码信息.常量池 堆区(Heap Area):存储对象 Java方法栈(Stack Area):所有方法运行时,会创建一 ...
- Jvm运行时内存解析
一.jvm的概念 在了解jvm的概念之前,我们先来了解java平台的逻辑结构,图片来自<深入java虚拟机> 从图中我们可以看到jdk包含了jre,java语言和java开发工具和Api, ...
随机推荐
- 大数据-业务数据采集-FlinkCDC 读取 MySQL 数据存入 Kafka
目录 作用 app 产生各层数据的 flink 任务 bean 数据对象 common 公共常量 utils 工具类 app.ods.FlinkCDC.java package com.atguigu ...
- #1495:非常可乐(BFS+数论)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495 BFS解法 题目 给三个数字 s n m s=n+m s在1到100之间 就是个倒水问题可以从第 ...
- AtCoder Beginner Contest 215 (个人题解 A~F)
比赛链接:Here AB水题, C - One More aab aba baa 题意: 给出字符串 \(s\) 和整数 \(k\) ,请输出字典序第 \(k\) 大的原字符串 \(s\) 的排序 思 ...
- POJ - 1190 生日蛋糕(深搜+神奇的剪枝)
链接:https://ac.nowcoder.com/acm/contest/1015/B 题目描述 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱 ...
- 密码加密bcrypt
- Elasticsearch 索引与文档的常用操作总结一
本文为博主原创,未经允许不得转载: ES 的 Restful风格: Restful是一种面向资源的架构风格,可以简单理解为:使用URL定位资源,用HTTP动词(GET,POST,DELETE,PUT) ...
- 23- 数码管动态显示02-转换BCD码
1.BCD码 数码管动态显示的data[19:0]使用二进制数表示的多位十进制数,不能直接生成段选和片选信号,需要使用BCD码表示的十进制数 BCD码(Binary-Coded Decimal),又称 ...
- 06-verilog基础语法_5
How to build and test a module parameter defparam修改参数 Task & function Task Function function不可以调 ...
- Docker-01基本命令
1.Docker安装 系统镜像为Centos7.x yum包更新到最新 sudo yum update 安装需要的软件包,yum-util提供yum-config-manager功能.另外两个是dev ...
- [转帖]浪潮PM8222-SHBA、RAID 2GB PM8204、RAID 4GB PM8204,阵列卡配置方法
1.8222和8204对比 这几个型号的阵列卡都很相似,配置方法也基本一样 8204就是在8222上的基础上增加了缓存,可以通过下图对比 正面8204比8222多一个掉电保护接口 8204背面多了几个 ...