JVM桟:
通过-Xss来指定桟内存的大小,JVM桟是线程私有的,伴随线程的生命周期,桟内存中存放当前线程中局部基本类型(java中定义的八种基本类型:
boolean、char、byte、short、int、long、float、double),非基本类型的对象在JVM栈上仅存放一个指向堆上的地址,因此Java中基本类型的
变量是值传递,而非基本类型的变量是引用传递。
当JVM栈的空间不足时,会抛出StackOverflowError的错误
JVM堆(Heap):
JVM用来存储对象实例以及数组值得区域,java中通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC回收,Heap在32位系统上最
大为2G,64位系统上没有限制,其大小通过-Xms(最小Heap内存)和-Xmx(最大Heap内存)控制,默认当空余堆内存小于40%时,JVM会增大Heap的大小到
-Xmx指定的大小,可通过-XX:MinHeapFreeRatio=来指定这个比例,当空余堆内存大于70%时,JVM会将Heap的大小往-Xms指定的大小调整,
可通过-XX:MaxHeapFreeRatio=来指定这个比例,但对于运行系统而言,为了避免频繁的Heap Size的大小,通常都会将-Xms和-Xmx的值设成一样,因此
这两个用于调整比例的参数通常是没用的。
当堆中需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。
方法区域(MethodArea):
方法区域存放了所加载的类的信息(名称,修饰符等),类中的静态变量,类中定义为final类型的常量,类中的Field信息,类中的方法信息,当通过
Class对象中的getName,isInterface等方法来获取信息时,这些数据都来源于方法域
方法域也是全局共享的,在虚拟机启动时在一定的条件下会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息
在Sun jdk中这块区域对应的为PermanetGeneration,称为持久代,默认为64M,通过-XX:PermSize及-XX:MaxPermSize来指定其大小
运行时常量池(RuntimeConstant Pool)
类似C中的符号表,存放的为类中的固定的常量信息、方法和Field的引用信息等,其空间从方法区域中分配。类或接口的常量池在该类的class文件
被java虚拟机成功装载时分配。
本地方法堆栈(NativeMethod Stacks)
JVM采用本地方法堆栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。