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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 城市儒侠 中级黑马   /  2013-12-15 18:00  /  1002 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我知道静态变量在内存中是在方法区。

那么静态方法在内存中是在哪?

静态方法里面定义的变量又是放在内存的什么位置?


评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

4 个回复

倒序浏览
静态方法也在方法区
main方法是静态方法,其中的变量在栈内存中
回复 使用道具 举报
方法都在方法区中     只有调用的时候才进栈       因为定义的方法体在方法区    静态方法里面定义的变量是 也在方法区中
回复 使用道具 举报
先分析一下非静态方法和静态方法的区别:
非静态方法有一个和静态方法很重大的不同:
非静态方法有一个隐含的传入参数,该参数是JVM给它的,和我们怎么写代码无关,
这个隐含的参数就是对象实例在stack中的地址指针。因此非静态方法(在stack中的指令代码)总是可以找到自己的专用数据(在heap 中的对象属性值)。
当然非静态方法也必须获得该隐含参数,因此非静态方法在调用前,必须先new一个对象实例,获得stack
中的地址指针,否则JVM将无法将隐含参数传给非静态方法。

而静态方法无此隐含参数,因此也不需要new对象,只要class文件被ClassLoader load进入JVM的stack,该静态方法即可被调用。
当然此时静态方法是存取不到heap 中的对象属性的。

总结一下该过程:当一个class文件被ClassLoader load进入JVM后,方法指令保存在stack中,此时heap区没有数据。
然后程序技术器开始执行指令,如果是静态方法,直接依次执行指令代码,当然此时指令代码是不能访问heap 数据区的;
如果是非静态方法,由于隐含参数没有值,会报错。因此在非静态方法执行前,要先new对象,在heap中分配数据,
并把stack中的地址指针交给非静态方法,这样程序技术器依次执行指令,而指令代码此时能够访问到heap数据区了

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
楼主您好,下面说一下我的理解:
        当运行某字节码文件时,操作系统就启动一个java进程,开启java虚拟机,并为该进程分配内存空间。被分配的内存空间大致可以分为这么几类:堆、栈、方法区,本地方法区,寄存器区等。之后该字节码文件被加载进了这片被分配内存的方法区中。您看,整个字节码文件都被加载进了方法区,字节码文件中的静态方法当然也在方法区了。我认为可以这么说,类中的方法都在类加载的时候存储在了方法区中。这是对楼主第一个问题的解答。
        第二个问题,当运行某类中静态方法时,在该静态方法中定义了变量,该变量属于局部变量,所以该变量存储在了栈内存中。另外,给出各类内存的作用:
                栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放。
                堆内存:数组和对象,通过new建立的实例都存放在堆内存中。
                方法区:静态成员、构造函数、常量池、线程池
                本地方法区:window系统占用
希望楼主可以理解,说的有什么不对的,欢迎批评指正。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马