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. word2010怎么把白色方框变成黑色方框?

    word2010怎么把白色方框变成黑色方框? 打开Word 2010文档,选中第四个白色方框.  切换到“插入”功能区,在符号选项组单击“符号”按钮,出来的窗口单击“其他符号”.  在“符号”选项卡单 ...

  2. 学了vue和webpack的笔记

    首先把package.json贴出来,这里很多插件存在版本区别,因此要特别注意版本,不是所有的安装最新的都行 { "name": "life_manager", ...

  3. Java创建WebService

    从java 6之后就提供了简单快速的创建WebService的方法,这里将这种简单的方法记录下来方便以后回看.第一步:首先创建一个java Project,然后创建一个类HelloWorldImpl如 ...

  4. python中的静态方法、类方法、属性方法(福利:关于几种方法更好的解释)

    该部分的三个属性都是高级方法,平时用的地方不是很多 一.静态方法 静态方法的使用不是很多,可以理解的就看一下,用的地方不是很多 class Dog(object): def __init__(self ...

  5. HTML标签使用

    `<!-- 什么是HTML 超文本标记语言 由标签(属性和实体组成)和内容组成 --> <!-- 定义文档类型 --> <!DOCTYPE html> <!- ...

  6. 雷林鹏分享:jQuery EasyUI 数据网格 - 创建子网格

    jQuery EasyUI 数据网格 - 创建子网格 使用数据网格(datagrid)的详细视图,用户可以展开一行来显示附加的详细信息. 任何内容都可以加载作为行详细,子网格也可以动态加载. 本教程将 ...

  7. spring ----> aop的两种实现方式

    实现1:基于xml package com.rr.spring3.interf; //接口 public interface SayHello { public void sayHello(); } ...

  8. LeetCode--235--二叉树的最近公共祖先

    问题描述: 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的 ...

  9. https请求排错过程

    1. 看请求有没有到nginx 此时需要查看nginx的日志.一般每一个项目都会配置一个nginx站点,而一个站点都会又一个nginx配置文件,这个文件位于哪里呢?不出意外应该在:下面,如果找不到的话 ...

  10. VitrualBox、vagrant、homestead的关系

    VitrualBox 是一款非常强大的免费虚拟机软件,使用者可以在 VitrualBox 上安装并运行 Linux.Windows.Mac OS X 等操作系统,类似的软件还有 VMware Vagr ...