JVM的内存分区
JVM的内存分区
这篇文章尝试讨论清楚JVM的内存分区情况。
1. JVM的内存和系统内存的关系
下图是对系统内存及JVM内存的大致描绘
对大多数操作系统,内存可以分为物理内存RAM及Swap(交换区)两大部分,Swap Space在物理上是一块独立的磁盘区域,当操作系统发现内存不够使用时,便开始使用交换区。
在系统层面,Linux系统的内存大致可以划分为:
- BIN,内核引导内存
- Kernel Space(内核内存),操作系统进行程序调度,内存分配,硬件资源管理等动作需要的内存
- User Space(用户内存),提供给各个进程使用
一个JAVA程序开始运行之后,是存在于系统之上的一个进程。这个进程所占用的内存由JVM管理。
2. JVM内存的划分
JVM的内存可以划分为以下几个主要部分:
- Program Counter Register,程序计数器,线程私有,是一块较小的内存空间,可以理解为当前线程执行字节码的行号指示器。
- Method Area,方法区,由各线程共享,用于加载类信息,常量,静态变量等数据。在HotSpot虚拟机的实现中,称这部分内存为Permanent Generation(永久代),这使得虚拟机可以像管理堆内存一样对这部分内存进行管理,可以通过参数-XX:MaxPermSize指定永久代的上限。而在其他虚拟机实现中并未使用永久代来实现方法区。当方法区无法满足内存分配需要时,便会抛出OutOfMemoryError。
- Java Heap,堆,线程共享,对大部分应用来说,这是JVM种最大的一块内存区域。JVM规范规定:所有的对象实例和数组都要在堆上分配。
堆是内存回收的主战场,因此由称为Garbage Collected Heap(GC堆),在分代收集策略下。堆可以进一步划分为新生代和老年代,更细致的:
- Eden区,对象第一次创建时,从Eden区开辟空间
- Survivor区,当Eden区不足以进行下次内存分配时,JVM触发一次GC,经过GC但未被回收的对象,被转移到Survivor区。Survivor分为From,To两部分,多次内存回收时未被回收的对象在这两块区域中来回转移。
- Old区,当经过一定次数的GC后仍未被回收的对象,JVM将其转移到老年代区
4. JVM Stack,JAVA虚拟机栈,线程私有,其生命周期与对应的线程相同。当每个方法执行时,均会创建一个栈帧(Stack Frame)用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每个方法的执行和完成,便对应着Stack Frame在虚拟机栈中的出栈和入栈的过程。通常意义上粗糙地将JVM内存划分为堆和栈,其中的栈便指的是JVM Stack.
5. Native Method Stack,本地方法栈,与JVM Stack类似,本地方法栈对应的是Native方法的执行管理。
此外,程序运行所需要的内存开辟在JVM的内存空间中,也可以直接申请系统内存(Directive Memory),但是直接申请的系统内存不受JVM的垃圾回收管理,其释放由系统层面控制,因此对于不关注内存回收的JAVA程序员来说,容易导致内存溢出等问题的发生。
JVM的内存分区的更多相关文章
- jvm性能优化及内存分区
jvm性能优化及内存分区 2012-09-17 15:51:37 分类: Java Some of the default values for Sun JVMs are listed below. ...
- Java虚拟机JVM内存分区及代码执行机制
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt230 1. JVM体系结构 图1 JVM体系结构 方法区:存放JVM ...
- JVM中的内存分区简介
1.JVM的内存区域划分: 大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) ...
- java语言:Linux与JVM的内存关系分
在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用大约800m.从表面上,物理内存应该 ...
- 转: 关于Linux与JVM的内存关系分析
转自: http://tech.meituan.com/linux-jvm-memory.html Linux与JVM的内存关系分析 葛吒2014-08-29 10:00 引言 在一些物理内存为8g的 ...
- Linux与JVM的内存关系分析
引言 在一些物理内存为8g的server上,主要执行一个Java服务,系统内存分配例如以下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约600m,Linux自身使用大约800m. 从表面 ...
- jvm的内存管理【转】
[转]JVM内存管理 这些日子一直在研究jvm内存管理的东西,网上的知识很多,总结一下,能沉淀下来的就是自己的! 首先,刚学java的时候就知道java类文件是以 .java为后缀的文件,经过java ...
- Linux与JVM的内存关系分析(转)
引言 在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约600m,Linux自身使用大约800m.从表面上,物理内存 ...
- jvm 常用内存分析命令
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt121 // 打印出内存占用情况 jstat -gcutil 12564 10 ...
随机推荐
- 聚类之dbscan算法
简要的说明: dbscan为一个密度聚类算法,无需指定聚类个数. python的简单实例: # coding:utf-8 from sklearn.cluster import DBSCAN impo ...
- 推荐几个不错的 java 教程和 HTML 教程
Java入门第一季 Java入门第二季 2小时学会Spring Boot Java模板引擎之Freemarker HTML+CSS基础课程 H5+JS+CSS3实现七夕言情 jQuery基础系列
- BZOJ:4209: 西瓜王
原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4209 (虽然仅仅是看在名字的份上,我们还是得说这题是一道) 绝世好题!西瓜王!西瓜王!西瓜 ...
- 【Java学习笔记之三】java中的变量和常量
变量和常量 在程序中存在大量的数据来代表程序的状态,其中有些数据在程序的运行过程中值会发生改变,有些数据在程序运行过程中值不能发生改变,这些数据在程序中分别被叫做变量和常量. 在实际的程序中,可以根据 ...
- HDU5131-Song Jiang's rank list HDU5135-Little Zu Chongzhi's Triangles(大佬写的)
Song Jiang's rank list Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 512000/512000 K (Java ...
- Exponentiation(java 大实数)
http://acm.hdu.edu.cn/showproblem.php?pid=1063 Exponentiation Time Limit: 2000/500 MS (Java/Others) ...
- 安装myeclipse后,打开时弹出:“该站点安全证书的吊销证书不可用”,怎样解决?
1.当弹出"该站点安全证书的吊销信息不可用.是否继续?"的对话框时,点击"查看证书",切换到"详细信息"TAB页,找到其"CRL分 ...
- [Golang]一道考察defer与命名返回值的题目
题目 输出: 4 1 3 解释 当函数有可命名结果形参时,结果形参的初始值被设置为零值,函数的return语句会设置结果形参的值 当函数有可命名结果形参时,defer函数是可以修改它,然后再将它的值返 ...
- python云算法
http://www.runoob.com/python3/python3-basic-operators.html 本章节主要说明Python的运算符.举个简单的例子 4 +5 = 9 . 例子中, ...
- hash算法 (hashmap 实现原理)
Hash ,一般翻译做" 散列" ,也有直接音译为" 哈希" 的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出 ...