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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dapeng111 中级黑马   /  2014-1-17 16:06  /  1121 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 dapeng111 于 2014-1-19 19:35 编辑

问题一:栈,堆,方法区这三种内存存储方式,哪个是静态的,哪个是动态的?
问题二:分别存储的是哪种类型的数据?
问题三:还有其他的存储方式吗?

评分

参与人数 1技术分 +1 收起 理由
黄晓东 + 1

查看全部评分

5 个回复

倒序浏览
本帖最后由 xu6148152 于 2014-1-17 16:28 编辑

1方法区中分静态区和非静态区,堆内存是动态的,JVM的垃圾回收机制会回收这片区域中无用的内存
2栈:主函数运行的代码  堆:你用new分配的代码  方法区:方法。静态变量。
3好像还有寄存器的。
JVM 会把申请的内存从逻辑上划分为三个区域,即:方法区、堆与栈。
方法区:方法区默认最大容量为64M,Java虚拟机会将加载的java类存入方法区,保存类的结构(属性与方法),类静态成员等内容。
堆:默认最大容量为64M,堆存放对象持有的数据,同时保持对原类的引用。可以简单的理解为对象属性的值保存在堆中,对象调用的方法保存在方法区。
栈:栈默认最大容量为1M,在程序运行时,每当遇到方法调用时,Java虚拟机就会在栈中划分一块内存称为栈帧(Stack frame),栈帧中的内存供局部变量(包括基本类型与引用类型)使用,当方法调用结束后,Java虚拟机会收回此栈帧占用的内存。

评分

参与人数 1黑马币 +20 收起 理由
dapeng111 + 20 很给力!

查看全部评分

回复 使用道具 举报
堆区:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)   
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
栈区:
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。      
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
方法区:      
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。      
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

     
基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收。   引用数据类型,需要用new来创建,既在栈空间分配一个地址空间,又在堆空间分配对象的类变量 。 方法的引用参数,在栈空间分配一个地址空间,并指向堆空间的对象区,当方法调用完成后从栈空间回收。局部变量 new 出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆空间区域等待GC回收。 方法调用时传入的 literal 参数,先在栈空间分配,在方法调用完成后从栈空间分配。字符串常量在 DATA 区域分配 ,this 在堆空间分配 。数组既在栈空间分配数组名称, 又在堆空间分配数组实际的大小!   

哦 对了,补充一下static在DATA区域分配。   
  

评分

参与人数 1黑马币 +20 收起 理由
dapeng111 + 20 很给力!

查看全部评分

回复 使用道具 举报
楼上的回答都好全面。。。汗颜
回复 使用道具 举报
xu6148152 发表于 2014-1-17 16:20
1方法区中分静态区和非静态区,堆内存是动态的,JVM的垃圾回收机制会回收这片区域中无用的内存
2栈:主函数 ...

主函数的代码不是也在方法区吗?还有栈中的局部变量不是自动回收的,堆中的才是虚拟机回收的?还有点疑问,谢谢!
回复 使用道具 举报
dapeng111 发表于 2014-1-19 10:00
主函数的代码不是也在方法区吗?还有栈中的局部变量不是自动回收的,堆中的才是虚拟机回收的?还有点疑问 ...

栈里是当前运行的代码。当前运行的代码肯定是main()方法。栈中的局部变量也是自动回收,但是这些都是本来就是系统自动分配,自动回收,而堆需要手动分配,系统自动回收。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马