疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java的内存结构


 

先看看下面这张图
这个图片大家可以清晰的看出java虚拟机把内存划分成几块。
(说明:本着尊重原著的原则,说明一下该图片原型来自于《深入理解java虚拟机——jvm高级特性与最佳实践》P25)
ps:由于画图的时候比较匆忙,就用本人的tp的小红帽直接画的,可能效果不是很好,大家伙将就看下吧!
下面就说说各部分内存的工作吧!
首先先从线程隔离的数据区来说吧!
程序计数器:
    程序计数器是一个一般情况下不会注意的区域。该区域是一块较小的内存空间。它的作用是线程字节码的行号指示器。也就是说下一步虚拟机做什么,从哪里做都是听从程序计数器的安排。由于线程众多,所以控制代码的走向需要一个相对独立的程序计数器,所以该段内存空间是线程间互相隔离的。
java虚拟机栈:
    和程序计数器一样,java虚拟机栈也是线程间独立的一块内存空间。java虚拟机栈的生命周期和线程相同。在这个线程创建的时候,同时创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。也就是说每一个方法执行到执行结束的过程,就是对应的栈帧入栈出栈的过程。
本地方法栈:
    本地方法栈和java虚拟机栈的作用很类似,区别在于虚拟机栈执行的是java方法,本地方发栈为了使用本地方法。
接下来是两个共享内存区域。
java堆:
    对于java虚拟机来说,这是其管理的最大的一块内存区域。几乎所有的对象实例,数组实例都被存放在这里。
方法区:
    该块内存区域被用于存储已经被加载的类信息、常量、静态成员等等数据。
    运行时常量区:这是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项就是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容是在类加载后存放到方法区的运行时常量池中。
    由于我准备不充分,还有新派的工作需要处理,所以这次就初略的描述了一下。可能描述的很概括,不过我也希望这样,让更多爱学习的人自己去探索自己想了解的知识。
    还有因为现在的虚拟机种类不是很统一,所以虚拟机对内存管理的上多多少少有一些差异。如果有兴趣给大家推荐java虚拟机规范。相信大家在读过之后就会对java的运行机制更加深刻了。