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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 蔡增辉 于 2013-5-10 21:27 编辑

对于类中的成员方法所在的内存区域有点弄不明白,老毕的基础视频中,有提到两种情况,一种是在栈内存中,一种是在方法区中,这究竟是什么情况啊?

main.png (8.29 KB, 下载次数: 0)

main.png

方法区.PNG (11.28 KB, 下载次数: 0)

方法区.PNG

评分

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

查看全部评分

10 个回复

倒序浏览
楼主可以看下下面的代码在想想。。
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。int a = 0; //全局初始化区
自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
char *p1; //全局未初始化区  
void main()  
{  
int b; //栈  
char s[] = "abc"; //栈  
char *p2; //栈  
char *p3 = "123456"; //123456{post.content}在常量区,p3在栈上  
static int c = 0; //全局(静态)初始化区  
p1 = (char *)malloc(10); //分配得来得10字节的区域在堆区  
p2 = (char *)malloc(20); //分配得来得20字节的区域在堆区  
strcpy(p1, "123456");  
//123456{post.content}放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块  
}

评分

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

查看全部评分

回复 使用道具 举报
数据往内存中存放时,内存会把它们分类,存入到内存中的不同地方。
所有的基本数据类型全部是存储在栈里面,速度快。
一个对象,他的实体是存储在堆里面的,而他的引用是存储在栈里面。
就对象本身而言,他的所有属性的值如果不是单例或者静态的,就是存储在堆里面的。一个类的所有对象的属性值都在堆里面并且占用不同的内存空间,而一个类的方法只在方法区里占一个地方,所有的对象指向同一个方法区。

评分

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

查看全部评分

回复 使用道具 举报
方法区里存放的是类变量,就是被static修饰的成员变量;这个变量是被类对象所共享的;
栈中存放的是方法中的变量,例如有个方法add()中有变量int i;那这个就是是存放在栈中的,方法在栈中退出后这个变量就释放不存在了
回复 使用道具 举报
当调用到某个方法的时候,栈内存中会开辟空间,用来存放方法中的变量的,在运行结束之后就会自己释放。而方法还是存放在方法区中。
回复 使用道具 举报
你好。java中在内存分为了4个区。一个是栈。这个区专门用于存储方法。但也不能完全说存储。因为方法执行完了方法在栈内存中就自动被释放了。用专业的话说叫弹栈。其实就是调用方法时方法就到栈里面来。包括方法里面定义的变量啊什么的。方法执行完了就被弹出去。第二个内存区是堆。这个主要用于存储定义在“类里面”和“方法外面”的数据。比如全局变量。常量。数组。包括创建对象的实体……。这些数据的生命周期长一点。因为它们除非不再被调用了。才会被垃圾回收机制不定时的清扫。至于怎么不被调用了就有很多种情况了。不知道你懂不懂。假如不懂可以回复我。我会写代码给你解释。不过栈和堆你只要知道方法是在栈里面。其它除了局部变量在栈里面。大部分都在堆里面就行了。第三个是方法区。被static修饰的成员都会在方法区里面出现。他们都是随着类的加载而加载。就是类进内存它们也跟着一起进内存。但进的是方法区。方法区中所有数据都是可以被共享的。而且方法区中的所有成员都是可以用类名点来调用的。第四个用的就不多了。是常量池。字符串在被定义的时候就会先去常量池看看。假如没有一模一样的字符串就开辟空间存放。假如有就不开辟空间了。直接用开辟好了的。第四个你可以暂且不用管。主要还是把栈和堆弄清楚。。希望你能看完它。。。

评分

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

查看全部评分

回复 使用道具 举报
如果问题已解决,请及时修改分类,否则继续提问,谢谢合作!
回复 使用道具 举报
小臣 中级黑马 2013-5-10 20:14:43
8#
送你老师给我们画的内存图好好研究下
回复 使用道具 举报
rosv 中级黑马 2013-5-10 22:03:08
9#
笼统的说内存分为方法区、堆、栈、所有方法都在方法区,引用实例变量由new创建对象,构造函数初始化后驻留在堆内存中,实例基本类型变量驻留在栈中。。。
回复 使用道具 举报
                        
                        内存的划分:
                                |--寄存器
                                |--本地方法区
                                |--方法区
                                |--栈内存
                                        存储的都是局部变量
                                |--堆内存
                                        存储的是对象(数组也是Object对象)        
                                        |——堆里边的变量在创建的时候都会默认初始化
                                                boolean初始化为false
                                                int类型初始化为0
                                        |——堆内存中的对象使用过,        就会变成垃圾。
                                        JVM的垃圾回收机制会不定时启动,回收堆内存的垃圾
                                        |——数组角标越界,编译不会出错,运行出错。
                                                当引用没有任何实体指向时,会发生空指针异常。
               

对象调用成员方法的时候,也是需要进栈的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马