运行时数据区:

运行时数据区主要分五块,分别是Method Area , VM Stack , Native Method Stack ,

Heap , program Counter Register。

Program Counter Register :

程序计数器是一小块内存空间,可以看作是当前线程所执行字节码的行号指示器。字节码解释器工作就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,各类基础功能也都是要依赖这个计数器来实现。

Java虚拟机的多线程是通过线程之间轮流切换并分配处理器的执行时间来实现的。也就是说,任何一个确定的时刻,一个处理器都只执行一个线程。因此为了保证线程切换的正确,每一个线程都有一个程序计数器,各个计数器互相不影响,独立存储。(线程私有内存)

如果线程在执行的是Java方法,那么程序计数器指向正在执行的字节码指令地址;如果一个线程执行的是Native方法,计数器值为空(Undefined)。

Java virtual Machine Stack:

和程序计数器一样,Java虚拟机栈也是线程私有的。它的生命周期与线程相同。虚拟机栈描述的是java方法执行的内存模型:

每个方法在执行的同时都会创建一个Stack Frame 用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每个方法从调用直到执行完成的过程,就对应着一个Stack Frame在虚拟机栈中入栈出栈的过程。

许多java程序员口中的栈,指的就是虚拟机栈的局部变量表。局部变量表存放了编译期可知的各种数据类型,包括8种基本类型和对象引用。

Reference类型:它不等同与对象本身,可能是一个指向对象起始地址的指针,也可能是指向一个对象的句柄(二级指针)或与此对象相关的位置,还有可能指向一条字节码指令的地址。

一个局部变量空间占32位,局部变量表在编译期完成分配。当进入一个方法时,这个方法需要在Stack Frame 中分配多大的局部变量空间是已经确定了的,此后大小也不会变化。

Java虚拟机规范中定义了两种异常:

1 )StackOverflowError :线程请求的栈深度大于虚拟机所允许的深度。(递归调用)

2)OutOfMemoryError : 大部分的虚拟机都支持空间的动态扩展,而如果扩展时无

法申请到足够的内存,就会抛出此异常。

Native Method Stack

本地方法栈与虚拟机栈的区别就是,虚拟机栈为执行Java字节码服务,本地方法栈为虚拟机使用到的Native方法服务。

虚拟机规范并没有对本地方法栈做使用方式和数据类型的强制规定,所以具体的虚拟机可以自由实现它。

Java Heap

Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存的唯一目的就是存放对象的实例,几乎所有的对象实例(包括数组)都放在这里分配内存。

Java堆可以处于物理上的不连续的空间(逻辑空间连续即可),实现时,既可以固定大小,也可以是可扩展的。

当堆中没有内存完成实例分配,并且堆也无法扩展时,会抛出OutOfMemoryError。

Method Area

Method Area和堆一样是各个线程共享的内存区域。它用于存储被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。

Method Area 也叫Non-Heap,很多人更愿意把它称为Permanent Generation(永生代),事实上,有的虚拟机设计者选择吧GC分代收集扩展到方法区,或者说使用永生代实现方法区,这样JavaGC就可以像管理Heap一样管理MethodArea,省去了专门为MethodArea专门写GC的麻烦。而永生代实现方法区并不是一个好主意,因为更容易出现内存溢出。现在逐渐开始采用Native Memory来实现方法区。

Runtime Constant Pool

运行时常量池是方法区的一部分。Class文件中除了有类的版本,字段,方法,接口等描述信息外,还有一项信息是Constant Pool Table(常量池)用于存放编译期生成的各种字面量和符号引用。Constant Pool Table 将会在类加载后进入方法区的运行时常量池中存放。

Runtime Constant Pool 相对于Class 文件常量池的一个重要特征就是具备动态性。Java中常量并不是只有在编译期才能产生,也就是并非只有置入Class常量池中的内容才能进入方法区的运行时常量池,运行期间也可以将新的常量放入池中。这种特性被利用的比较多的就是String的intern()方法。

Direct Memory

Direct Memory不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存。但这并非内存也被频繁使用,而且可能导致OutOfMemoryError。

直接内存不会受堆大小的限制。由于经常忽略直接内存,所以经常在动态扩展时导致出现OutOfMemoryError异常。

Java JVM 内存空间解析的更多相关文章

  1. Java JVM 内存泄漏--全解析和处理办法 [ 转载 ]

    Java JVM 内存泄露——全解析和处理办法 [转载]   @author 小筐子 @address http://www.jianshu.com/p/bf159a9c391a         JA ...

  2. JVM内存区域解析

    引言 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间.有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的 ...

  3. 深入探究JVM(1) - Java的内存区域解析

    http://blog.csdn.net/sczyh22/article/details/46652901<br>Java 虚拟机在执行Java程序的时候会把它管理的内存区域划为几部分,这 ...

  4. [ 转载 ] Java Jvm内存介绍

    一.基础理论知识 1.java虚拟机的生命周期: Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序.程序开始执行时他才运行,程序结束时他就停止.你在同一台机器上 ...

  5. java jvm内存管理/gc策略/参数设置

    1. JVM内存管理:深入垃圾收集器与内存分配策略 http://www.iteye.com/topic/802638 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想 ...

  6. Java jvm 内存回收机制

    http://blog.csdn.net/yaerfeng/article/details/51291903 在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方 ...

  7. JVM内存结构解析

    月初的时候个人网站到期了,不想再折腾重新建站了,以后还是来第三方博客写文章吧,可以省去很多问题.之前写的文章也不是很多,备份懒得做了,从头开始吧.博文仅仅是用来记录和学习总结,如有错误之处请帮忙指正! ...

  8. JVM内存空间划分与作用详解

    在之前已经对Java的字节码进行了非常详细而又系统的学习了,接下来开启jvm内存相关的新篇章,在一个新知识开头之前肯定得理论化的对其进行一个整体的介绍,所以摒弃浮躁,先来看看相关的理论,主要是看一下J ...

  9. 全网最硬核 Java 新内存模型解析与实验单篇版(不断更新QA中)

    个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...

随机推荐

  1. 关于配置httpd2.4.18+php5.6

    关于httpd2.4.18下载之前一直很烦php官网上的点半天看不到下载链接,直到看到这么几句话 大意是Apache http server 不提供二进制版本,只提供源代码.....如果你不能自己编译 ...

  2. Hyper-V 2016 配置管理系列(准备篇)

    2.1 推荐软硬件配置 2.2 Hyper主机前提准备 前提条件: 具有二级地址转换(SLAT)的64位处理器.要安装Hyper-V虚拟化组件(如Windows管理程序),处理器必须具有SLAT 足够 ...

  3. linux打开文件数测试

    /proc/sys/kernel/threads-max 系统最大线程数量 /proc/sys/vm/max_map_count 限制一个进程可以拥有的VMA(虚拟内存区域)的数量 /proc/sys ...

  4. 配置Maven镜像与本地缓存

    IntelliJ IDEA 安装后自带Maven,也可以使用自己安装的Maven. 配置阿里镜像与本地仓库文件夹 找到Maven的安装目录 打开settings.xml配置文件   修改mirrors ...

  5. 如何解析比特币中的交易原始数据rawData

    交易数据结构 有关交易的详细信息可以查看比特币的wiki网站:Transaction TxBinaryMap: 原始图片地址 交易的结构表格(Transaction): 示例数据 以一个正式网络的一笔 ...

  6. Aizu 2170 Marked Ancestor(并查集变形)

    寻找根节点很容易让人联想到DisjointSet,但是DisjointSet只有合并操作, 所以询问离线倒着考虑,标记会一个一个消除,这时候就变成合并了. 因为询问和查询的时间以及标记生效的时间有关, ...

  7. hdu-2680 Choose the best route---dijkstra+反向存图或者建立超级源点

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2680 题目大意: 给你一个有向图,一个起点集合,一个终点,求最短路 解题思路: 1.自己多加一个超级 ...

  8. 【BZOJ1562】[NOI2009] 变换序列(匈牙利算法)

    点此看题面 大致题意: 给你一个长度为\(n\)的序列\(D\),让你找到一个字典序最小的\(n\)的排列\(T\),满足\(D_i=min(|T_i-i|,n-|T_i-i|)\). 建图 我想建图 ...

  9. 常量池与方法区以及又读new String对象创建问题

    又拿出这道String str1 = new String("abc");创建几个对象的面试题梳理了一下常量池与方法区的关系,希望能把这两者的关系通过这道面试题说明白 方法区是什么 ...

  10. Jmeter模拟http请求

    一.获取用户信息(GET请求):http://hostname/getuser?userid=1 1.打开jmeter,创建一个线程组,再添加一个http请求Sampler 2.设置域名.路径.请求方 ...