JVM运行时内存区域
JVM运行java程序时会将内存划分为若干个不同的数据区域:
(1)程序计数器:
1、占用内存空间不大。
2、程序计数器相当于JVM所执行的字节码(jvm指令)的“行号指示器”,通过程序计数器的“值”找到吓一跳需要执行的字节码指令。
3、每一个线程所执行命令的顺序都是独立的,所以每个线程都有一个程序计数器。
4、此内存区域是唯一一个没有规定“OutOfMemoryError”的区域。
(2)虚拟机栈:
1、虚拟机栈是一个“栈结构”的内存区域(先进后出)。里面存的是一个个“栈帧”。
每一个方法在执行时都会创建一个栈帧。当方法在初始执行时其对应的栈帧进入虚拟机栈。当方法结束时,其栈帧出栈。
如:fun A(){ fun B()}
public void A(){
B();
}
其栈帧的执行顺序就是:A栈帧先入栈,B栈帧再入栈,等方法B执行完后,B栈帧再出栈,A栈帧再出栈。其整体过程也符合栈结构的“先进后出”。
2、每一个栈帧里存储了“局部变量表”,该表中存放了其对应方法在运行时所用到的“基本数据类型”、“对象引用”、“returnAdress”。
(long和double类型占用两个局部变量空间,其余类型只占用一个空间)。
3、局部变量表中的东西在“编译时”就能确定有哪些,所以在编译时,局部变量表所需的内存空间就能分配完成且方法运行期间不会改变。
4、该区域有两种异常:当请求的“栈深度”大于JVM虚拟机所允许的深度时,抛出“StackOverFlowError”。当内存不够时,抛出“OutOfMemmory”。
5、是线程私有的,生命周期与线程相同。
(3)本地方法栈:
1、与虚拟机栈唯一的区别是:
虚拟机栈是为“JVM执行java方法”而服务。
本地方法栈是为“JVM执行Native方法”而服务。
(3)java堆:
1、是JVM所管理的最大的一块内存。
2、所有线程共享。
3、用来存放“对象实例”(数组也是)。
4、并不是所有的对象都必须分配在堆上(逃逸分析、标量替换)。
5、java堆是JVM垃圾回收器的主要管理区域。
6、堆内存的大小可以是固定的,也可以是可扩展的。
7、当内存不够时,并且也无法再扩展时,抛出“OutOfMemmory”。
(4)方法区:
1、所有线程共享。
2、内存不够时抛出“OutOfMemmoryError”。
3、存放的是“类的信息”,包括类中的:
类的全路径名、类的直接超类的全限定名、类的修饰符、类的“常量池”、类的“域信息”、类的“方法信息”、类的final常量,类的“所有static静态变量”。
常量池:
每个类都有自己的常量池。常量池是“同一个类所用常量的集合”。如:
Integer a = 1;
Integer b = 1;
//a和b指向Integer类的常量池中的同一个内存空间(因为他们的常量都是1)。 //同理
String s1 = "hello";
String s2 = "hello";
System.out.print(s1==s2);
//输出的是“true”,因为s1和s2指向String类的常量池中同一个内存空间。 //以下不是常量池存储
String s3 = new String("hello");
String s4 = new String("hello");
System.out.print(s1==s2);
//输出的是“false”,因为s3和s4是对象实例,存与堆中不同的空间。
域信息:
jvm必须在方法区中保存类型的所有域的相关信息以及域的声明顺序, 域的相关信息包括: 域名、域类型、域修饰符。
方法信息:
每一个类中都含有各种方法,所以方法区中会存储这些类中方法的相关信息,包括:
方法名、方法的返回类型、方法参数和类型、方法的修饰符。
类中的static静态变量:
static变量实际上属于类(并不属于某一个对象),所以自然这些static变量也属于“类的相关信息”。
JVM运行时内存区域的更多相关文章
- JVM笔记-运行时内存区域划分
1. 概述 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分为若干个不同的数据区域.它们各有用途,有些随着虚拟机进程的启动一直存在(堆.方法区),有些则随着用户线程的启动和结束而建立 ...
- JVM发展史和Java运行时内存区域
目前三大主流JVM: Sun HotSpot:Sun于1997年收购Longview Technologies公司所得.Sun于2009年被Oracle收购. BEA JRockit:BEA于2002 ...
- 理解JVM之JAVA运行时内存区域
java运行时内存区域划分为方法区,堆区,虚拟机栈区,本地方法栈,程序计数器.其中方法区跟堆区是线程共享的数据区,其他的是线程私有的数据区. 1.程序计数器 程序计数器(PC)是一块较小的内存,他是存 ...
- JVM 运行时内存结构
1.JVM内存模型 JVM运行时内存=共享内存区+线程内存区 1).共享内存区 共享内存区=持久带+堆 持久带=方法区+其他 堆=Old Space ...
- JVM运行时内存结构
原文转载自:http://my.oschina.net/sunchp/blog/369707 1.JVM内存模型 JVM运行时内存=共享内存区+线程内存区 1).共享内存区 共享内存区=持久带+堆 持 ...
- JVM运行时内存组成分为一些线程私
JVM运行时内存组成分为一些线程私有的,其他的是线程共享的. 线程私有 程序计数器:当前线程所执行的字节码的行号指示器. Java虚拟机栈:java方法执行的内存模型,每个方法被执行时都会创建一个栈帧 ...
- JVM运行时数据区域
上面已经聊过JVM是什么东东,也谈过了JVM内存的垃圾回收机制.这一篇博客我们来聊聊JVM运行时数据区域. JVM运行时数据区域由5块部分组成,分别是堆,方法区,栈,本地方法栈,以及程序计数器组成. ...
- 深入理解Java虚拟机 -- 读书笔记(1):JVM运行时数据区域
深入理解Java虚拟机 -- 读书笔记:JVM运行时数据区域 本文转载:http://blog.csdn.net/jubincn/article/details/8607790 本系列为<深入理 ...
- [转]JVM运行时内存结构
[转]http://www.cnblogs.com/dolphin0520/p/3783345.html 目录[-] 1.为什么会有年轻代 2.年轻代中的GC 3.一个对象的这一辈子 4.有关年轻代的 ...
随机推荐
- 优雅地记录Python程序日志2:模块组件化日志记录器
本文摘自:https://zhuanlan.zhihu.com/p/32043593 本篇将会涉及: logging的各个模块化组件 构建一个组件化的日志器 logging的模块组件化 在上一篇文章中 ...
- sublime Text如何取消两栏窗口?
在菜单栏里的 View->LayOut->Single,也可以用快捷键 Alt+Shift+1.如图所示.(亲测可用) &lt;img src="https:// ...
- composer修改中文镜像
composer config -g repo.packagist composer https://packagist.phpcomposer.com
- 数据结构(C语言版)-第6章 图
6.1 图的定义和基本术语 图:Graph=(V,E) V:顶点(数据元素)的有穷非空集合: E:边的有穷集合. 无向图:每条边都是无方向的 有向图:每条边都是有方向的 完全图:任意两个点都有一条 ...
- JSON格式简介
一.JSON:JavaScript Object Notation的简写,是一种轻量级数据交换格式. 二.数据类型:标量.序列(数组).映射(key-value) 三.JSON的四个原则 1 .并列数 ...
- Entity Framework 学习
Entity Framework 学习初级篇1--EF基本概况 Entity Framework 学习初级篇2--ObjectContext.ObjectQuery.ObjectStateEntry. ...
- BGP - 2,BGP报文和BGP状态
1,BGP报文 Open:建邻居,交换version.AS号.holdtime.BGP identifier(即RouterID).可选参数长度.可选参数. Keepalive:保 ...
- (Gorails) activeStore模块,把一堆属性放在一个hash对象内。gem 'activerecord-typedstore'增强了store模块,更好用了
https://api.rubyonrails.org/classes/ActiveRecord/Store.html https://gorails.com/episodes/preferences ...
- Known Notation ZOJ - 3829 (后缀表达式,贪心)
大意:给定后缀表达式, 每次操作可以添加一个字符, 可以交换两个字符的位置, 相邻数字可以看做一个整体也可以分开看, 求合法所需最少操作数. 数字个数一定为星号个数+1, 添加星号一定不会更优. 先判 ...
- Excel文件的读写
import xlsxwriter,xlrd import sys,os.path fname = 'zm6.xlsx' if not os.path.isfile(fname): print ('文 ...