Java内存解析 栈 堆 常量池

来源:互联网 发布:淘宝天猫旗舰店申请 编辑:程序博客网 时间:2024/05/21 13:53

发现本文中任何不当之处,请评论指出,或QQ联系:2651408273
KNOW  WHY , KNOW  DO  !!       共同学习,一起进步


学习Java已经两年了,对内存的理解一直都局限在栈、堆上,利用假期的时候看了《深入理解Java虚拟机》(周志明著)一书,这里虽然谈不上深入,可也算有了一个明了的流程概念。也许以后还会回头深入Java虚拟机,这里先把学到的进行一个记录吧。希望对初学者有一个帮助。

如图:


解释:

1,栈:我们常说的栈是指图中的虚拟机栈。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。这样来讲,我们常说的栈更确切的表述应该是虚拟机栈中栈帧存放的局部变量表。

2,堆:Java虚拟机规范中的描述是:所以的对象实例以及数组都要在堆上分配。

3,方法区:方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java堆区分开。要注意的是常说的常量池技术是方法区的一部分。

总结:

1,事实上对于非资深、大多数程序员来说,我们要关注的就是栈、堆、常量池。

2,具体存储这里不做讲解。

3,附中是对余下的两个:本地方法栈和程序计数器的解释。

附:

1,本地方法栈:与虚拟机栈所发挥的作用是非常相似的,其区别是虚拟机栈为虚拟机执行Java方法(字节码)服务,而本地方法栈为虚拟机使用到的Native方法服务。

2,程序计数器:不作解释。可以望文生义。


注:此文是第一版,可能有很多不当。
再次希望读者能指出,QQ交流,带我改进。

无论是知识上,还是表达上。

QQ:2651408273

0 0
原创粉丝点击