JVM内存结构

Java栈

JVM进程实际运行的是线程,每个线程创建时JVM都会为它创建一个堆栈,这个Java栈中又会含有多个栈帧,栈帧中保存着方法的状态,,包括方法的参数、方法的局部变量、方法的返回值以及运算的中间结果等。

通过-Xss 设置每个线程的堆栈大小

Java堆

Java堆是用来存储Java对象的内存区域,同时也是GC的主要工作区域,堆的大小在JVM启动时就一次性向操作系统申请完成

通过-Xmx -Xms -Xmn来规定Java堆的max、init、年轻代大小。

通过-XX:PermSize规定持久代内存大小

Java方法区

这个区域比较特殊,因为它占用了Java堆的空间,但是它的内容比较稳定,并不像堆中其他空间一样被GC频繁扫描回收,但也归GC管理。 包含运行时常量池,方法数据,方法体,构造函数,类中的专用方法。

Java 内存分配

  1. 基础数据类型直接在栈空间分配;

  2. 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收;

  3. 引用数据类型,需要用 new 来创建,既在栈空间分配一个地址空间,又在堆空间分配对象的类变量;

  4. 方法的引用参数,在栈空间分配一个地址空间,并指向堆空间的对象区,当方法调用完后从栈空间回收;

  5. 局部变量 new 出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆 空间区域等待 GC 回收;

  6. 方法调用时传入的实际参数,先在栈空间分配,在方法调用完成后从栈空间释放;

  7. 字符串常量在 DATA 区域分配 , this 在堆空间分配;

  8. 数组既在栈空间分配数组名称, 又在堆空间分配数组实际的大小!

Last updated