黑马程序员技术交流社区
标题:
方法区跟栈和堆的关系,怎么就能成为方法区呢?[已解决]
[打印本页]
作者:
陈嘉宾
时间:
2012-5-22 23:22
标题:
方法区跟栈和堆的关系,怎么就能成为方法区呢?[已解决]
本帖最后由 陈嘉宾 于 2012-5-23 10:36 编辑
方法区这块我不太明白。方法区跟栈和堆的关系,怎么就能成为方法区呢?
作者:
康大玮
时间:
2012-5-22 23:26
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:39
本帖最后由 余宏 于 2012-5-22 23:59 编辑
几乎上面的都总结了,我再说下方法区吧:
在一个jvm实例的内部,类信息被存储在一个被称作方法区的内存逻辑区中。类信息是由类加载器在类加载时从类文件中提取出来的。类(静态)变量 也存储在方法区中。
当加载到方法区后,其存放形式由 jvm根据不同的平台来具体定义。 jvm在运行应用时要大量使用存储在方法区中的类信息。因此我们需要考虑空间问题。
因为方法区是被所有线程共享的,所以必须考虑数据的线程安全。假如两个线程都在试图找lava的类,在lava类还没有被加载的情况下,只应该有 一个线程去加载,而另一个线程等待。
方法区的大小不必是固定的,jvm可以根据应用的需要动态调整。同样方法区也不必是连续的。方法区可以在堆中分配。 jvm可以允许用户和程序指定方法区的初始大小,最小和最大尺寸。
方法区同样存在垃圾收集,因为通过用户定义的类加载器可以动态扩展java程序,一些类也会成为垃圾。jvm可以回收一个未被引用类所占的空间, 以使方法区的空间最小。
作者:
余宏
时间:
2012-5-23 00:27
余宏 发表于 2012-5-22 23:39
几乎上面的都总结了,我再说下方法区吧:
在一个jvm实例的内部,类信息被存储在一个被称作方法区的内存逻辑 ...
好的,谢谢!:)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2