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. CF 672C Recycling Bottles[最优次优 贪心]

    C. Recycling Bottles time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  2. Unity3D FPS帧数修改

    修改Unity的FPS FPS是游戏运行的帧数,本文讲解如何修改Unity引擎的FPS. 步骤 1.在 Edit/Project Settings/Quality  质量设置里把帧数设定关闭,关闭之后 ...

  3. voxel 与 pixel

    中文名称:体素,即顾名思义是体积的像素.用来在三维空间中表示一个显示基本点的单位.类似于二维平面下的pixel(像素). voxel是三维空间中定义一个点的图象信息的单位.在平面中定义一个点要两个坐标 ...

  4. swift UIImage加载远程图片和圆角矩形

    UIImage这个对象是swift中的图像类,可以使用UIImageView加载显示到View上. 以下是UIImage的构造函数: init(named name: String!) -> U ...

  5. TinyFrame升级之六:全局日志的设计及实现

    日志记录显然是框架设计中不可或缺的元素,在本框架中,我们将使用log4net作为日志记录的主体.下面来具体说明如何让框架继承log4net,并通过Autofac进行IOC注入. 首先,定义好我们的Lo ...

  6. Oracle PL/SQL 入门

    PL/SQL 全称:Procedure Language/SQL.产生背景自己去百度. 模板: Declare ---变量定义 num ; name ) := 'damon'; idesc cnt_i ...

  7. 如何在 Apache 中为你的网站设置404页面

    一个好的网站,拥有一个好的 404页面 是标配. 为何要有 404页面?如何设置一个 404页面? why 404 pages? 在本地,比如我打开 localhost/fuck.htm(该文件不存在 ...

  8. 一步一步学习ABP项目系列文章目录

    1.概述 基于DDD的.NET开发框架 - ABP初探 基于DDD的.NET开发框架 - ABP分层设计 基于DDD的.NET开发框架 - ABP模块设计 基于DDD的.NET开发框架 - ABP启动 ...

  9. parsing XML document from class path resource

    遇到问题:parsing XML document from class path resource [spring/resources] 解决方法:项目properties— source—remo ...

  10. 前端Mvvm QC 上传了测试版

    QC是一个前端MVVM框架,适合用来构建复杂的业务逻辑 项目地址:https://github.com/time-go/qc 技术支持QQ群:330603020 QC特点: 1.良好的浏览器兼容性(兼 ...