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 ...
随机推荐
- Mysql索引会失效的几种情况分析(转)
出处:http://www.jb51.net/article/50649.htm 索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中有or,即使其中有条件带索引也不会使用(这 ...
- asp.net 4高级程序设计( 第4版)文摘
第一部分 核心概念 第1章 asp.net 简介 第2章 visual studio 第3章 Web窗体 3.2 web窗体处理阶段 页面框架初始化(page.init),用户代码初始化(page.l ...
- 在Linux下使用logrotate管理日志(转)
原文地址:http://www.tuicool.com/articles/ieAnMjN logrotate是日志循环管理工具,可以分割日志文件,删除旧的日志文件,创建新的日志文件,循环管理日志从而节 ...
- spark yarn 集群提交kafka代码
配置好hadoop的环境,具体根据http://blog.csdn.net/u010638969/article/details/51283216博客所写的进行配置. 运行start-dfs.sh启动 ...
- Git 客户端基本配置
Welcome to Git (version -preview20140611) Run 'git help git' to display the help index. Run 'git hel ...
- Hdu1547 Bubble Shooter 2017-01-20 18:38 44人阅读 评论(0) 收藏
Bubble Shooter Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Tota ...
- session概要
一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况 下).因此,在需要保存用户数据时,服 ...
- CentOS 7 IPv6关闭
你可以用两个方法做到这个.方法 1编辑文件/etc/sysctl.conf,vi /etc/sysctl.conf添加下面的行:net.ipv6.conf.all.disable_ipv6 =1net ...
- postgres数据库参数配置说明介绍
访问 1. listen_addresses 监听访问地址 2. port 监听端口 3. max_connections 最大连接数 4. 性能 1. shared_buffers PostgreS ...
- 电表读数归零回滚SQL处理算法
在采集电表数据的时候,可以发现有些电表设备读数会发生回滚.这时候,如果单纯的累加计算用电量,就会出现负值.当然,这也许和电表的质量有关系. “RTQty”(当前读到的读数).“LastQty”(上次读 ...