JVM的内存分区

这篇文章尝试讨论清楚JVM的内存分区情况。

1.       JVM的内存和系统内存的关系

下图是对系统内存及JVM内存的大致描绘

对大多数操作系统,内存可以分为物理内存RAM及Swap(交换区)两大部分,Swap Space在物理上是一块独立的磁盘区域,当操作系统发现内存不够使用时,便开始使用交换区。

在系统层面,Linux系统的内存大致可以划分为:

  1. BIN,内核引导内存
  2. Kernel Space(内核内存),操作系统进行程序调度,内存分配,硬件资源管理等动作需要的内存
  3. User Space(用户内存),提供给各个进程使用

一个JAVA程序开始运行之后,是存在于系统之上的一个进程。这个进程所占用的内存由JVM管理。

2.       JVM内存的划分

JVM的内存可以划分为以下几个主要部分:

  1. Program Counter Register,程序计数器,线程私有,是一块较小的内存空间,可以理解为当前线程执行字节码的行号指示器。
  2. Method Area,方法区,由各线程共享,用于加载类信息,常量,静态变量等数据。在HotSpot虚拟机的实现中,称这部分内存为Permanent Generation(永久代),这使得虚拟机可以像管理堆内存一样对这部分内存进行管理,可以通过参数-XX:MaxPermSize指定永久代的上限。而在其他虚拟机实现中并未使用永久代来实现方法区。当方法区无法满足内存分配需要时,便会抛出OutOfMemoryError。
  3. 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的内存分区的更多相关文章

  1. jvm性能优化及内存分区

     jvm性能优化及内存分区 2012-09-17 15:51:37 分类: Java Some of the default values for Sun JVMs are listed below. ...

  2. Java虚拟机JVM内存分区及代码执行机制

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt230 1.  JVM体系结构 图1 JVM体系结构    方法区:存放JVM ...

  3. JVM中的内存分区简介

    1.JVM的内存区域划分: 大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) ...

  4. java语言:Linux与JVM的内存关系分

    在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用大约800m.从表面上,物理内存应该 ...

  5. 转: 关于Linux与JVM的内存关系分析

    转自: http://tech.meituan.com/linux-jvm-memory.html Linux与JVM的内存关系分析 葛吒2014-08-29 10:00 引言 在一些物理内存为8g的 ...

  6. Linux与JVM的内存关系分析

    引言 在一些物理内存为8g的server上,主要执行一个Java服务,系统内存分配例如以下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约600m,Linux自身使用大约800m. 从表面 ...

  7. jvm的内存管理【转】

    [转]JVM内存管理 这些日子一直在研究jvm内存管理的东西,网上的知识很多,总结一下,能沉淀下来的就是自己的! 首先,刚学java的时候就知道java类文件是以 .java为后缀的文件,经过java ...

  8. Linux与JVM的内存关系分析(转)

    引言 在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约600m,Linux自身使用大约800m.从表面上,物理内存 ...

  9. jvm 常用内存分析命令

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt121 // 打印出内存占用情况 jstat -gcutil 12564 10 ...

随机推荐

  1. 基于 Webpack 引入公共库的几种方式

    以 jquery 和其插件 jquery-modal 为例,记录下引入公共库的几种方式. 为了方便,首先安装 jquery 和 jquery-modal: cnpm i jquery jquery-m ...

  2. rjs 合并压缩完 js 后 js 不压缩的问题

    线下用 requirejs 开发完后,代码上线前要用 rjs 将多个有依赖关系的 js 文件压成一个,然后某天居然发现压成一个的 js 文件,没有压缩!!!几万行的 js!!! 很显然,是 uglif ...

  3. CodeChef June Challenge 2017

    好气啊,本来以为比赛时间还有很多,结果回家养病两天回到学校怎么比赛就结束了(雾),大约是小高考弄错了时间? 挑3道有意思的写写题解吧. Cloning 题目大意:给一个序列,每次询问两个等长区间,问区 ...

  4. JAVA实现网页上传头像

    大概实现就是在页面嵌入一个file类型的input控件,并且将之隐藏,点击上传传递到这个控件上面,选择文件,将图片以base64的方式传递到后台,后台解码器解码,保存图片,并且把图片名字保存到数据库或 ...

  5. 【django基础补充之URL,视图,模版】

    一.url路由配置 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这段代 ...

  6. java使用Websocket获取HttpSession出现的问题与解决

    websocket的写法就不多说了,主要记一记其中出现的问题 1.获取不到httpSession 解决办法:先重写握手方法,将httpsession放入ServerEndpointConfig.get ...

  7. PhpStorm (强大的PHP开发环境)2017.2.4 附注册方法

    http://www.oyksoft.com/soft/40722.html?pc=1 最新版PhpStorm 2017正式版改进了PHP 7支持,改进代码完成功能. PhpStorm 是最好的PHP ...

  8. Codeforces 900 E. Maximum Questions (DP,技巧)

    题目链接:900 E. Maximum Questions 题意: 给出一个长度为n只含有a和b还有'?'的串s,且'?'可以被任意替换为a或b.再给出一个字符串t (奇数位上为a,偶数位上为b,所以 ...

  9. Apache 403 错误解决方法-让别人可以访问你的服务器

    参考网址:http://www.cnblogs.com/mrlaker/archive/2013/04/29/3050888.html http://www.jb51.net/article/6119 ...

  10. JS事件捕获和事件冒泡

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 19.0px; font: 14.0px "Helvetica Neue" ...