看过毕老师视频的童鞋都清楚,他讲课时提到过java内存的结构分为5种,虽然没有看后边,但还是忍不住查了下,满足自己的好奇心,同时拿出来共享
其实应该是6种的,虽然直接内存不是java虚拟机规范中定义的内存但是这部分内存会被频繁的使用,既然叫内存,那么肯定也会占去物理内存,所以在一些虚拟机参数配置时应该要考虑到否则可能就会挂掉了(其实这边专业术语是抛出OutOfMemoryError异常。。。)
分析另外5种
1、栈 这部分内存和方法相关连,方法执行时,创建一个栈帧压入栈中(遵循先进后出的原则)
栈帧包含的信息有局部变量表、操作栈、动态链接、方法出口等信息 ------这边就理解个局部变量表,方法运行期间局部变量表大小不会改变
另外需要注意的该空间是线程私有的,我的理解是体现在局部变量上,只有自己的线程可以访问局部变量表
2、堆 是所有线程共享的,在虚拟机启动时创建,存储的是多有对象的实例以及数组
其中堆还可以继续分配但方法不唯一,可是其主要目的不变,就是为了更好的内存回收和更快的内存分配,因为我们知道堆内存中存在着垃圾内存回收问题
3、方法区 也是所有线程共享的 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
具体一点:
*类的基本信息---包括
每个类的全限定名
每个类的直接超类的全限定名
该类是类还是接口
访问修饰符
直接超接口的全限定名的有序列表
*装载类的详细信息----包括
运行时常量池:存放每一个数据类型相对应的常量,可以以数组形式访问
字段信息:类中每个字段的信息
方法信息:类中声明的每一个方法的信息,这边其实就是一个方法帧,前面所说的方法运行时压栈帧,压的就是这个
静态变量:静态区存放的就是静态变量和静态块
到类Classloader的引用:到该类的类装载器的引用
到类class的引用:虚拟机为每一个被装载的类型创建一个class的实例,用来代表这个被装载的类(反射的基础)
4、本地方法栈:与栈类似,只不过服务对象不同而已
5、程序计数器:其实就是指针,指着当前线程需要执行指令的地址是线程私有的
浅显理解--不符之处还望指正。。。
|