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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈苓 中级黑马   /  2012-4-7 00:44  /  1681 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

问题是这样的,不是说静态的成员函数和成员变量加载在方法区吗?为什么图上这个setName不是静态为什么画图画在方法区啊?

该贴已经同步到 格式化的微博

~43_QWS@S26U@2@3}9V4(3B.jpg (110.77 KB, 下载次数: 49)

~43_QWS@S26U@2@3}9V4(3B.jpg

6 个回复

倒序浏览
静态的成员函数和成员变量随着类的加载存在于方法区中,这是没有问题的,但是不代表方法区中只存在这些东西

jvm在运行时要大量使用存储在方法区中的类型信息。而且方法区是被所有线程共享的。

方法区的大小不必是固定的,jvm可以根据应用的需要动态调整。同样方法区也不必是连续的。方法区可以在堆中分配。

jvm可以允许用户和程序指定方法区的初始大小,最小和最大尺寸。

方法区同样存在垃圾收集,因为通过用户定义的类加载器可以动态扩展java程序,一些类也会成为垃圾。

我认为方法区是jvm运作的核心,所有的静态方法在加载类的时候已经加载好,而当你需要调用那个方法,或者对某个对象进行操作的时候,又会把方法加载到方法区进行调用

回复 使用道具 举报
方法区  是存放   静态方法  对象的方法  还有常量的    你的set  get方法是属于对象的  所以是没问题的
  
回复 使用道具 举报
setName带方法(也就是说有明确的执行语句,是在方法中的),当作为一个方法名的名的时候是在栈的,就像main一样,是在栈中一样的。栈中不是只有一个setName()名字吗?而方法区中的不是带有明确的方法执行语句吗?
回复 使用道具 举报
对于被装载的每个类,虚拟机都会把这个类的类型信息存储在方法区,方法区中存储以下信息:eg: public class Test extends superclass implements interface1, interface2

1,  类的全限定名

2,  类的超类的全限定名

3,  这个类是类型还是接口

4,  类的访问修饰符

5,  超接口的权限定名的有序类表

6,  该类的常量池,

     该类型所使用常量的一个有序集合,包括直接类型和对其他类的,字段和方法的符号引用。

7,  字段信息

字段名,字段类型,字段的修饰符(eg:private String field)

8,  方法信息

方法名,方法的返回信息,方法的修饰符(eg:public  void method),如果一个方法不是抽象的和本地的还将保存一下信息:方法的字节码,操作数栈和方法的栈帧中的局部变量的大小,异常表

9,  除了常量以外的所有类变量

类变量是多有类实例共享的,但是没有类实例也可以访问,只与类有关,编译时常量

10,             一个到classLoader的应用

11,             一个到class类的引用

12,             方法表(为了尽可能的提高访问效率,大部分虚拟机对每个装载的费抽象类,都生成一个方法表,把他们当做类型信息放在方法去类。)

方法区同样可以被垃圾回收。
回复 使用道具 举报
问题是这样的,不是说静态的成员函数和成员变量加载在方法区吗?为什么图上这个setName不是静态为什么画图画在方法区啊?

方法区通常情况下,可以分为静态方法区,非静态方法区;

所以非静态方法是放在方法区中的非静态方法区
回复 使用道具 举报
pray 高级黑马 2014-4-26 03:45:05
7#
让人奔走相告曰须阅读的好帖
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马