Java内存分配

JVM内存结构由堆、栈、本地方法栈、方法区等部分组成,结构图如下所示:

JVM内存组成结构

1)堆

被所有程序共享,并且在虚拟机启动时创建。此内存区域作用是存放对象实例。根据Java虚拟机规定,Java堆可以处于物理上不连续的内存空间,只要逻辑上连续即可。所有通过new创建的对象的内存都在堆中分配,其大小可以通过-Xmx和-Xms来控制。堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由FromSpace和ToSpace组成,结构图如下所示:

JVM内存结构之堆

新生代。新建的对象都是用新生代分配内存,Eden空间不足的时候,会把存活的对象转移到Survivor中,新生代大小可以由-Xmn来控制,也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例。旧生代用于存放新生代中经过多次垃圾回收 (也即Minor GC)仍然存活的对象

2)栈

每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果。。虚拟内存栈就是我们经常讲的“栈”。其中局部变量表所需内存是在编译期完成分配。

3)本地方法栈

与虚拟机栈类似,区别在于虚拟机栈为虚拟机执行Java方法服务,而本地方法栈用于支持native方法的执行,存储了每个native方法调用的状态

4)方法区

        与堆相同,在各个线程间共享。作用是存储已被虚拟机加载的类信息,final类型的常量、属性和方法信息,静态变量,即时编译器编译后的代码等数据。运行时常量池是方法区的一部分。作用是存储编译期生成的各种字面量和符号引用。JVM用持久代(PermanetGeneration)来存放方法区可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。

JVM学习之:内存的分配以及回收

你可能感兴趣的:(java)