JVM内存管理-运行时数据
来源:互联网 发布:野生程序员博客 编辑:程序博客网 时间:2024/05/16 14:20
序
运行时数据
根据java虚拟机规范,Java的运行时数据如下图所示:
解释
1、程序计数器
2、虚拟机栈
3、本地方法栈
本地方法栈与虚拟机栈类似,区别就是虚拟机栈执行的是Java的字节码,本地方法栈执行的是本地的native方法。虚拟机规范对这块区域没有强制的规定,有的虚拟机甚至将虚拟机栈和本地方法栈合二为一,这块区域也可能抛出StackOverFlowError异常和OutOfMemoryError异常。
4、虚拟机堆(Java堆、GC堆)
这是Java虚拟机中最大的一块区域,主要是用于保存实例对象的,JVM规范对此有明确规定,所有的对象实例和数据都应该分配在此块区域中,但这个并不是那么绝对的。
与栈不同,堆是所有线程所共享的。
这块区域也是java垃圾回收主要负责的区域,大部分的虚拟机实现都是可扩展的(可通过-Xmx和-Xms来控制),如所申请的空间大于堆所允许的空间,会抛出OutOfMemoryError异常。
5、方法区
方法区和堆一样,也是所有线程所共享,同样不需要连续的内存单元,只要逻辑上相连即可(栈所需要的内存是连续的),它主要保存类的相关信息、常量、静态变量等等。Java的垃圾回收在此块区域是比较少见的,主要是针对常量池的回收和类的卸载。此块区域也有可能抛出OutOfMemoryError异常。
补充:
6、运行时常量池
运行时常量池是属于方法区的一部分,用于保存编译时产生的字面值和符号引用。也就是说,这块区域是编译时就一定确定下来的,但是jvm规定可以在运行时动态的改变常量池中的内容,例如String类中intern()方法。
同样也有可能抛出OutOfMemoryError异常。
7、直接内存
顾名思义,这块区域并不属于Java运行时的内存。也不属于Java虚拟机,它是在本地PC机上分配的一块内存。一般使用较少,但在使用native方法时可能会用到,在java堆中保存了该块内存的引用,主要是为了防止本地PC机内存和Java虚拟机内存之间的来回复制。它也有可能抛出OutOfMemoryError异常。
总结
- JVM内存管理-运行时数据
- 1.JVM内存管理——运行时数据区域
- jvm内存模型(运行时数据区)
- jvm 运行时内存数据区
- JVM运行时内存数据区结构及内存参数
- jvm运行时内存
- JMV-内存管理-运行时数据区域
- java JVM的内存区域(运行时数据区域)
- 【jvm】JAVA运行时数据区与内存分配
- JVM内存管理机制--运行时数据区域(详解)
- JVM的内存分区----运行时的数据区域
- java JVM的内存区域(运行时数据区域)
- Java内存区域 JVM运行时数据区
- java JVM的内存区域(运行时数据区域)
- java JVM的内存区域(运行时数据区域)
- Java内存模型小析值JVM运行时数据区域(一)
- JVM自动内存管理机制之运行时数据区域
- JVM内存管理机制--运行时数据区域(详解)
- WPF和Expression Blend开发实例:充分利用Blend实现一个探照灯的效果
- 【web++_第三阶_Ajax_Rest篇】Ajax 第一篇:基础解释和联系,附解释与Rest关系_4
- onblur()导致循环调用
- Python内置函数__import__和eval用法
- Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
- JVM内存管理-运行时数据
- 正则表达式 学习网站
- Factory Method模式讲解
- Bro Sorting(2014ACM/ICPC亚洲区北京站-K)
- 游戏引擎加入lua
- android之Fragment的bug解决
- C++中在子函数中动态分配内存
- C/C++中const关键字详解
- Python 列表元素去重的3种方法