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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王立浩 中级黑马   /  2013-1-22 01:42  /  1710 人查看  /  3 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

看过毕老师视频的童鞋都清楚,他讲课时提到过java内存的结构分为5种,虽然没有看后边,但还是忍不住查了下,满足自己的好奇心,同时拿出来共享


其实应该是6种的,虽然直接内存不是java虚拟机规范中定义的内存但是这部分内存会被频繁的使用,既然叫内存,那么肯定也会占去物理内存,所以在一些虚拟机参数配置时应该要考虑到否则可能就会挂掉了(其实这边专业术语是抛出OutOfMemoryError异常。。。

分析另外5种
1、栈  这部分内存和方法相关连,方法执行时,创建一个栈帧压入栈中(遵循先进后出的原则)
栈帧包含的信息有局部变量表、操作栈、动态链接、方法出口等信息 ------这边就理解个局部变量表,方法运行期间局部变量表大小不会改变
另外需要注意的该空间是线程私有的,我的理解是体现在局部变量上,只有自己的线程可以访问局部变量表
2、堆  是所有线程共享的,在虚拟机启动时创建,存储的是多有对象的实例以及数组  
其中堆还可以继续分配但方法不唯一,可是其主要目的不变,就是为了更好的内存回收和更快的内存分配,因为我们知道堆内存中存在着垃圾内存回收问题
3、方法区 也是所有线程共享的 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
具体一点:
*类的基本信息---包括
每个类的全限定名
每个类的直接超类的全限定名
该类是类还是接口
访问修饰符
直接超接口的全限定名的有序列表
*装载类的详细信息----包括
运行时常量池:存放每一个数据类型相对应的常量,可以以数组形式访问
字段信息:类中每个字段的信息
方法信息:类中声明的每一个方法的信息,这边其实就是一个方法帧,前面所说的方法运行时压栈帧,压的就是这个
静态变量:静态区存放的就是静态变量和静态块
到类Classloader的引用:到该类的类装载器的引用
到类class的引用:虚拟机为每一个被装载的类型创建一个class的实例,用来代表这个被装载的类(反射的基础)

4、本地方法栈:与栈类似,只不过服务对象不同而已
5、程序计数器:其实就是指针,指着当前线程需要执行指令的地址是线程私有的


浅显理解--不符之处还望指正。。。


评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

3 个回复

倒序浏览
我觉得说对内存明确的分几个区这种说法是抽象的,毕竟内存里面只是存储了一些数据,也没有个什么东西长的像堆,或者长的像栈。只能说按照对数据的处理方式不同分为几种不同的存储方式,比如说对象存储在堆内存中,也只能说在处理对象类型数据时遵循了某种规则,而符合这种处理规则的数据都应该在堆内存中。。。
回复 使用道具 举报
学习了......
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马