java运行时的内存区域
1.概述
java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。
这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。
java虚拟机所管理的内存包括以下几个运行的数据区域,如图

2.各区域描述
###### 1) 程序计数器 ######
程序计数器是一块较小的内存空间,可以看作当前线程所执行的字节码的行号指示器,字节码解释器工作时,就是通过改变这个计数器的值来选择下一条需要执行的字节码的指令,相当于汇编语言中的cs:ip。
java虚拟机的多线程是通过并发来实现的,所以在任何一个确定的时刻内,一个处理器只能够执行一条线程中的指令,所以为了保证线程的切换不会改变每一个线程执行的位置,每一条线程都有一个独立的程序计数器,即程序计数器是线程私有的。这个内存区域的生命周期就是线程的生命周期。
注意:如果线程正在执行的是一个java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native本地方法,那么这个计数器值为空(undefind)。
###### 2) java虚拟机栈 ######
java虚拟机栈是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是java方法的内存模型:每个方法在执行时会创建一个栈帧,用于存储局部变量表,操作数栈等信息,每一个方法从调用到执行完成的过程就对应着一个栈帧从入栈到出栈的过程。
在虚拟机栈中,局部变量表是一个重要的部分,其存放了编译器可知的各种基本数据类型,对象引用类型,returnAddress类型(指向一条字节码指令的地址),局部标量表中的内存空间在编译期间完成分配,在方法运行期间不会改变局部变量表的大小。
###### 3) 本地方法栈 ######
本地方法栈与虚拟机栈十分相似,区别在于:虚拟机栈为虚拟机执行java方法(字节码)服务,本地方法栈为虚拟机使用到的Native方法服务。
###### 4) java堆 ######
一般而言,java堆(java heap)是虚拟机所管理的内存中最大的一块。java堆是被所有线程所共享的一块内存区域,在虚拟机启动时创建。其唯一的用于存放对象实例,几乎所有的对象实例都在这里分配内存。
java堆也是垃圾收集器管理的主要区域。从内存回收的角度看,java堆可以细分为新生代和老年代,也可在细致的分下去;从内存分配的角度看,线程共享的java堆中可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)。
java堆可以处于物理上不连续的内存空间,只要逻辑上是连续的即可。
###### 5) 方法区 ######
方法区也是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编辑器编译后的代码等数据。·
###### 6) 运行时常量池 ######
运行时常量池是方法区的一部分。class文件中的常量池,用于存放编译期间生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池存放。
###### 7) 直接内存 ######
直接内存并不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域,但是这部分内存也会被频繁使用,可能导致OutOfMemoryError异常出现。
本博文完全参照《深入理解java虚拟机》(周志明),属于笔记整理。
java运行时的内存区域的更多相关文章
- Java运行时环境---内存划分
背景:听说Java运行时环境的内存划分是挺进BAT的必经之路. 内存划分: Java程序内存的划分是交由JVM执行的,而不像C语言那样需要程序员自己买单(C语言需要程序员为每一个new操作去配对del ...
- JVM发展史和Java运行时内存区域
目前三大主流JVM: Sun HotSpot:Sun于1997年收购Longview Technologies公司所得.Sun于2009年被Oracle收购. BEA JRockit:BEA于2002 ...
- 理解JVM之JAVA运行时内存区域
java运行时内存区域划分为方法区,堆区,虚拟机栈区,本地方法栈,程序计数器.其中方法区跟堆区是线程共享的数据区,其他的是线程私有的数据区. 1.程序计数器 程序计数器(PC)是一块较小的内存,他是存 ...
- java运行时内存模式学习
学习java运行时内存模式: 各区介绍: 方法区(线程共享):用于存放被虚拟机加载的类的元数据:静态变量,常量,以及编译和的代码(字节码),也称为永久代(所有该类的实例被回收,或者此类classLoa ...
- Java运行时内存
对于java程序员来说,并不必显示地对内存进行管理,一切都交给java虚拟机去做吧,而且,你也不一定做得比java虚拟机来得专业.好像所有内存管理都交给虚拟机去做就万事大吉了,但是,事实有时并非如此, ...
- Java运行时内存划分
这篇文章可以说是摘抄自周志明的<深入理解Java虚拟机>,但是加上了自己的理解,印象可以更深些. Java虚拟机在执行Java程序的时候会把他所管理的内存划分为若干个不同的数据区域,各个区 ...
- 读书笔记:深入理解java虚拟机(一)虚拟机的运行时的数据区域
最近在看深入了解java虚拟机第一版(周志明著),特此写读书笔记,整理其中重要的东西和自己的理解. ”java与c++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却 ...
- [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义
前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine ,既然是虚拟机, ...
- Java 内存管理、JVM 工作原理与 Java 运行时系统
Java 虚拟机规范中说明:所有的对象实例(all class instances)以及数组都要在堆上分配: the heap is the runtime data area from which ...
随机推荐
- How to setup Laravel Homestead in Windows
How to setup Laravel Homestead in Windows by JBorbón 17. March 2017 PHP 8 Developing with PHP u ...
- HBase 强制删除表
业务系统中有一张表drop不掉了. 可以disable,就是drop不掉. 解决办法: 1.将HDFS上的数据删除或移动 hadoop fs -mv /hbase/<table_name> ...
- cucumber安装步骤
#Start Guide##Environment###1. Install Ruby Verify your installation by running ruby -v in a termina ...
- 安装及运行 RabbitMQ 服务器 (linux) 失败! 安装erlang 失败,无法继续
文档 http://www.rabbitmq.com/install-rpm.html 安装前置条件 Before installing RabbitMQ, you must install Erla ...
- ARKit对安卓的提示 ARKit与Google Tango
我们知道安卓是Google开发的,那么关于AR谷歌有哪些作为呢?就是开发了Google Tango,尽管Tango还未开源,但是用户可以免费使用,可是一般的安卓手机是无法运行的,它对硬件有要求,这对它 ...
- javascript 深度克隆
关键词 :递归 主要分为 数组 .对象.以及基本类型 function clone(Obj) { var buf; if (Obj instanceof Arr ...
- ## 20155336 2016-2017-2《JAVA程序设计》第八周学习总结
20155336 2016-2017-2<JAVA程序设计>第八周学习总结 教材学习内容总结 第14章 NIO与NIO2 NIO简介 NIO使用频道来衔接数据结点,在处理数据时,NIO可以 ...
- [转]细说 ASP.NET Cache 及其高级用法
本文转自:http://www.cnblogs.com/fish-li/archive/2011/12/27/2304063.html 阅读目录 开始 Cache的基本用途 Cache的定义 Cach ...
- Codeforces766A Mahmoud and Longest Uncommon Subsequence 2017-02-21 13:42 46人阅读 评论(0) 收藏
A. Mahmoud and Longest Uncommon Subsequence time limit per test 2 seconds memory limit per test 256 ...
- EBS请求查找运行详细信息
--查找运行请求时间,参数等(可以是某用户的,某个报表) select c.user_name, papf.full_name, b.user_concurrent_progr ...