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. Nova: 虚机的块设备总结 [Nova Instance Block Device]

    和物理机一样,虚拟机包括几个重要的部分:CPU.内存.磁盘设备.网络设备等.本文将简要总结虚机磁盘设备有关知识. 1. Nova boot CLI 中有关虚机块设备的几个参数 nova boot CL ...

  2. Caffe源码解析1:Blob

    转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ 首先看到的是Blob这个类,Blob是作为Caffe中数据流通的 ...

  3. AC日记——刺激 codevs 1958

    时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold     题目描述 Description saffah的一个朋友S酷爱滑雪,并且追求刺激(exitement,由于刺激 ...

  4. Android驱动入门-LED--测试APP编写③

    硬件平台: FriendlyARM Tiny4412 Cortex-A9 操作系统: UBUNTU 14.04 LTS 时间:2016-09-24  10:47:03 在Android Studio中 ...

  5. jsp的九大内置对象和四大作用域

    定义:可以不加声明就在JSP页面脚本(Java程序片和Java表达式)中使用的成员变量? JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应):? 1.request对象(作用域)? 客户 ...

  6. NOIP2003 神经网络

    题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神经网络的研究一直是当今 ...

  7. Lambda表达式详解(转载)

    原文链接:http://www.cnblogs.com/knowledgesea/p/3163725.html lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算 ...

  8. JS中NULL和Undefined的区别

    NULL是表示一个”无“的对象,转换成数值为0:undefined是一个“无”的原始值,转为数值为NaN: 当声明的变量还未被初始化时,变量的默认值为undefined: null用来表示尚未存在的对 ...

  9. SPM12manual,统计部分(8-10)笔记

    fMRI model specifictaion GLM based 包括以下步骤:①明确GLM设计矩阵:②用经典或贝叶斯方法估计GLM参数:③利用对比向量检查结果,生成统计参数图(SPMs)以及后验 ...

  10. 1927: [Sdoi2010]星际竞速

    1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 2040  Solved: 1257[Submit][Stat ...