JAVA内存区域
2016-07-07 本文已影响21人
IAmWhoAmI
Paste_Image.png
运行时数据区
要讨论的就是:运行时数据区。一般,我们叫它java内存。
关于这个,普遍的图示是这样的:
Paste_Image.png但是我觉得,应该画成:
Paste_Image.png-
程序计数器:就是一个记录当前程序运行到哪一行
占用空间小 (每次别人画那么大,很容易误会) -
方法区和堆
#方法区
存储了
* 每个类的信息(包括类的名称、方法信息、字段信息)
* 静态变量
* 常量
* 编译器编译后的代码等
#堆
Java中的堆是用来存储对象本身的以及数组(当然,数组引用是存放在Java栈中的)。
堆是被所有线程共享的,在JVM中只有一个堆。
垃圾回收机制,就是搞这个的。
#个人观点
堆和方法区,其实都是真正存放了信息的内存区域。
真正存放信息的意思是,存放了有内容的数据,而不是指针或是引用等等。
#差别是:
方法区是给执行引擎用的。
(额,也可能不是执行引擎,可能是虚拟机自己用,
总之,是整个java的本身运行机制需要用到的信息,存在方法区。)
而堆中的数据是给线程用的。
(也就是我们业务逻辑关注的那部分数据。)
- 本地方法栈和java虚拟机栈
#java虚拟机栈
就是我们常说的栈。用于存储,函数调用,而导致需要存储的内容。
简单举个例子:
函数A(){
函数B();
}
从函数A 跳到函数B,
等函数B运行完成,需要回到函数B,
那么怎么回去,就是从栈头pop信息出来。
这个信息包括:各种数据信息:esp,dsp,pc 等等一系列的信息。
都是由于函数调用导致的信息。具体要看看操作系统。
#本地方法栈
本地方法栈与Java栈的作用和原理非常相似。
区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Method)服务的。
在JVM规范中,并没有对本地方法栈的具体实现方法以及数据结构作强制规定,虚拟机可以自由实现它。
在HotSopt虚拟机中直接就把本地方法栈和Java栈合二为一。