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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://jon-xia.gitbook.io/workspace/gong-cheng-10/yu-yan-xiang-guan/java/jvm/jvm-nei-cun-jie-gou.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
