【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, ...
随机推荐
- 解决Github中使用Octotree时,出现 Error: API limit exceeded 报错 或者 Error: Connection error报错的问题(详细操作)
对于科研工作者来说,Github 是不可多得的利器,那么Octotree 插件的使用将会让用户在使用 Github 时拥有更好的体验,提高学习工作的效率.但是笔者在使用的过程中遇到以下这样的问题,下面 ...
- 【每日一题】20.K-th Number (二分 + 尺取)
关于此题,我们分析一下: 一个区间第k大的数不小于x的条件是什么? 答案就是一个区间内不小于x的数的个数不小于k 那么,我们就会发现,我们其实并不需要知道每个数的值,实际上对我们有用的只有每个数与x的 ...
- [kuangbin] 专题13 基础计算几何 题解 + 总结
kuangbin带你飞:点击进入新世界 [kuangbin] 专题7 线段树 题解 + 总结:https://www.cnblogs.com/RioTian/p/13413897.html kuang ...
- 体验有礼 | 1 分钟 Serverless 极速部署个人网盘,真网盘真好用!
你想自己搭一个无敌好用的网盘吗? 想 接着看,还有奖品呢! -- 当前,网盘几乎已成为现代人的标配,而市面上的网盘功能.费用各异,让用户们陷入了对比价格和功能的迷阵中.别对比了,动手吧!作为对存储.流 ...
- java字符串与json互转
开发中经常遇到将字符串转成json和字符串转成json属组的方法,网上搜到的方法,好多都是不好用的,今天这里记录一下方便自己今后查看,也提供给需要的人. 依赖: <!-- 处理json --&g ...
- Nacos源码 (4) 配置中心
本文阅读nacos-2.0.2的config源码,编写示例,分析推送配置.监听配置的原理. 客户端 创建NacosConfigService对象 Properties properties = new ...
- 基于AHB_BUS的eFlash控制器的架构设计
eFlash控制器的架构设计 1.架构设计思路分析 1.1 含有的模块分析 eFlash控制器是一个基于AHB的slave,所以需要一个AHB_slave_if处理AHB的信号.AHB_slave_i ...
- 使用Swagger,在编写配置类时报错Caused by: java.lang.NullPointerException: Cannot invoke "org.springframework.web.servlet.mvc.condition.PatternsRequestCondition.getPatterns()" because "this.condition" is null
1.问题 Caused by: java.lang.NullPointerException: Cannot invoke "org.springframework.web.servlet. ...
- Laravel - Could not open input file: artisan 的解决方法
cd 到 laravel的目录中执行 就可以了
- web-云部署上线