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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周兴中 中级黑马   /  2012-6-22 23:36  /  2239 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 周兴中 于 2012-6-25 21:53 编辑
  1. public class test1 {
  2. static int x=2,y=1;
  3. public static void show(){
  4.   System.out.println(x+".."+y);
  5. }
  6. public static void main(String[] args){
  7.   int x = 3;
  8.   int y = 4;
  9.   show();
  10.   System.out.println(x+".."+y);
  11. }
  12. }
复制代码
请教大虾:以上代码
1.show方法中x,y在什么时候进入内存,进入内存的哪块区域,什么时候释放?
2.show方法在什么时候进入内存,进入内存的哪块区域,什么时候释放?
3.main方法中x,y在什么时候进入内存,进入内存的哪块区域,什么时候释放?
4.main方法在什么时候进入内存,进入内存的哪块区域,什么时候释放?

我很想把java内存机制弄透彻,最好能说明这段代码从开始执行到结束java是如何在内存中进行存储及释放的.

8 个回复

倒序浏览
{:soso_e149:}讲解内存的视频是哪个?我没挨着看……谁能告诉我下
回复 使用道具 举报
第3天第17个视频有说到栈内存和堆内存,只是我觉得还不是特别明白.
回复 使用道具 举报
java将内存分成四个区域:
栈内存:存储的是对象的名称,实际上时对象对堆内存的引用地址
堆内存:对象的特有属性,即对象的变量
全局代码区:保存所有的方法
全局数据区:保存所有的static属性

show()方法因为是static修饰的所以类一加载就已经进内存了,保存在代码区中, static int x,y也因为是static修饰,随着类的加载就进内存了,变量保存在全局数据区中,也叫静态区,生命周期随着类的加载而存在,随了类的结束而释放,剩下的方法都保存在方法区,另外main函数也是static修饰的,所以也随着类的加载就进内存了,但main函数中的x,y是局部变量,存在栈内存中,随着main函数的结束而释放。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
第一:show()方法中的x,y 是属于类的静态成员变量,随着类的加载 存放在不同于 堆和栈的一个 方法区,也是全局数据区中。随着类的消失而消失
第二:show()方法同样是静态方法,和第一中的静态成员变量一样。
第三:main()中的x y,是局部变量。局部变量存储在 栈 内存中,随着所属方法的加载而存在,消失而消失。
第四:main(),方法也是存放在方法区中的,不过会在栈内存中创建一个 指向。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
毕老师的视频说是划分了5个区域,分别是栈内存,堆内存,方法区,本地方法区,寄存器;和你说的那四个是什么样的对应关系?
回复 使用道具 举报
位雪 中级黑马 2012-6-23 00:33:51
7#
栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放
堆内存:数组和对象,通过new建立的实体都存放在堆内存中,每一个实体都有内存地址值,实体中的变量都有默认初始化值,实体不再被使用,会在不确定的时间内被垃圾回收器回收。
static用于修饰成员变量和成员函数,随着类的加载而加载
show()方法因为是static修饰的所以类一加载就已经进内存了,保存在代码区中, static int x,y也因为是static修饰,随着类的加载就进内存了,变量保存在全局数据区中,也叫静态区,生命周期随着类的加载而存在,随了类的结束而释放,剩下的方法都保存在方法区,另外main函数也是static修饰的,所以也随着类的加载就进内存了,但main函数中的x,y是局部变量,存在栈内存中,随着main函数的结束而释放。
回复 使用道具 举报
耿鑫 中级黑马 2012-6-23 00:37:53
8#
先要明确内存分为哪几块,有代码区,全局数据区,栈区,堆区
首先JVM先把类加载进来,之后堆内存中就有了Test类的Class类对象
然后静态的属性x,y被加载进来 ,放到全局数据区并初始化为x=2,y=1;
main方法执行,定义了两个局部变量x,y,所以会在栈内存中分配两个空间
分别放置xy并初始化为3和4,接下来调用show方法,然后打印,因为show方法中没有
定义局部变量x,y所以show中的System.out.println(x + ".." + y);中x和y是全局数据区
的x,y也就是两个静态的全局变量x,y。然后又执行一个System.out.println(x + ".." + y);
这里的x,y指的就是main方法中的局部变量x,y。之后main方法执行完毕,局部变量被释放,
等待垃圾回收机制回收。全局变量和类要等垃圾回收器确定不存在对类该对象的更多引用时,才会
回收释放,具体可以参考Object类的finalize()方法说明

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 赞一个!

查看全部评分

回复 使用道具 举报
耿鑫 发表于 2012-6-23 00:37
先要明确内存分为哪几块,有代码区,全局数据区,栈区,堆区
首先JVM先把类加载进来,之后堆内存中就有了 ...

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