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. ...
随机推荐
- Visual Studio 2015 Bowser Link的功能不停的向服务端发送请求
Visual Studio 2015新建的mvc项目 默认在每个视图上生成一些JavaScript脚本
- java基础-继承:矩形体积类问题
28.按要求编写一个Java应用程序: (1)定义一个类,描述一个矩形,包含有长.宽两种属性,和计算面积方法. (2)编写一个类,继承自矩形类,同时该类描述长方体,具有长.宽.高属性, 和计算体积的方 ...
- 快速入门系列--TSQL-01基础概念
作为一名程序员,对于SQL的使用算是基础中的基础,虽然也写了很多年的SQL,但常常还是记不清一些常见的命令,故而通过一篇博文巩固相关的记忆,并把T-SQL本身的一些新特性再进行一次学习. 首先回顾基础 ...
- Microsoft Naive Bayes 算法——三国人物身份划分
Microsoft朴素贝叶斯是SSAS中最简单的算法,通常用作理解数据基本分组的起点.这类处理的一般特征就是分类.这个算法之所以称为“朴素”,是因为所有属性的重要性是一样的,没有谁比谁更高.贝叶斯之名 ...
- PL/SQL Developer中文版下载以及使用图解(绿色版)
下载地址:http://pan.baidu.com/s/1eQCTmkM 1.运行plsqldev.exe程序: 2.设置Oracle主目录名/OCI库地址,如图: 重新启动程序. 3.配置登陆信息, ...
- Kruskal算法(二)之 C++详解
本章是克鲁斯卡尔算法的C++实现. 目录 1. 最小生成树 2. 克鲁斯卡尔算法介绍 3. 克鲁斯卡尔算法图解 4. 克鲁斯卡尔算法分析 5. 克鲁斯卡尔算法的代码说明 6. 克鲁斯卡尔算法的源码 转 ...
- Android基于mAppWidget实现手绘地图(五)--如何创建地图资源
地图资源可以通过Slicing Tool工具生成,教程如下: 1.打开Eclipse标准版4.3.2,以Java项目形式导入”slicingtool“项目,运行.(必须是eclipse4.3.2及以上 ...
- Eclipse JAVA文件注释乱码
将别人的项目或JAVA文件导入到自己的Eclipse中时,常常会出现JAVA文件的中文注释变成乱码的情况,主要原因就是别人的IDE编码格式和自己的Eclipse编码格式不同. 总结网上的建议和自己的体 ...
- Kettle实现MapReduce之WordCount
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 欢迎转载 抽空用kettle配置了一个Mapreduce的Word count,发现还是很方便快捷的,废话不多说 ...
- 定义通用的可通过lambda表达式树来获取属性信息
我们一般获取某个类型或对象的属性信息均采用以下几种方法: 一.通过类型来获取属性信息 var p= typeof(People).GetProperty("Age");//获取指定 ...