黑马程序员技术交流社区
标题:
求助:关于类的成员方法在内存哪块区域的问题
[打印本页]
作者:
蔡增辉
时间:
2013-5-10 17:11
标题:
求助:关于类的成员方法在内存哪块区域的问题
本帖最后由 蔡增辉 于 2013-5-10 21:27 编辑
对于类中的成员方法所在的内存区域有点弄不明白,老毕的基础视频中,有提到两种情况,一种是在栈内存中,一种是在方法区中,这究竟是什么情况啊?
main.png
(8.29 KB, 下载次数: 0)
下载附件
2013-5-10 17:09 上传
方法区.PNG
(11.28 KB, 下载次数: 0)
下载附件
2013-5-10 17:10 上传
作者:
jingzhouheima
时间:
2013-5-10 18:05
楼主可以看下下面的代码在想想。。
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。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"优化成一块
}
作者:
白磊
时间:
2013-5-10 18:09
数据往内存中存放时,内存会把它们分类,存入到内存中的不同地方。
所有的基本数据类型全部是存储在栈里面,速度快。
一个对象,他的实体是存储在堆里面的,而他的引用是存储在栈里面。
就对象本身而言,他的所有属性的值如果不是单例或者静态的,就是存储在堆里面的。一个类的所有对象的属性值都在堆里面并且占用不同的内存空间,而一个类的方法只在方法区里占一个地方,所有的对象指向同一个方法区。
作者:
李道福
时间:
2013-5-10 18:10
方法区里存放的是类变量,就是被static修饰的成员变量;这个变量是被类对象所共享的;
栈中存放的是方法中的变量,例如有个方法add()中有变量int i;那这个就是是存放在栈中的,方法在栈中退出后这个变量就释放不存在了
作者:
飞鸟青崖
时间:
2013-5-10 19:07
当调用到某个方法的时候,栈内存中会开辟空间,用来存放方法中的变量的,在运行结束之后就会自己释放。而方法还是存放在方法区中。
作者:
黑马-雷钊
时间:
2013-5-10 19:07
你好。java中在内存分为了4个区。一个是栈。这个区专门用于存储方法。但也不能完全说存储。因为方法执行完了方法在栈内存中就自动被释放了。用专业的话说叫弹栈。其实就是调用方法时方法就到栈里面来。包括方法里面定义的变量啊什么的。方法执行完了就被弹出去。第二个内存区是堆。这个主要用于存储定义在“类里面”和“方法外面”的数据。比如全局变量。常量。数组。包括创建对象的实体……。这些数据的生命周期长一点。因为它们除非不再被调用了。才会被垃圾回收机制不定时的清扫。至于怎么不被调用了就有很多种情况了。不知道你懂不懂。假如不懂可以回复我。我会写代码给你解释。不过栈和堆你只要知道方法是在栈里面。其它除了局部变量在栈里面。大部分都在堆里面就行了。第三个是方法区。被static修饰的成员都会在方法区里面出现。他们都是随着类的加载而加载。就是类进内存它们也跟着一起进内存。但进的是方法区。方法区中所有数据都是可以被共享的。而且方法区中的所有成员都是可以用类名点来调用的。第四个用的就不多了。是常量池。字符串在被定义的时候就会先去常量池看看。假如没有一模一样的字符串就开辟空间存放。假如有就不开辟空间了。直接用开辟好了的。第四个你可以暂且不用管。主要还是把栈和堆弄清楚。。希望你能看完它。。。
作者:
殇_心。
时间:
2013-5-10 19:57
如果问题已解决,请及时修改分类,否则继续提问,谢谢合作!
作者:
小臣
时间:
2013-5-10 20:14
送你老师给我们画的内存图好好研究下
作者:
rosv
时间:
2013-5-10 22:03
笼统的说内存分为方法区、堆、栈、所有方法都在方法区,引用实例变量由new创建对象,构造函数初始化后驻留在堆内存中,实例基本类型变量驻留在栈中。。。
作者:
Super_Class
时间:
2013-5-11 00:12
内存的划分:
|--寄存器
|--本地方法区
|--方法区
|--栈内存
存储的都是局部变量
|--堆内存
存储的是对象(数组也是Object对象)
|——堆里边的变量在创建的时候都会默认初始化
boolean初始化为false
int类型初始化为0
|——堆内存中的对象使用过, 就会变成垃圾。
JVM的垃圾回收机制会不定时启动,回收堆内存的垃圾
|——数组角标越界,编译不会出错,运行出错。
当引用没有任何实体指向时,会发生空指针异常。
对象调用成员方法的时候,也是需要进栈的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2