A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 俞帅明 中级黑马   /  2014-2-24 20:51  /  914 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 俞帅明 于 2014-2-24 22:00 编辑


这个图片大家可以清晰的看出java虚拟机把内存划分成几块。
(说明:本着尊重原著的原则,说明一下该图片原型来自于《深入理解java虚拟机——jvm高级特性与最佳实践》P25)
ps:由于画图的时候比较匆忙,就用本人的tp的小红帽直接画的,可能效果不是很好,大家伙将就看下吧!
下面就说说各部分内存的工作吧!
首先先从线程隔离的数据区来说吧!

程序计数器:

程序计数器是一个一般情况下不会注意的区域。该区域是一块较小的内存空间。它的作用是线程字节码的行号指示器。也就是说下一步虚拟机做什么,从哪里做都是听从程序计数器的安排。由于线程众多,所以控制代码的走向需要一个相对独立的程序计数器,所以该段内存空间是线程间互相隔离的。

java虚拟机栈:

和程序计数器一样,java虚拟机栈也是线程间独立的一块内存空间。java虚拟机栈的生命周期和线程相同。在这个线程创建的时候,同时创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。也就是说每一个方法执行到执行结束的过程,就是对应的栈帧入栈出栈的过程。

本地方法栈:

本地方法栈和java虚拟机栈的作用很类似,区别在于虚拟机栈执行的是java方法,本地方发栈为了使用本地方法。

接下来是两个共享内存区域。
java堆:

对于java虚拟机来说,这是其管理的最大的一块内存区域。几乎所有的对象实例,数组实例都被存放在这里。

方法区:

该块内存区域被用于存储已经被加载的类信息、常量、静态成员等等数据。

运行时常量区:这是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项就是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容是在类加载后存放到方法区的运行时常量池中。


由于我准备不充分,还有新派的工作需要处理,所以这次就初略的描述了一下。可能描述的很概括,不过我也希望这样,让更多爱学习的人自己去探索自己想了解的知识。

还有因为现在的虚拟机种类不是很统一,所以虚拟机对内存管理的上多多少少有一些差异。如果有兴趣给大家推荐java虚拟机规范。相信大家在读过之后就会对java的运行机制更加深刻了。
原文链接:http://bbs.51cto.com/thread-973327-1.html

点评

给你点个赞  发表于 2014-2-24 21:51

2 个回复

倒序浏览
一直只知道有个堆,有个栈,
这个图很全面,感谢分享


貌似我的权限不够,不能发送朋友消息
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马