jvm运行数据分布
本人看的深入理解jvm(该版本的java se7)
java运行时数据区域
Java虚拟机在执行java程序时,把内存划分为几个不同的阶段,存在不同的存在时间。不同的用途
先上图
程序计数器:是jvm中一小块内存空间,可以当做当前线程的字节码文件的行号,字节码解释器通过改变这个值来获取下一个指令。Java多线程通过线程轮流切换处理器的执行时间来执行的,大家知道现代处理器的原理,每次一个核上只能一个线程进行运转,由于中断,因此每个程序计数器都是独立的,这些程序计数器的所在的内存称为线程私有的内存。如果线程执行的是java方法,那么程序计数器指代的是当前字节码指令的地址,如果是native方法,程序计数器的值为空,这处区域是jvm没有定义OutOfMemoryError错误
虚拟机栈:打个比方,一般吧java内存粗略分为堆栈,这个虚拟机栈中的局部变量表就是传说中的栈,线程私有的,描述java方法执行的内存模型:每个方法在执行的时候都会建立一个这个;用于存储局部变量表,操作数栈,动态链接,方法出口等,每一个方法从调用到执行完,就代表一个栈帧在虚拟机栈中从入栈到出栈的过程其中局部变量表存放了编译器可知的基本变量(boolean,int,double,float,char),还有引用类型(),renturnAddress类型(指向了一个字节码的地址)局部变量表的大小信息在编译期间就确定好了,运行期间不会改变其大小,该虚拟机栈回报2个错误,第一个就是请求的栈帧大于虚拟机栈的深度回报StackOverflowError错误第二个错误就是虚拟机栈动态扩张,扩张到无法申请到内存时报OutOfMemoryError错误
本地方法栈:和虚拟机栈差不多,不过不是java方法是native方法,java规范对native方法的语言和数据格式没有强制要求虚拟机可以自由的去实现它,报的错误也是StackOverflowError错误和OutOfMemoryError错误
Java堆:第一它是所有线程共享的,虚拟机启动创建堆,主要用于存储对象实例和数组,Java垃圾处理器主要处理的就是java堆,因此java堆也被称为gc堆,从内存回收的角度上讲可以划分为新生代和老生代,从内存分配角度讲,可以划分出多个线程私有的内存区域等,java堆有多种划分方式,但是无论怎么划分都是存储对象实例,多重划分是为了更好的划分内存和回收内存,java堆可以位于内存上不连续的空间上,只要逻辑上连续即可,java堆可以实现为固定大小的,也可以实现为可扩展大小的,要是java堆上无法为实例对象分配内存,那么就会报这个OutOfMemoryError
方法区:各个线程共享的区域,主要存储被虚拟机加载的类信息,常量,静态变量,编译器编译后的代码,和java堆一样逻辑上内存,可扩展的实现大小,这个区域的垃圾回收主要针对常量池的回收和类型的卸载,其中类型的卸载要求比较高,但是必要的垃圾回收是必要的,以前低版本的就出现过严重的内存泄漏。
运行期常量池:编译后的Class文件中的类名啊,方法名啊,常量啊被加载到虚拟机后就会放到方法去的运行常量池来保存,当然常量不止可以只是在编译期间放到常量池中,还可以用string.intern()方法(如果常量池中存在当前字符串, 就会直接返回当前字符串. 如果常量池中没有此字符串, 会将此字符串放入常量池中后, 再返回)来在运行期间放到常量池中,当然要是常量池中无法申请到内存时就会报出OutOfMemoryError这个经典错误
jvm运行数据分布的更多相关文章
- IntelliJ IDEA设置JVM运行参数
2015十一月 28 原 IntelliJ IDEA设置JVM运行参数 分类:JavaSE (11566) (1) 打开 IDEA 安装目录,看到有一个 bin 目录,其中有两个 vmoptions ...
- Java(JVM运行时)各种内存区域详解及扩展
本文整理于 Java内存与垃圾回收调优 Java 堆内存 从几个sample来学习Java堆,方法区,Java栈和本地方法栈 首先来一张图让我们理清楚java运行时状态: 诚然,如上图所示:java ...
- JVM 运行时内存结构
1.JVM内存模型 JVM运行时内存=共享内存区+线程内存区 1).共享内存区 共享内存区=持久带+堆 持久带=方法区+其他 堆=Old Space ...
- 深入解析java虚拟机-jvm运行机制
转自oschina 一:JVM基础概念 JVM(Java虚拟机)一种用于计算设备的规范,可用不同的方式(软件或硬件)加以实现.编译虚拟机的指令集与编译微处理器的指令集非常类似.Java虚拟机包括一套字 ...
- JVM运行时内存结构
原文转载自:http://my.oschina.net/sunchp/blog/369707 1.JVM内存模型 JVM运行时内存=共享内存区+线程内存区 1).共享内存区 共享内存区=持久带+堆 持 ...
- Jstatd方式远程监控Linux下 JVM运行情况
前言 最近一个项目部署在服务器上运行时出现了问题,经过排查发现是java内存溢出的问题,所以为了实时监控服务器java内存的情况,需要远程查看服务器上JVM内存的一些情况.另外服务器系统是CentOS ...
- 对JVM运行时常量池的一些理解
1.JVM运行时常量池在内存的方法区中(在jdk8中,移除了方法区) 2.JVM运行时常量池中的内容主要是从各个类型的class文件的常量池中获取,对于字符串常量,可以调用intern方法人为添加,而 ...
- JVM核心之JVM运行和类加载全过程
为什么研究类加载全过程? 有助于连接JVM运行过程 更深入了解java动态性(解热部署,动态加载),提高程序的灵活性 类加载机制 JVM把class文件加载到内存,并对数据进行校验.解析和初始化,最终 ...
- Java Jvm运行机制原理
一:简介 在学习Java虚拟机之前,也就是Jvm之前,我想大家能够带着问题去学习,这样的话,大家学习起来也会比较有所获! 1.Java虚拟机(Jvm)是什么? 2.Java虚拟机是用来干什么的? 3. ...
随机推荐
- 知方可补不足~sqlserver中触发器的使用
回到目录 触发器在过去的10年中,即存储过程和ado.net称霸江湖期间是那么的重要,而现在,trigger显得不是那么必要的,我们很少将复杂的业务写在SQL里,当然也会没有机会写到trigger里了 ...
- PSR规范
背景 Framework Interoperability Group(框架可互用性小组),简称 FIG,成立于 2009 年.FIG 最初由几位知名 PHP 框架开发者发起,在吸纳了许多优秀的大脑和 ...
- paip.2013年技术趋势以及热点 v2.0 cae
paip.2013年技术趋势以及热点 v2.0 cae HTML5 多核编程 物联网 可穿戴计算设备 3. 物联网 无论是M2M(机器对机器)通信应用,还是NFC(进距离通信)技术,都是物联网的组成部 ...
- 学习ASP.NET MVC(四)——我的第一个ASP.NET MVC 实体对象
今天我将根据数据库中的表结构添加一些类.这些类将成为这个ASP.NET MVC应用程序中“模型”的一部分. 我们使用Entity Framework(实体框架)来定义和使用这些模型类,并且 ...
- android TextView 文字垂直的设置
<TextView android:id="@+id/tv_status" android:layout_width="wrap_content" and ...
- 180分钟的python学习之旅
最近在很多地方都可以看到Python的身影,尤其在人工智能等科学领域,其丰富的科学计算等方面类库无比强大.很多身边的哥们也提到Python非常的简洁方便,比如用Django搭建一个见得网站只需要半天时 ...
- SeaJS与RequireJS最大的区别
SeaJS与RequireJS最大的区别 U_U 2013-06-20 16:21:12 执行模块的机制大不一样-----------------------------------由于 Requir ...
- OpenCascade Primitives BRep - Box
OpenCascade Primitives BRep - Box eryar@163.com Abstract. BRep is short for Boundary Representation. ...
- 【转】C#中如何实现左截取和右截取字符串
使用C#语法编写程序时,我们需要截取一个字符串左边或右边的若干个字符,该如何操作呢?在VB中可以使用left或right函数实现,C#中没有提供这样的函数呢?答案是没有.但是,C#中提供Substri ...
- 【原创】Newlife.XCode的常见功能使用(一)查询与数据初始化
本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html Newlife XCode组件相关文章目录:http://www ...