《深入理解JAVA虚拟机》学习笔记(一)JAVA内存划分
来源:互联网 发布:linux 拷贝文件 编辑:程序博客网 时间:2024/06/03 14:10
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。根据《 Java虚拟机规范(Java SE 7版)》 的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域
1、程序计数器
线程私有,当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,功能相当于机器的pc取址寄存器
2、JAVA虚拟机栈
线程私有,虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、 操作数栈、 动态链接、 方法出口等信息。 每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
局部变量表存放了编译期可知的各种基本数据类型、 对象引用和returnAddress类型(指向了一条字节码指令的地址)。
3、本地方法栈
同虚拟机栈,只不过本地方法栈位虚拟机使用到的native方法服务。
4、JAVA堆
线程共享,所有的对象实例以及数组都要在堆上分配
5、方法区
线程共享,用于存储已被虚拟机加载的类信息、 常量、 静态变量、 即时编译器编译后的代码等数据
6、运行时常量池
运行时常量池(Runtime Constant Pool)是方法区的一部分。 Class文件中除了有类的版本、 字段、 方法、 接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。
7、直接内存
直接内存并不是虚拟机运行时数据区的一部分。
以下是拓展部分
我们以下面的代码为例讲解虚拟机是如何分配内存的
public class TestClass{ private int m; private static n = 2; public TestClass(int a){ m = a; } public static void main(String[] args){ TestClass test = new TestClass(1); }}
经过javac编译后会生成一个TestClass.class,运行JVM虚拟机将TestClass.class加载后...
1、首先,TestClass类被虚拟机加载后在方法区生成TestClass运行时数据结构,这个数据结构包括TestClass类的字段、方法、类名、父类名、接口名、属性等。以上述代码为例,TestClass构造器、main函数的描述符和代码、字段n和m的简单名和描述符等信息都会被加载到方法区中。
2、TestClass类初始化(包括验证、准备等阶段),类字段n被存储在方法区中并被初始化为2。
3、执行类方法main(String[] args),在JAVA虚拟机栈中生成一个方法帧。
4、执行TestClass test = new TestClass(1),在JAVA堆中生成一个TestClass对象,对象数据m被存储在JAVA堆中并被初始化为1。方法帧中生成一个类引用test指向JAVA堆中的TestClass对象。
附上一篇JAVA内存溢出实战博文:http://blog.csdn.net/chaofanwei/article/details/19483101
- 《深入理解Java虚拟机》学习笔记(一)(Java内存区域的划分)
- 《深入理解JAVA虚拟机》学习笔记(一)JAVA内存划分
- 深入理解java虚拟机(一)虚拟机内存划分
- [转]深入理解java虚拟机(一)虚拟机内存划分
- 《深入理解Java虚拟机》学习笔记一:Java内存区域
- 深入理解java虚拟机 虚拟机内存划分
- Java虚拟机的内存区域——《深入理解Java虚拟机》学习笔记(一)
- 深入理解java虚拟机(一):java内存区域(内存结构划分)
- 深入理解java虚拟机(一):java内存区域(内存结构划分)
- 深入理解java虚拟机(一):java内存区域(内存结构划分)
- 深入理解java虚拟机(一):java内存区域(内存结构划分)
- 《深入理解java虚拟机》学习笔记一
- 深入理解java虚拟机学习笔记(一)
- 深入理解java虚拟机学习笔记(一、走近java)
- 深入理解JAVA虚拟机---JAVA虚拟机的内存划分
- 《深入理解Java虚拟机》学习笔记(一)
- 深入理解java虚拟机学习笔记(一)
- 深入理解Java虚拟机笔记(一)
- Java关键字final、static使用总结
- 外部配置-命令行参数配置
- POJ 1657-Distance on Chessboard(BFS-多种方向不限步数)
- eclipse maven cannot change version of project facet Dynamic web module to 3.1
- 博弈论+dp——洛谷P2964 [USACO09NOV]硬币的游戏A Coin Game
- 《深入理解JAVA虚拟机》学习笔记(一)JAVA内存划分
- 配置文件的优先级
- lucene5.1 fst源码分析(BooleanQuery分析)
- 欢迎使用CSDN-markdown编辑器
- Fragment的生命状态和周期详解
- 指针和引用区别
- Spring4源码分析(ClassPathXmlApplicationContext)
- 设计模式之---状态模式
- 陈纪修老师《数学分析》 第03章:函数极限与连续函数 笔记