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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 陈嘉宾 于 2012-5-23 10:36 编辑

方法区这块我不太明白。方法区跟栈和堆的关系,怎么就能成为方法区呢?

3 个回复

倒序浏览
JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)
堆区:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
栈区:
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
方法区:
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

点评

很好,很强大~~~~~~~~  发表于 2012-5-22 23:45

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 余宏 于 2012-5-22 23:59 编辑

几乎上面的都总结了,我再说下方法区吧:
在一个jvm实例的内部,类信息被存储在一个被称作方法区的内存逻辑区中。类信息是由类加载器在类加载时从类文件中提取出来的。类(静态)变量 也存储在方法区中。
当加载到方法区后,其存放形式由 jvm根据不同的平台来具体定义。 jvm在运行应用时要大量使用存储在方法区中的类信息。因此我们需要考虑空间问题。
因为方法区是被所有线程共享的,所以必须考虑数据的线程安全。假如两个线程都在试图找lava的类,在lava类还没有被加载的情况下,只应该有 一个线程去加载,而另一个线程等待。
方法区的大小不必是固定的,jvm可以根据应用的需要动态调整。同样方法区也不必是连续的。方法区可以在堆中分配。 jvm可以允许用户和程序指定方法区的初始大小,最小和最大尺寸。
方法区同样存在垃圾收集,因为通过用户定义的类加载器可以动态扩展java程序,一些类也会成为垃圾。jvm可以回收一个未被引用类所占的空间, 以使方法区的空间最小。


评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 十期见哥们··

查看全部评分

回复 使用道具 举报
余宏 发表于 2012-5-22 23:39
几乎上面的都总结了,我再说下方法区吧:
在一个jvm实例的内部,类信息被存储在一个被称作方法区的内存逻辑 ...

好的,谢谢!:)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马