`
javawebsoa
  • 浏览: 424545 次
社区版块
存档分类
最新评论

java内存分配机制

    博客分类:
  • java
阅读更多

       通过这几天对一个内存溢出程序的监控,学习了程序运行时对内存的使用机制,在这里和大家分享下。

        Java程序运行在JVM(Java  Virtual Machine,Java虚拟机)上,可以把JVM理解成Java程序和操作系统之间的桥梁,JVM实现了Java的平台无关性,由此可见JVM的重要性。所以在学习Java内存分配原理的时候一定要牢记这一切都是在JVM中进行的,JVM是内存分配原理的基础与前提。

        一个完整的Java程序运行过程会涉及以下内存区域:

 

        寄存器:JVM内部虚拟寄存器,存取速度非常快,程序不可控制。

        栈:保存局部变量的值,包括:a.用来保存基本数据类型的值;b.保存类的实例,即堆区对象的引用(指针)。也可以用来保存加载方法时的帧。

        堆:用来存放动态产生的数据,比如new出来的对象。注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。

        常量池:JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合。包括直接常量(基本类型,String)和对其他类型、方法、字段的符号引用(1)。池中的数据和数组一样通过索引访问。由于常量池包含了一个类型所有的对其他类型、方法、字段的符号引用,所以常量池在Java的动态链接中起了核心作用。常量池存在于堆中

        代码段:用来存放从硬盘上读取的源程序代码。

        数据段:用来存放static定义的静态成员。

下图表示内存分配图:


 

对于java 和内存之间,有如下几点需要注意:

 1.一个Java文件,只要有main入口方法,我们就认为这是一个Java程序,可以单独编译运行。

  2.无论是普通类型的变量还是引用类型的变量(俗称实例),都可以作为局部变量,他们都可以出现在栈中。只不过普通类型的变量在栈中直接保存它所对应的值,而引用类型的变量保存的是一个指向堆区的指针,通过这个指针,就可以找到这个实例在堆区对应的对象。因此,普通类型变量只在栈区占用一块内存,而引用类型变量要在栈区和堆区各占一块内存。

3.分清什么是实例什么是对象。Class a= new Class();此时a叫实例,而不能说a是对象。实例在栈中,对象在堆中,操作实例实际上是通过实例的指针间接操作对象。多个实例可以指向同一个对象。

 4.栈中的数据和堆中的数据销毁并不是同步的。方法一旦结束,栈中的局部变量立即销毁,但是堆中对象不一定销毁。因为可能有其他变量也指向了这个对象,直到栈中没有变量指向堆中的对象时,它才销毁,而且还不是马上销毁,要等垃圾回收扫描时才可以被销毁。

 5.以上的栈、堆、代码段、数据段等等都是相对于应用程序而言的。每一个应用程序都对应唯一的一个JVM实例,每一个JVM实例都有自己的内存区域,互不影响。并且这些内存区域是所有线程共享的。这里提到的栈和堆都是整体上的概念,这些堆栈还可以细分。

6 .类的成员变量在不同对象中各不相同,都有自己的存储空间(成员变量在堆中的对象中)。而类的方法却是该类的所有对象共享的,只有一套,对象使用方法的时候方法才被压入栈,方法不使用则不占用内存。

55
12
分享到:
评论
47 楼 u010297957 2016-04-23  
我觉得不严谨,可以看我这篇:http://blog.csdn.net/u010297957/article/details/50984427
46 楼 Wuaner 2012-08-30  
引用
Class a= new Class();此时a叫实例,而不能说a是对象。实例在栈中,对象在堆中,操作实例实际上是通过实例的指针间接操作对象。多个实例可以指向同一个对象。


别的不用看,就这句话,就知道楼主水平有限。

从面向对象的角度来看,对象就是类的一个具体实例,或者说,实例就是对象。

如果是问概念的抽象层次,问“类”和“实例对象”的区别更恰当。

你例子里的a不叫实例,只是实例对象的引用而已。正如你想阐述的栈和堆,对象引用a是存在栈中的,存的具体内容就是new出的Class实例在堆中的地址。
45 楼 yangxiutian 2012-06-15  
leonayx123 写道
yangxiutian 写道
嗯,谢谢告知,有些东西真的要自己去弄明白。

给你一个神贴。
当时在微博上看到的,
https://www.ibm.com/developerworks/cn/java/j-codetoheap/

这个帖子里,写的比 深入jvm还要详细。

深入jvm 读起来像啃锯末一样。

好,收藏一下先
44 楼 leonayx123 2012-06-15  
yangxiutian 写道
嗯,谢谢告知,有些东西真的要自己去弄明白。

给你一个神贴。
当时在微博上看到的,
https://www.ibm.com/developerworks/cn/java/j-codetoheap/

这个帖子里,写的比 深入jvm还要详细。

深入jvm 读起来像啃锯末一样。
43 楼 yangxiutian 2012-06-15  
leonayx123 写道
yangxiutian 写道
杨胜寒 写道
真是误人子弟,楼主的这篇文章虽然简短,前前后后有诸多不妥之处,指出如下:
1、“b.保存类的实例,即堆区对象的引用(指针)”,显然,楼主没有搞清楚类、实例和对象之间的关系,类是对对象的抽象描述,而对象则是有具体数据的类的实例,所以对象和实例是一回事,都会被保存在堆中,而不是栈中。在栈中保存的,仅仅是对象的引用而已,如你所说,即指针。指针是用来存放内存单元地址的变量,在32位操作系统中长度为32,占用4字节的空间,64位操作系统中长度为64,占用8字节空间,是数值型(可以简单认为就是整型),所以可以被保存在栈中。
2、“注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类吗?你不觉得违反了面向对象的思想了吗?你不觉得完全是无稽之谈吗?
3、楼主对于“常量池”、“代码段”、“数据段”的理解和解释我不能苟同
剩下的一半文章内容,我也不想再去费口舌评论了,这里推荐楼主去看看一篇真正讲解JVM内存模型的文章:<a href="http://yshjava.iteye.com/blog/1327778" target="_blank">http://yshjava.iteye.com/blog/1327778</a>。相信看了这篇文章之后,楼主会对java虚拟机的内存模型有一个正确而全面的认识。
祝楼主好运啦!

“在栈中保存的,仅仅是对象的引用而已,如你所说,即指针。”“每个对象在堆中可以理解为一个集合,该集合中包含了指向该对象的类数据的指针”,指针说:“我到底在哪?”(数据提交受限,引用做了删减)。


杨胜寒这里说的是对的。
栈里有一个指针指向 堆里的对象地址。对象里还有一个指针指向方法区里 这个对象所实现那个类的类型信息。

嗯,谢谢告知,有些东西真的要自己去弄明白。
42 楼 leonayx123 2012-06-15  
杨胜寒 写道
真是误人子弟,楼主的这篇文章虽然简短,前前后后有诸多不妥之处,指出如下:
1、“b.保存类的实例,即堆区对象的引用(指针)”,显然,楼主没有搞清楚类、实例和对象之间的关系,类是对对象的抽象描述,而对象则是有具体数据的类的实例,所以对象和实例是一回事,都会被保存在堆中,而不是栈中。在栈中保存的,仅仅是对象的引用而已,如你所说,即指针。指针是用来存放内存单元地址的变量,在32位操作系统中长度为32,占用4字节的空间,64位操作系统中长度为64,占用8字节空间,是数值型(可以简单认为就是整型),所以可以被保存在栈中。
2、“注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。”,洛里啰嗦,不知所云。每个对象在堆中可以理解为一个集合,该集合中包含了指向该对象的类数据的指针,基本类型的成员变量的值和扩展数据类型的成员变量的引用,而刚才提到的栈中保存的对象的引用即是此处集合的内存地址。面向对象的程序设计思想中,就明确了类的不同类实例中的成员变量的关系,此处何须重申“同一个类的对象拥有各自的成员变量”?难道读者都不懂面向对象?“存储在各自的堆中”这里的堆是有特殊意义的,不要随便用,一个JVM实例只有一个堆,切勿混淆了概念。“但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次”更是让人生气,类是对对象抽象,如果同一个类的不同对象拥有的方法的代码不同,你不觉得很奇怪吗?你不觉得违反了面向对象的思想了吗?你不觉得完全是无稽之谈吗?
3、楼主对于“常量池”、“代码段”、“数据段”的理解和解释我不能苟同,我认为楼主的观点片面且狭隘。对于JVM而言,每一个被类装载子系统装载的类型,虚拟机都会保存下列数据到方法区:
类型的全限定名
类型超类的全限定名(java.lang.Object没有超类)
类型是类类型还是接口类型
类型的访问修饰符
任何直接超接口的全限定名有序列表
等等,除了这些,还将保存一些其他信息,这其他信息中,就有你说的“常量池”,所谓“代码段”,其实就是“字节码”,不过他不叫“代码段”,他叫“方法信息”,“数据段”也不叫数据段,他叫“常量以外的所有类级变量”。
我看到你把那个JVM内存模型图画成那样,气就不打一处来,完全是意淫!
剩下的一半文章内容,我也不想再去费口舌评论了,这里推荐楼主去看看一篇真正讲解JVM内存模型的文章:<a href="http://yshjava.iteye.com/blog/1327778" target="_blank">http://yshjava.iteye.com/blog/1327778</a>。相信看了这篇文章之后,楼主会对java虚拟机的内存模型有一个正确而全面的认识。
祝楼主好运啦!



你写的知识点确实很正确,理解的很透彻。
但是“误人子弟”“洛里啰嗦,不知所云”“完全是意淫”这种话就不要说了么。
每个人都有一个进步的过程,谁也都有不会的时候。你这样说太火爆了。容易吵起来。哈哈。
41 楼 leonayx123 2012-06-15  
yangxiutian 写道
杨胜寒 写道
真是误人子弟,楼主的这篇文章虽然简短,前前后后有诸多不妥之处,指出如下:
1、“b.保存类的实例,即堆区对象的引用(指针)”,显然,楼主没有搞清楚类、实例和对象之间的关系,类是对对象的抽象描述,而对象则是有具体数据的类的实例,所以对象和实例是一回事,都会被保存在堆中,而不是栈中。在栈中保存的,仅仅是对象的引用而已,如你所说,即指针。指针是用来存放内存单元地址的变量,在32位操作系统中长度为32,占用4字节的空间,64位操作系统中长度为64,占用8字节空间,是数值型(可以简单认为就是整型),所以可以被保存在栈中。
2、“注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类吗?你不觉得违反了面向对象的思想了吗?你不觉得完全是无稽之谈吗?
3、楼主对于“常量池”、“代码段”、“数据段”的理解和解释我不能苟同
剩下的一半文章内容,我也不想再去费口舌评论了,这里推荐楼主去看看一篇真正讲解JVM内存模型的文章:<a href="http://yshjava.iteye.com/blog/1327778" target="_blank">http://yshjava.iteye.com/blog/1327778</a>。相信看了这篇文章之后,楼主会对java虚拟机的内存模型有一个正确而全面的认识。
祝楼主好运啦!

“在栈中保存的,仅仅是对象的引用而已,如你所说,即指针。”“每个对象在堆中可以理解为一个集合,该集合中包含了指向该对象的类数据的指针”,指针说:“我到底在哪?”(数据提交受限,引用做了删减)。


杨胜寒这里说的是对的。
栈里有一个指针指向 堆里的对象地址。对象里还有一个指针指向方法区里 这个对象所实现那个类的类型信息。
40 楼 yangxiutian 2012-06-15  
杨胜寒 写道
yangxiutian 写道
杨胜寒 写道
真是误人子弟,楼主的这篇文章虽然简短,前前后后有诸多不妥之处,指出如下:
。。。


我先解释指针的问题:难道您认为JVM中只能有一个指针?还是指针只能存在栈中或只能存在于堆中?这么简单的问题,还需要再讨论吗?
再解释第二个问题:我觉得推荐自己的文章也好,别人的文章也好,能够让读者有所收获,就是好的文章,跟作者没有关系,更加跟清白扯不上关系。
本身大家在网上写博客,就是为了促进彼此之间的交流,共同进步,听您的口气,倒更像是一个炫耀、卖弄和自欺欺人的地方了。我的那篇文章,可能你现在看来是谬论,这个我倒不在乎,仁者见仁智者见智嘛,但是你提到了清白问题,我就要说两句了,我是一个程序员,在技术上,一向都是兢兢业业,精益求精,同时我可以接受任何形式和内容的批评和指正,若您觉得拙作不妥,请尽管指出来,又何须污蔑我的一片好意?
最后,建议楼主看看《深入java虚拟机》这本书,第五章第二节明确讲到了JVM的内存模型,看完之后,你就知道这篇文章有多么的不靠谱,你就知道我为什么要这么评论这篇文章了。

看了您的回应,觉得您是个很理性的人,说的让我心服口服。看来是我见识短了,关于JVM、指针 我想我还是自己去弄清楚吧 再问的话真的让人瞧不起了;谢谢你的推荐《深入java虚拟机》这本书我一定会去看的。另外觉得您技术不错、人品不错 不嫌弃的话可以交个朋友 QQ:[成]648774188,到时向您请教技术上的问题。
39 楼 liguocai2009 2012-06-15  
首先感谢楼主的分享精神。但是我感觉你好像是看了C++的内存分配,然后再看了看Java的内存分配,最后写了这么一篇文章。总体来说,问题还是比较多,跟正宗比起来的话。。。当然如何证明自己对内存分配的理解,也是很难的一件事,所以之后相信正宗的了。
38 楼 杨胜寒 2012-06-14  
yangxiutian 写道
杨胜寒 写道
真是误人子弟,楼主的这篇文章虽然简短,前前后后有诸多不妥之处,指出如下:
。。。。。看完之后,你就知道这篇文章有多么的不靠谱,你就知道我为什么要这么评论这篇文章了。

你说的深入虚拟机是哪个版本的.是针对哪个JDK写的.
jdk5 和jdk6的内部实现都不太一样,尽信书不如无书.还是已实测试为准,另外lz的文章写的的确有些问题.

深入java虚拟机原书第二版
37 楼 android_mylove 2012-06-14  
杨胜寒 写道
真是误人子弟,楼主的这篇文章虽然简短,前前后后有诸多不妥之处,指出如下:
。。。。。看完之后,你就知道这篇文章有多么的不靠谱,你就知道我为什么要这么评论这篇文章了。

你说的深入虚拟机是哪个版本的.是针对哪个JDK写的.
jdk5 和jdk6的内部实现都不太一样,尽信书不如无书.还是已实测试为准,另外lz的文章写的的确有些问题.
36 楼 杨胜寒 2012-06-14  
yangxiutian 写道
杨胜寒 写道
真是误人子弟,楼主的这篇文章虽然简短,前前后后有诸多不妥之处,指出如下:
1、“b.保存类的实例,即堆区对象的引用(指针)”,显然,楼主没有搞清楚类、实例和对象之间的关系,类是对对象的抽象描述,而对象则是有具体数据的类的实例,所以对象和实例是一回事,都会被保存在堆中,而不是栈中。在栈中保存的,仅仅是对象的引用而已,如你所说,即指针。指针是用来存放内存单元地址的变量,在32位操作系统中长度为32,占用4字节的空间,64位操作系统中长度为64,占用8字节空间,是数值型(可以简单认为就是整型),所以可以被保存在栈中。
2、“注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类吗?你不觉得违反了面向对象的思想了吗?你不觉得完全是无稽之谈吗?
3、楼主对于“常量池”、“代码段”、“数据段”的理解和解释我不能苟同
剩下的一半文章内容,我也不想再去费口舌评论了,这里推荐楼主去看看一篇真正讲解JVM内存模型的文章:<a href="http://yshjava.iteye.com/blog/1327778" target="_blank">http://yshjava.iteye.com/blog/1327778</a>。相信看了这篇文章之后,楼主会对java虚拟机的内存模型有一个正确而全面的认识。
祝楼主好运啦!

“在栈中保存的,仅仅是对象的引用而已,如你所说,即指针。”“每个对象在堆中可以理解为一个集合,该集合中包含了指向该对象的类数据的指针”,指针说:“我到底在哪?”(数据提交受限,引用做了删减)。

我先解释指针的问题:难道您认为JVM中只能有一个指针?还是指针只能存在栈中或只能存在于堆中?这么简单的问题,还需要再讨论吗?
再解释第二个问题:我觉得推荐自己的文章也好,别人的文章也好,能够让读者有所收获,就是好的文章,跟作者没有关系,更加跟清白扯不上关系。
本身大家在网上写博客,就是为了促进彼此之间的交流,共同进步,听您的口气,倒更像是一个炫耀、卖弄和自欺欺人的地方了。我的那篇文章,可能你现在看来是谬论,这个我倒不在乎,仁者见仁智者见智嘛,但是你提到了清白问题,我就要说两句了,我是一个程序员,在技术上,一向都是兢兢业业,精益求精,同时我可以接受任何形式和内容的批评和指正,若您觉得拙作不妥,请尽管指出来,又何须污蔑我的一片好意?
最后,建议楼主看看《深入java虚拟机》这本书,第五章第二节明确讲到了JVM的内存模型,看完之后,你就知道这篇文章有多么的不靠谱,你就知道我为什么要这么评论这篇文章了。
35 楼 yangxiutian 2012-06-14  
杨胜寒 写道
真是误人子弟,楼主的这篇文章虽然简短,前前后后有诸多不妥之处,指出如下:
1、“b.保存类的实例,即堆区对象的引用(指针)”,显然,楼主没有搞清楚类、实例和对象之间的关系,类是对对象的抽象描述,而对象则是有具体数据的类的实例,所以对象和实例是一回事,都会被保存在堆中,而不是栈中。在栈中保存的,仅仅是对象的引用而已,如你所说,即指针。指针是用来存放内存单元地址的变量,在32位操作系统中长度为32,占用4字节的空间,64位操作系统中长度为64,占用8字节空间,是数值型(可以简单认为就是整型),所以可以被保存在栈中。
2、“注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类吗?你不觉得违反了面向对象的思想了吗?你不觉得完全是无稽之谈吗?
3、楼主对于“常量池”、“代码段”、“数据段”的理解和解释我不能苟同
剩下的一半文章内容,我也不想再去费口舌评论了,这里推荐楼主去看看一篇真正讲解JVM内存模型的文章:<a href="http://yshjava.iteye.com/blog/1327778" target="_blank">http://yshjava.iteye.com/blog/1327778</a>。相信看了这篇文章之后,楼主会对java虚拟机的内存模型有一个正确而全面的认识。
祝楼主好运啦!

还有,说推荐一篇文章,可是链接到了自己的博客,似乎不太厚道。你不觉得通过第三方才能证明自己的正确吗?
34 楼 yangxiutian 2012-06-14  
杨胜寒 写道
真是误人子弟,楼主的这篇文章虽然简短,前前后后有诸多不妥之处,指出如下:
1、“b.保存类的实例,即堆区对象的引用(指针)”,显然,楼主没有搞清楚类、实例和对象之间的关系,类是对对象的抽象描述,而对象则是有具体数据的类的实例,所以对象和实例是一回事,都会被保存在堆中,而不是栈中。在栈中保存的,仅仅是对象的引用而已,如你所说,即指针。指针是用来存放内存单元地址的变量,在32位操作系统中长度为32,占用4字节的空间,64位操作系统中长度为64,占用8字节空间,是数值型(可以简单认为就是整型),所以可以被保存在栈中。
2、“注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类吗?你不觉得违反了面向对象的思想了吗?你不觉得完全是无稽之谈吗?
3、楼主对于“常量池”、“代码段”、“数据段”的理解和解释我不能苟同
剩下的一半文章内容,我也不想再去费口舌评论了,这里推荐楼主去看看一篇真正讲解JVM内存模型的文章:<a href="http://yshjava.iteye.com/blog/1327778" target="_blank">http://yshjava.iteye.com/blog/1327778</a>。相信看了这篇文章之后,楼主会对java虚拟机的内存模型有一个正确而全面的认识。
祝楼主好运啦!

“在栈中保存的,仅仅是对象的引用而已,如你所说,即指针。”“每个对象在堆中可以理解为一个集合,该集合中包含了指向该对象的类数据的指针”,指针说:“我到底在哪?”(数据提交受限,引用做了删减)。
33 楼 yangxiutian 2012-06-14  
能评论不?
32 楼 大蒜头 2012-06-14  
   来学习的
31 楼 大蒜头 2012-06-14  
   来学习的
30 楼 234369425 2012-06-14  
看周志明的深入理解java虚拟机,怎么感觉你这描述的不是JVM,是不是XVM???
29 楼 杨胜寒 2012-06-14  
真是误人子弟,楼主的这篇文章虽然简短,前前后后有诸多不妥之处,指出如下:
1、“b.保存类的实例,即堆区对象的引用(指针)”,显然,楼主没有搞清楚类、实例和对象之间的关系,类是对对象的抽象描述,而对象则是有具体数据的类的实例,所以对象和实例是一回事,都会被保存在堆中,而不是栈中。在栈中保存的,仅仅是对象的引用而已,如你所说,即指针。指针是用来存放内存单元地址的变量,在32位操作系统中长度为32,占用4字节的空间,64位操作系统中长度为64,占用8字节空间,是数值型(可以简单认为就是整型),所以可以被保存在栈中。
2、“注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。”,洛里啰嗦,不知所云。每个对象在堆中可以理解为一个集合,该集合中包含了指向该对象的类数据的指针,基本类型的成员变量的值和扩展数据类型的成员变量的引用,而刚才提到的栈中保存的对象的引用即是此处集合的内存地址。面向对象的程序设计思想中,就明确了类的不同类实例中的成员变量的关系,此处何须重申“同一个类的对象拥有各自的成员变量”?难道读者都不懂面向对象?“存储在各自的堆中”这里的堆是有特殊意义的,不要随便用,一个JVM实例只有一个堆,切勿混淆了概念。“但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次”更是让人生气,类是对对象抽象,如果同一个类的不同对象拥有的方法的代码不同,你不觉得很奇怪吗?你不觉得违反了面向对象的思想了吗?你不觉得完全是无稽之谈吗?
3、楼主对于“常量池”、“代码段”、“数据段”的理解和解释我不能苟同,我认为楼主的观点片面且狭隘。对于JVM而言,每一个被类装载子系统装载的类型,虚拟机都会保存下列数据到方法区:
类型的全限定名
类型超类的全限定名(java.lang.Object没有超类)
类型是类类型还是接口类型
类型的访问修饰符
任何直接超接口的全限定名有序列表
等等,除了这些,还将保存一些其他信息,这其他信息中,就有你说的“常量池”,所谓“代码段”,其实就是“字节码”,不过他不叫“代码段”,他叫“方法信息”,“数据段”也不叫数据段,他叫“常量以外的所有类级变量”。
我看到你把那个JVM内存模型图画成那样,气就不打一处来,完全是意淫!
剩下的一半文章内容,我也不想再去费口舌评论了,这里推荐楼主去看看一篇真正讲解JVM内存模型的文章:<a href="http://yshjava.iteye.com/blog/1327778" target="_blank">http://yshjava.iteye.com/blog/1327778</a>。相信看了这篇文章之后,楼主会对java虚拟机的内存模型有一个正确而全面的认识。
祝楼主好运啦!
28 楼 leonayx123 2012-06-14  
Harry9090 写道
一看到把常量池画到堆里面,我就不解了,迷惑!

//////////////////////*************
常量池 (constant pool)
常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用,比如:
◆类和接口的全限定名;
◆字段的名称和描述符;
◆方法和名称和描述符。
虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(string,integer和 floating point常量)和对其他类型,字段和方法的符号引用。
对于String常量,它的值是在常量池中的。而JVM中的常量池在内存当中是以表的形式存在的, 对于String类型,有一张固定长度的CONSTANT_String_info表用来存储文字字符串值,注意:该表只存储文字字符串值,不存储符号引 用。说到这里,对常量池中的字符串值的存储位置应该有一个比较明了的理解了。
在程序执行的时候,常量池 会储存在Method Area,而不是堆中。
*************//////////////
转至http://zzc1684.iteye.com/blog/1457364

最后一句话,常量池,不在堆中!


不知道到底哪个是对的。



sun的jdk是把方法区放在堆里的(传说中的持久域 )。可以通过-XX:PermSize 设置大小

方法区按jvm规范 可以自己定义一块区域,也可以放在堆里。
只要有就行。

相关推荐

    java内存分配机制详解

    ### Java内存分配机制详解 #### 一、引言 Java作为一种广泛应用的编程语言,其内存管理机制对于确保程序高效稳定运行至关重要。本文旨在详细介绍Java内存分配机制中的几个关键概念:寄存器、栈、堆、静态域、常量...

    java内存分配机制[归纳].pdf

    java内存分配机制[归纳].pdf

    java内存分配情况

    Java内存分配主要涉及五个区域:寄存器、栈、堆、静态域和常量池。在Java编程中,理解这些内存区域的分配规则对于优化代码性能和避免内存泄漏至关重要。 1. **寄存器**:这是最快捷的存储区域,但不在Java程序员的...

    深入Java核心 Java内存分配原理精讲

    Java内存分配机制是Java编程语言的重要组成部分,它不仅直接影响着程序的性能,也是理解Java垃圾回收、内存泄漏等问题的关键。本文将聚焦于Java内存分配的核心概念,包括栈、堆、常量池等关键区域的功能与使用场景,...

    Java内存分配浅析

    Java内存分配是Java编程中非常重要的概念,它涉及到程序运行时的数据存储和管理。Java程序在JVM(Java Virtual Machine,Java虚拟机)上运行,JVM作为一个平台无关的执行环境,负责Java程序的内存管理和执行。理解...

    Java内存分配原理精讲

    ### Java内存分配原理精讲 #### 一、引言 Java作为一门广泛应用于企业级开发的语言,其内存管理和分配机制是其核心技术之一。本文旨在深入探讨Java内存分配的基本原理及其在不同内存区域的具体表现,帮助读者更好...

    java实现内存动态分配

    Java 实现内存动态分配主要涉及Java内存模型以及内存管理机制,包括堆内存和栈内存的分配,以及垃圾回收等概念。下面将详细解释这些知识点。 1. **Java内存模型** Java程序运行时,内存分为堆内存(Heap)和栈内存...

    java内存分配演示程序

    "java内存分配演示程序"是一个用于理解Java内存模型和内存分配过程的项目。在这个课程设计中,你将深入学习Java如何在运行时为对象分配内存,以及垃圾收集器如何回收不再使用的内存。以下是关于Java内存分配的一些...

    深入Java核心_Java内存分配原理精讲

    总结,深入理解Java内存分配原理意味着深入理解Java运行机制,这将帮助开发者编写出更高效、更健壮的代码,提升系统的整体性能和稳定性。通过学习和实践,开发者可以更好地应对内存溢出、性能瓶颈等问题,从而成为...

    java内存对象分配过程研究

    ### Java内存对象分配过程研究 #### 一、引言 Java作为一门强大的面向对象编程语言,在实际开发过程中,对象的创建及其内存管理是至关重要的环节。深入理解对象在内存中的分配过程不仅能够帮助开发者设计出更为...

    java核心 内存分配问题

    Java 内存分配是理解Java程序性能和...理解Java内存分配对于编写高效、无内存泄漏的代码至关重要,同时也对诊断和解决性能问题有着深远的影响。通过深入了解这些概念,开发者能够更好地设计和优化他们的Java应用程序。

    java内存分配 内存泄漏

    理解Java内存分配和JVM工作原理对于开发高效、健壮的Java应用至关重要。开发者应避免内存泄漏,合理使用内存,充分利用JVM的垃圾收集机制,同时理解JIT编译的优化策略,以提高程序的运行性能。在开发过程中,使用...

    Java内存分配全面解析

    Java内存分配全面解析 Java程序在执行过程中,其内存分配主要涉及到JVM(Java Virtual Machine,Java虚拟机)的不同区域。这些区域包括寄存器、栈、堆、常量池、代码段和数据段。理解这些内存区域的工作原理对于...

    java实现的内存分配

    Java内存分配的核心机制是垃圾收集(Garbage Collection, GC),它负责自动回收不再使用的内存。Java提供了几种不同的垃圾收集器,如Serial、Parallel、Concurrent Mark Sweep (CMS) 和G1等,它们各有优缺点,适用于...

    java内存机制及异常处理

    Java内存机制是Java虚拟机(JVM)的关键组成部分,它管理着程序运行时的数据存储。在Java中,内存主要分为以下几个区域: 1. **Heap(堆)**:这是Java中最主要的内存区域,用于存储所有的类实例和数组。当堆空间...

    Java中堆内存与栈内存分配浅析

    本文将深入探讨Java中堆内存与栈内存的分配机制,并通过对比分析它们之间的差异,帮助读者更好地掌握Java内存管理的核心概念。 #### 二、堆内存与栈内存概述 ##### 1. 堆内存 堆内存是Java虚拟机(JVM)用于存储...

    java内存分配详解

    ### Java内存分配详解 #### 一、Java内存区域划分 Java程序在运行过程中涉及的内存主要分为两大类:栈内存和堆内存。 1. **栈内存**:主要用于存储局部变量,如基本数据类型变量(int、long、char等)以及对象的...

    java 内存分配 适应法

    本篇文章将深入探讨Java内存分配中的“最先适应法”、“最佳适应法”和“最坏适应法”,这些都是内存管理中的经典算法,适用于不同的场景和需求。 首先,我们来看“最先适应法”(First Fit)。这是一种简单的内存...

    Java的内存管理机制分析

    通过对Java内存管理机制的深入分析,我们可以了解到Java如何高效地管理和利用内存资源。理解这些机制对于优化Java应用程序的性能至关重要,特别是在处理大规模数据集或多线程环境时。此外,合理配置JVM参数和选择...

Global site tag (gtag.js) - Google Analytics