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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lyssenlove 中级黑马   /  2014-7-6 13:21  /  1399 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

java内存管理中分为堆和栈两块,堆是存放new出来的对象,栈是存放局部方法中的局部变量,那个对于静态的类以及静态的熟悉和方法,内存是如何管理的?

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

9 个回复

倒序浏览
而静态方法无此隐含参数,因此也不需要new对象,只要class文件被ClassLoader load进入JVM的stack,该静态方法即可被调用。 当然此时静态方法是存取不到heap 中的对象属性的。  总结一下该过程:当一个class文件被ClassLoader load进入JVM后,方法指令保存在stack中,此时heap区没有数据。 然后程序技术器开始执行指令,如果是静态方法,直接依次执行指令代码,当然此时指令代码是不能访问heap 数据区的; 如果是非静态方法,由于隐含参数没有值,会报错。因此在非静态方法执行前,要先new对象,在heap中分配数据, 并把stack中的地址指针交给非静态方法,这样程序技术器依次执行指令,而指令代码此时能够访问到heap数据区了。  再说一下静态属性和动态属性: 前面提到对象实例以及动态属性都是保存在heap 中的,而heap必须通过stack中的地址指针才能够被指令(类的方法)访问到。 因此可以推断出:静态属性是保存在stack中的(基本类型保存在stack中,对象类型地址保存在stack,值保存在heap 中), 而不同于动态属性保存在heap 中。正因为都是在stack中,而stack中指令和数据都是定长的,因此很容易算出偏移量, 也因此不管什么指令(类的方法),都可以访问到类的静态属性。也正因为静态属性被保存在stack中,所以具有了全局属性。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
自闭宅男 发表于 2014-7-6 17:18
而静态方法无此隐含参数,因此也不需要new对象,只要class文件被ClassLoader load进入JVM的stack,该静态方 ...

也就是说静态的类或者方法独占一块内存,并不与heap与stack打交道。。
回复 使用道具 举报
静态的不是放在栈里面吗
回复 使用道具 举报
内存中,还有个叫方法区的吧?
回复 使用道具 举报
静态的东西放在data seg区。。。。。
回复 使用道具 举报
在方法区里面,耐下心思往下看就知道了
回复 使用道具 举报
存在方法区 ,当讲到static这个关键字的时候视频会详细讲到
回复 使用道具 举报
静态的放方法区中
回复 使用道具 举报
学习了
~~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马