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

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内存分配机制[归纳].pdf

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

    JAVA虚拟机内存分配机制

    JAVA虚拟机内存分配机制 详细讲述了JAVA VM的内存分配 对深入理解JAVA有帮助

    Java 虚拟机学习笔记:Java 内存区域,垃圾收集,内存分配与回收策略,JVM 调优,文件结构,类加载机制,Java 程序

    内存分配与回收策略, JVM 调优, 文件结构, 类加载机制, Java 程序 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,意味着可以在不同的操作系统上运行。Java具有简单、...

    Java垃圾回收机制和内存分配

    你认真演示了一遍,你就能明白JAVA的垃圾回收机制。当然文档写的不一定全面,比如文档当中关于老年区少年区有一页写的不是很完整,我也没有添加太多进去,但是还是很有很全面很有参考意义的。

    java内存讲解

    内容包括:JVM的垃圾回收机制详解和调优;深入Java核心 Java内存分配原理精讲;详细介绍Java的内存管理与内存泄露,三个文档整合

    JAVA虚拟机内存分配与回收机制[文].pdf

    JAVA虚拟机内存分配与回收机制[文].pdf

    java主要反射和内存机制

    非常详细的讲解java的内存分配机制和java反射机制的文档,里面还有代码可以自己改写。

    java内存管理以及GC

    内存管理的职责为分配内存,回收内存。 没有自动内存管理的语言/平台容易发生错误。 典型的问题包括悬挂指针问题,一个指针引用了一个已经被回收的内存地址,导致程序的运行完全不可知。 另一个典型问题为内存...

    最详细的java内存讲解

    JVM的垃圾回收机制详解和调优; 深入Java核心 Java内存分配原理精讲; 详细介绍Java的内存管理与内存泄露;

    Java 内存分配深入理解

    主要介绍了Java 内存分配深入理解的相关资料,需要的朋友可以参考下

    Java的内存回收机制

    在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C/C++直接操作内存的危险。但是,也正因为内存管理完全由...

    Java内存回收机制

     内存泄露:程序运行过程中,会不断分配内存空间,那些不再使用的内存空间应该即时回收它们,从而保证系统可以再次使用这些内存,如果存在无用的内存没有被回收回来,这是内存泄漏.  (1)强引用  这是java程序...

    03-VIP-JVM内存分配机制与垃圾回收算法1

    1.1 对象优先在Eden区分配 1.2 大对象直接进入老年代 1.3 长期存活的对象将进入老年代

    java 垃圾回收 机制详解

    经过半个世纪的发展,内存的动态分配与内存回收技术已经相当成熟,一切看起来都进入了“自动化”时代,那为什么我们还要去了解GC和内存分配呢?答案很简单:当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为...

    Java中变量内存分配机制

    在本文中,简单的为大家介绍有关,java中变量在内存是如何分配的。  在任何编程语言中,无论是基本类型还是引用类型,不论其作用域如何,都必须为其分配一定的内存空间,Java 语言也不例外,Java 的数据类型可以...

    java内存泄漏

     上面是Java内存管理机制的基本情况。但是如果仅仅理解到这里,我们在实际的项目开发中仍然会遇到内存泄漏的问题。也许有人表示怀疑,既然Java的垃圾回收机制能够自动的回收内存,怎么还会出现内存泄漏的情况呢?这...

    JVM内存分配与垃圾回收详解

    个人整理 jvm相关知识 包括内存分配机制 垃圾回收机制 垃圾收集器相关 及 垃圾收集算法

    JAVA 内存管理总结

     Java的内存管理是对象的分配和释放问题。(两部分)  分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间。  释放 :...

    Java GC 机制与内存分配策略详解

    主要介绍了Java GC 机制与内存分配策略详解的相关资料,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics