> For the complete documentation index, see [llms.txt](https://jon-xia.gitbook.io/workspace/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jon-xia.gitbook.io/workspace/gong-cheng-10/yu-yan-xiang-guan/java/jvm/jvm-nei-cun-jie-gou.md).

# 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. 数组既在栈空间分配数组名称， 又在堆空间分配数组实际的大小！
