java内存分配之个人总结
2016-12-06 22:45
211 查看
1、把java文件编译成.class文件
2、jvm通过类加载器加载.class文件,由执行引擎来执行。
同时jvm会开辟一个空间来存储执行程序时需要的数据,这个空间称之为“运行时数据区”
①程序计数器
②java栈
③native栈
④堆
⑤方法区
内存占用的空间不会随着程序的运行而改变。所以这一块不会报内存异常。
程序方法的调用与结束,对应的就是入栈和出栈的过程。
线程执行的方法对应的栈帧总是在栈顶。
由于每调用一个方法都会创建一个栈帧,对已在程序中执行递归,是很容易产生栈内存溢出异常。
内存泄露:每次new出来的对象长时间没有使用,又没有释放掉内存,一直占着不放,导致内存不够。
内存溢出:程序向jvm申请内存,不够。
我自己理解为:这个栈是jvm和操作系统打交道的。
我们举个例子:
其中list是引用对象变量,是保存栈中,new ArrayList这个对象实例是保存在堆中的。
而list.add(map)中的map对象的实例是保存在堆中。
这个区是线程共享的。该常量池除了能加载Class文件中的常量池的常量,而且在运行时也能动态加载。常见的是加载通过String.intend()方法得到的值。
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()方法得到的值。
相关文章推荐
- C/C++程序到内存分配个人总结
- [深入理解JAVA虚拟机]读后个人总结二之JAVA内存区域
- C/C++程序到内存分配个人总结
- C/C++程序到内存分配个人总结
- JAVA内存分配总结
- MY 总结:Java 内存分配,栈、堆。。。及相关问题解决
- java 字符串内存分配的分析与总结(推荐)
- 深入理解Java虚拟机JVM高级特性与最佳实践阅读总结——第三章垃圾收集器与内存分配策略
- 黑马程序员--02.Java语言基础--03.堆内存和栈内存的区别【个人总结】
- C/C++程序到内存分配个人总结
- C/C++程序到内存分配个人总结
- java.lang.OutOfMemoryError: Java heap space + myeclipse中分配tomcat启动时所占内存大小
- java运行时设置分配内存大小,及tomcat启动时的所分配内存大小
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- java 编程思想笔记之this关键字(包括一些对方法在内存中的分配的解析) 推荐
- Java 内存分配及String类型详解
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- 内存分配方式总结
- java内存分配问题
- java集合类set个人总结