Java内存区域划分
2016-07-06 17:41
232 查看
jvm内存区域划分为这几个部分:程序计数器,Java栈,本地方法栈,方法区,堆。
每部分存储的数据如下:
1.程序计数器(指示执行指令)
保存程序当前执行的指令的地址,当CPU需要执行指令时,从程序计数器中得到当前需要执行的指令所在的存储单元的地址,然后根据得到的地址获取到指令。
每个线程都有自己独立的程序计数器。
由于程序计数器中存储的数据所占空间的大小不会碎程序的执行发生改变,因此,对于程序计数器是不会发生内存泄漏现象(OutOfMemory)
2.Java栈
Java栈是Java方法执行的内存模型,里面存放的是一个个栈帧,每个栈帧对应一个被调用的方法,在栈帧中包括局部变量,操作数栈,指向当前方法所属的类的运行时常量池的引用,方法返回地址,和一些额外的附加信息
当线程执行一个方法的时候,就会创建一个栈帧,并将创建的栈帧压栈。当方法执行完毕之后,便会将栈帧出栈。
栈帧内存储元素介绍:
局部变量:存储方法中的局部变量,基本数据类型直接存储值,引用类型变量存储指向对象的引用
操作数栈:
指向运行时常量池的引用:在方法执行的过程中有可能需要用到类中的常量,所以必须要有一个引用 指向运行时常量
3.本地方法栈
与Java栈相似,区分在于Java栈是为执行Java方法服务,而本地方法栈则是为执行本地方法服务的。
4.堆
Java中的堆是用来存储对象本身,堆是所有线程共享的,在JVM中只有一个堆
5.方法区
方法区也是被线程共享的区域,里面主要存储了每个类的信息,包括类的名称,方法信息,字段信息,静态变量,常量以及编译器编译后的代码等
在方法区中还包括运行时常量池,在类和接口被加载到JVM后,对应的运行时常量池就被创建出来。
每部分存储的数据如下:
1.程序计数器(指示执行指令)
保存程序当前执行的指令的地址,当CPU需要执行指令时,从程序计数器中得到当前需要执行的指令所在的存储单元的地址,然后根据得到的地址获取到指令。
每个线程都有自己独立的程序计数器。
由于程序计数器中存储的数据所占空间的大小不会碎程序的执行发生改变,因此,对于程序计数器是不会发生内存泄漏现象(OutOfMemory)
2.Java栈
Java栈是Java方法执行的内存模型,里面存放的是一个个栈帧,每个栈帧对应一个被调用的方法,在栈帧中包括局部变量,操作数栈,指向当前方法所属的类的运行时常量池的引用,方法返回地址,和一些额外的附加信息
当线程执行一个方法的时候,就会创建一个栈帧,并将创建的栈帧压栈。当方法执行完毕之后,便会将栈帧出栈。
栈帧内存储元素介绍:
局部变量:存储方法中的局部变量,基本数据类型直接存储值,引用类型变量存储指向对象的引用
操作数栈:
指向运行时常量池的引用:在方法执行的过程中有可能需要用到类中的常量,所以必须要有一个引用 指向运行时常量
3.本地方法栈
与Java栈相似,区分在于Java栈是为执行Java方法服务,而本地方法栈则是为执行本地方法服务的。
4.堆
Java中的堆是用来存储对象本身,堆是所有线程共享的,在JVM中只有一个堆
5.方法区
方法区也是被线程共享的区域,里面主要存储了每个类的信息,包括类的名称,方法信息,字段信息,静态变量,常量以及编译器编译后的代码等
在方法区中还包括运行时常量池,在类和接口被加载到JVM后,对应的运行时常量池就被创建出来。
相关文章推荐
- Java 6 JVM参数选项大全(中文版)
- IE7降低内存和降低CPU的几个技巧
- 如何高效的使用内存
- DOS下内存的配置
- XP/win2003下发现1G的内存比512M还慢的解决方法
- PowerShell实现动态获取当前脚本运行时消耗的内存
- C#实现把dgv里的数据完整的复制到一张内存表的方法
- SQL语句实现查询SQL Server内存使用状况
- C语言内存对齐实例详解
- 深入学习C语言中memset()函数的用法
- 全局变量与局部变量在内存中的区别详细解析
- VB读取线程、句柄及写入内存的API代码实例
- php运行提示:Fatal error Allowed memory size内存不足的解决方法
- IE浏览器IFrame对象内存不释放问题解决方法
- C#之CLR内存深入分析
- JavaScript 变量、作用域及内存
- JavaScript避免内存泄露及内存管理技巧
- 深入解析JVM对dll文件和对类的装载过程
- J2ME编程中的几个重要概念介绍
- c++实现逐行读取配置文件写入内存的示例