黑马程序员技术交流社区

标题: 内存分配问题 [打印本页]

作者: lyssenlove    时间: 2014-7-6 13:21
标题: 内存分配问题
java内存管理中分为堆和栈两块,堆是存放new出来的对象,栈是存放局部方法中的局部变量,那个对于静态的类以及静态的熟悉和方法,内存是如何管理的?
作者: 自闭宅男    时间: 2014-7-6 17:18
而静态方法无此隐含参数,因此也不需要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中,所以具有了全局属性。
作者: lyssenlove    时间: 2014-7-6 17:57
自闭宅男 发表于 2014-7-6 17:18
而静态方法无此隐含参数,因此也不需要new对象,只要class文件被ClassLoader load进入JVM的stack,该静态方 ...

也就是说静态的类或者方法独占一块内存,并不与heap与stack打交道。。

作者: a6511631    时间: 2014-7-6 18:37
静态的不是放在栈里面吗
作者: 龙泉长空    时间: 2014-7-6 19:18
内存中,还有个叫方法区的吧?
作者: 威猛的小熊    时间: 2014-7-6 19:28
静态的东西放在data seg区。。。。。
作者: alexsoon    时间: 2014-7-6 19:54
在方法区里面,耐下心思往下看就知道了
作者: Adjin    时间: 2014-7-7 16:38
存在方法区 ,当讲到static这个关键字的时候视频会详细讲到
作者: 霜林醉zhx    时间: 2014-7-9 00:26
静态的放方法区中
作者: 韩天雷    时间: 2014-7-9 01:12
学习了
~~~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2