Java虚拟机在执行Java程序过程中会把它所管理的内存区域划分为若干个不同的数据区域。

  Java虚拟机所管理的内存包括以下几个运行时区域:

  

1、程序计数器(Program Couter Register)  

  程序计数器是一块较小的内存空间,作用是当前线程所执行的字节码的行号指示器。字节码指示器就是通过改变程序计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依靠程序计数器来完成。

2、Java虚拟机栈(Java Virtual Machine Stacks)

  VM Stack 生命周期和线程相同。

  每个方法没执行的同时创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息。每个方法被调用直至完成的过程对应着一个栈帧在VM  Stack的入栈和出栈的过程。

  VM Stacks也可以说是局部变量表。局部变量表存放了预编译期可知的各种数据类型(boolean、byte、char、short、int、float、long、double)、对象引用和returnAddress(指向了一个字节码指令的地址)。

3、本地方法栈(Native Method Stack)

  本地方法栈(Native Method Stack)与虚拟机栈(VM Stack)所发挥的作用非常相似。不同在于:

虚拟机栈(VM Stack)为虚拟机执行Java方法(也就是字节码)服务;

本地方法栈(Native Method Stack)为虚拟机用到的Native方法服务。

  注:Native Method就是java调用非java代码的接口,该方法的实现由非java代码实现,比如C、C++

4、Java堆

Java堆是被所有线程共享的一块区域,在虚拟机启动时创建。此内存区域唯一的目的就是存放对象实例,几乎所有的对象实例都是在这里分配内存的。

Java堆是垃圾回收器管理的主要区域,因此很多时候被称作“GC堆”。

Java堆可以处于物理上不连续的内存空间。在实现时既可以实现成固定大小的,也可以是可扩展的,不过当前主流的虚拟机都是按照可扩展来实现的(通过-Xmx和-Xms控制)。如果堆中没有完成实例分配,并且堆也没办法再扩展的时候就会抛出OutOfMemoryError异常。

5、方法区(Method Area)

方法区(Method Area)和Java堆一样,是各个线程共享的一块区域,用于存储已被虚拟机加载的的类信息、常量、静态变量、即时编译器编译后的代码等数据。

方法区和Java堆一样在内存区上不需要连续的内存,可以选择固定大小或者可扩展外,还可以选择不实现垃圾回收。相对而言垃圾回收在这个区域比较少见。这个区域内存回收的目标是针对常量池的回收和对类型的卸载。

运行时常量池(Runtime Constant Pool):是方法区的一部分。calss文件中除了类的版本信息、字段、方法、接口等描述信息外,还有一项信息就是常量池(用于存放编译器生成的各种字面量和符号引用),这部分内容将在类加载后存放在方法区的运行时常量区。

注:运行期间可以将新的常量放入池中,这种特性被开发人员用的多的是String类的intern()方法。

JVM执行Java程序时内存的划分的更多相关文章

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

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

  2. Java运行时内存划分

    这篇文章可以说是摘抄自周志明的<深入理解Java虚拟机>,但是加上了自己的理解,印象可以更深些. Java虚拟机在执行Java程序的时候会把他所管理的内存划分为若干个不同的数据区域,各个区 ...

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

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

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

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

  5. JVM之Java运行时数据区(线程隔离区)

    来源 JVM会在会在执行Java程序过程中把所管理的内存划分为若干区域,主要包括程序计数器(Program Counter Register),虚拟机栈(VM Stack),本地方法栈(Native ...

  6. java运行时内存模式学习

    学习java运行时内存模式: 各区介绍: 方法区(线程共享):用于存放被虚拟机加载的类的元数据:静态变量,常量,以及编译和的代码(字节码),也称为永久代(所有该类的实例被回收,或者此类classLoa ...

  7. java程序的内存分配

    java程序的内存分配 JAVA 文件编译执行与虚拟机(JVM)介绍 Java 虚拟机(JVM)是可运行Java代码的假想计算机.只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的 ...

  8. java程序的内存分配(一)

      首 页 阅览室 馆友 我的图书馆 帐号 java程序的内存分配(一) 收藏  JAVA 文件编译执行与虚拟机(JVM)介绍  Java 虚拟机(JVM)是可运行Java代码的假想计算机.只要根据J ...

  9. Java程序在内存中运行详解

    目录 Java程序在内存中运行详解 一.JVM的内存分布 二.程序执行的过程 三.只有一个对象时的内存图 四.两个对象使用同一个方法的内存图 五.两个引用指向同一个对象的内存图 六.使用对象类型作为方 ...

随机推荐

  1. Hacker communities collection

    Copy from E安全 Hack Forums: Hack Forums是目前最为理想的黑客技术学习根据地.该论坛不仅在设计上面向黑客群体,同时也适用于开发人员.博主.游戏开发者.程序员.图形设计 ...

  2. 2014 UESTC暑前集训动态规划专题解题报告

    A.爱管闲事 http://www.cnblogs.com/whatbeg/p/3762733.html B.轻音乐同好会 C.温泉旅馆 http://www.cnblogs.com/whatbeg/ ...

  3. 在ubunt14.04(linux)下利用cmake编译运行opencv程序

    今天在电脑上安装好了opencv环境,迫不及待的想写个程序来测试一下.但是在windows下我们用vs等集成开发工具.可是在linux下我们应该怎么办呢? 这里我们用了opencv推荐的cmake来编 ...

  4. [No000048]程序员的成长过程中,有哪些阶段?

    有人在 Quora 提问,并补充: 有木有朋友能根据你们自身经历,清晰地划分各个阶段?比如:学习第一门编程语言.第一份工作.职业决策.理解 IT 公司的目标,等等. Quincy Larson 的回复 ...

  5. [No000038]操作系统Operating Systems -CPU

    管理CPU ,先要使用CPU… CPU 的工作原理 CPU上电以后发生了什么? 自动的取指 — 执行 CPU 怎么工作? CPU怎么管理? 管理CPU 的最直观方法 设好PC 初值就完事! 看看这样做 ...

  6. UIButton(改变Title和image位置)

    UIButton *btn = [[UIButton alloc] init]; [btn setFrame:frame]; [btn setTitleColor:titleColor forStat ...

  7. 常见HTTP状态基本解释

    本文摘自互联网,但是忘记了具体网址,请见谅 在网站建设的实际应用中,容易出现很多小小的失误,就像mysql当初优化不到位,影响整体网站的浏览效果一样,其实,网站的常规http状态码的表现也是一样,Go ...

  8. CSS3 动画效果带来的bug

    css3 动画效果比如transition:all 2s linear;这种用来计算及时的物体坐标的话会带来一定的问题 比如把一个DIV从A点移动到B点.JS为DIV.style.left=B; 但是 ...

  9. SQL Server对Xml字段的操作

    T-Sql操作Xml数据 一.前言 SQL Server 2005 引入了一种称为 XML 的本机数据类型.用户可以创建这样的表,它在关系列之外还有一个或多个 XML 类型的列:此外,还允许带有变量和 ...

  10. FineUI v3.3.2发布!目前最稳定版本,五年陈酿!

    关于FineUI基于 ExtJS 的专业 ASP.NET 控件库. FineUI的使命创建 No JavaScript,No CSS,No UpdatePanel,No ViewState,No We ...