您的位置:首页 > 编程语言 > Java开发

java内存分配之个人总结

2016-12-06 22:45 211 查看
1、把java文件编译成.class文件

2、jvm通过类加载器加载.class文件,由执行引擎来执行。

同时jvm会开辟一个空间来存储执行程序时需要的数据,这个空间称之为“运行时数据区”

运行时数据区

可以分为以下几个区:

①程序计数器

②java栈

③native栈

④堆

⑤方法区

程序计数器

里面存储的是下一个要执行的指令。其存放在栈内存中。在c语言中,其存放在寄存器中。

内存占用的空间不会随着程序的运行而改变。所以这一块不会报内存异常。

java栈

java栈是由一个个栈帧组成。线程每调用一个方法都会在栈中创建与之对应的栈帧。栈帧中存储:局部变量表、方法返回地址、指向该类常量池的引用。

程序方法的调用与结束,对应的就是入栈和出栈的过程。

线程执行的方法对应的栈帧总是在栈顶。

由于每调用一个方法都会创建一个栈帧,对已在程序中执行递归,是很容易产生栈内存溢出异常。

内存泄露:每次new出来的对象长时间没有使用,又没有释放掉内存,一直占着不放,导致内存不够。

内存溢出:程序向jvm申请内存,不够。

native栈

native栈和java栈是类似的,只不过,java栈是为java服务的。而native栈是为native服务的。

我自己理解为:这个栈是jvm和操作系统打交道的。

堆中存放的都是对象的实例和数组。也就是new出来的对象,都存在这里。

我们举个例子:

List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object>> map = new HashMap<String, Object()>>();
list.add(map);


其中list是引用对象变量,是保存栈中,new ArrayList这个对象实例是保存在堆中的。

而list.add(map)中的map对象的实例是保存在堆中。

方法区

这里保存的是类的信息、字段信息。而且它还有个常量池。里面保存都是类的常量和字符。

这个区是线程共享的。该常量池除了能加载Class文件中的常量池的常量,而且在运行时也能动态加载。常见的是加载通过String.intend()方法得到的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: