深入理解Java虚拟机JVM
JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境.
1.创建JVM装载环境和配置
2.装载JVM.dll
3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例
4.调用JNIEnv实例装载并处理class类。
堆、栈、方法
栈是运行时的单位,而堆是存储的单位。
栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;
堆解决的是数据存储的问题,即数据怎么放、放在哪儿。
在Java中一个线程就会相应有一个线程栈与之对应,这点很容易理解,因为不同的线程执行逻辑有所不同因此需要一个独立的线程栈。
而堆则是所有线程共享的。栈因为是运行单位,因此里面存储的信息都是跟当线程(或程序)相关信息的。
包括局部变量、程序运行状态、方法返回值等等;而堆只负责存储对象信息。
堆中存的是对象。栈中存的是基本数据类型和堆中对象的引用。
堆和栈中,栈是程序运行最根本的东西。程序运行可以没有堆,但是不能没有栈。而堆是为栈进行数据存储服务,说白了堆就是一块共享的内存。
不过,正是因为堆和栈的分离的思想,才使得Java的垃圾回收成为可能。
Java中,栈的大小通过-Xss来设置,当栈中存储数据比较多时,需要适当调大这个值,否则会出现java.lang.StackOverflowError异常。
常见的出现这个异常的是无法返回的递归,因为此时栈中保存的信息都是方法返回的记录点。
其中:
1.堆:用于存储数据
2.栈:用于解决程序的运行问题
3.方法区:辅助堆栈的一块永久区,解决栈堆信息的产生,此为先决条件。
如图:当创建一个新对象,User类的信息开始都存放在方法区。当User类实例化后,类信息被存储到java堆中的一块内存,使用时,都是使用栈中User对象的引用。
java堆完全自动化管理,通过垃圾回收机制,垃圾对象自动清理,无需显示地释放。
其中:
1.java对有许多不同结构,最常见的就是将整个队分为新生代和老年代。
2.新生代分为eden区、s0区(或from区)、s1区(或to区),s0与s1大小相等且可互换。
3.eden:伊甸园:java对象刚new出来时,这个实例化对象是放在eden区的,经过一系列操作后,执行gc,对象被分配到s0区或者s1区(不可能既存放在s0也存放在s1 区),最后进入老年代。
4.为什么会分为s0和s1区呢?
因为新生代产生对象太频繁,当有一大堆对象同时进行gc操作时(其中有源源不断的对象产生),其中有部分可能会进入老年区,有部分可能还存活,虚拟机 操作就将存活的那部分复制到另一块区(s0或者s1),当前所在的区(s0或者s1)则执行truncat摧毁,也就是将剩余未存活的一次性进入老年区,也就是清理空间。
http://www.cnblogs.com/cailijia52o/p/9096239.html
http://www.cnblogs.com/stateis0/category/1206894.html