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运行时内存区域的更多相关文章

  1. JVM笔记-运行时内存区域划分

    1. 概述 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分为若干个不同的数据区域.它们各有用途,有些随着虚拟机进程的启动一直存在(堆.方法区),有些则随着用户线程的启动和结束而建立 ...

  2. JVM发展史和Java运行时内存区域

    目前三大主流JVM: Sun HotSpot:Sun于1997年收购Longview Technologies公司所得.Sun于2009年被Oracle收购. BEA JRockit:BEA于2002 ...

  3. 理解JVM之JAVA运行时内存区域

    java运行时内存区域划分为方法区,堆区,虚拟机栈区,本地方法栈,程序计数器.其中方法区跟堆区是线程共享的数据区,其他的是线程私有的数据区. 1.程序计数器 程序计数器(PC)是一块较小的内存,他是存 ...

  4. JVM 运行时内存结构

      1.JVM内存模型       JVM运行时内存=共享内存区+线程内存区 1).共享内存区       共享内存区=持久带+堆       持久带=方法区+其他       堆=Old Space ...

  5. JVM运行时内存结构

    原文转载自:http://my.oschina.net/sunchp/blog/369707 1.JVM内存模型 JVM运行时内存=共享内存区+线程内存区 1).共享内存区 共享内存区=持久带+堆 持 ...

  6. JVM运行时内存组成分为一些线程私

    JVM运行时内存组成分为一些线程私有的,其他的是线程共享的. 线程私有 程序计数器:当前线程所执行的字节码的行号指示器. Java虚拟机栈:java方法执行的内存模型,每个方法被执行时都会创建一个栈帧 ...

  7. JVM运行时数据区域

    上面已经聊过JVM是什么东东,也谈过了JVM内存的垃圾回收机制.这一篇博客我们来聊聊JVM运行时数据区域. JVM运行时数据区域由5块部分组成,分别是堆,方法区,栈,本地方法栈,以及程序计数器组成. ...

  8. 深入理解Java虚拟机 -- 读书笔记(1):JVM运行时数据区域

    深入理解Java虚拟机 -- 读书笔记:JVM运行时数据区域 本文转载:http://blog.csdn.net/jubincn/article/details/8607790 本系列为<深入理 ...

  9. [转]JVM运行时内存结构

    [转]http://www.cnblogs.com/dolphin0520/p/3783345.html 目录[-] 1.为什么会有年轻代 2.年轻代中的GC 3.一个对象的这一辈子 4.有关年轻代的 ...

随机推荐

  1. C#中 == 与 Equals的简单理解

    using System; using System.Collections.Generic; using System.Collections; using System.IO; using Sys ...

  2. 雷林鹏分享:C# 类型转换

    C# 类型转换 类型转换从根本上说是类型铸造,或者说是把数据从一种类型转换为另一种类型.在 C# 中,类型铸造有两种形式: 隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换.例如,从小的 ...

  3. English trip V1 - B 21. On a busy day 忙碌的一天 Teacher:Taylor Key: at on in

    In this lesson you will learn to tell the time.  说时间 课上内容(Lesson) at       time; at 7:30; at midday; ...

  4. Python Web简单加法器的实现--Python

    坚持写博客来记录学习过程,哪怕学习的东西多么简单!下面是python中cgi相关知识. Template.py:(模板引擎文件) #模板引擎def start_response(resp=" ...

  5. org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.1428942566812653608

    一.异常信息 org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet reque ...

  6. codeforces 848B Rooter's Song 思维题

    http://codeforces.com/problemset/problem/848/B 给定一个二维坐标系,点从横轴或纵轴垂直于发射的坐标轴射入(0,0)-(w,h)的矩形空间.给出点发射的坐标 ...

  7. IntelliJ IDEA 安装 Scala 插件

    本页面中对在 IntelliJ 中安装 Scala 插件的步骤和方法进行了描述. 需要在 IntelliJ  安装 Scala 插件,你首先需要在你的计算机中安装 IntelliJ .IntelliJ ...

  8. Spring Batch JSON 支持

    Spring Batch 4.1 开始能够支持 JSON 格式了.这个发布介绍了一个新的数据读(item reader)能够读取一个 JSON 资源,这个资源按照下面的格式: [   {     &q ...

  9. use . adb . get wifi

    adb shell 连接手机获取root权限,如果返回的字符串中不包含root字样,再输入su命令回车 继续输入cat /data/misc/wifi/*.conf命令,将会把文件打印出来 ssid表 ...

  10. Permutations CodeForces - 736D (矩阵逆)

    对于删除每个对(x,y), 可以发现他对答案的贡献为代数余子式$A_{xy}$ 复习了一下线代后发现代数余子式可以通过伴随矩阵求出, 即$A_{xy}=A^*[y][x]$, 伴随矩阵$A^*=|A| ...