JVM中堆空间划分、参数设置

本文介绍了Java虚拟机(JVM)堆空间的分区概念,包括新生代、老年代和永久代,并详细解释了如何通过-Xms、-Xmx等参数调整堆空间大小。此外还探讨了新生代内部Eden区和幸存区的作用及其与垃圾收集机制的关系。

上图中,刻画了Java程序运行时的堆空间,可以简述成如下2条

1.JVM中堆空间可以分成三个大区,新生代、老年代、永久代

2.新生代可以划分为三个区,Eden区,两个幸存区

在JVM运行时,可以通过配置以下参数改变整个JVM堆的配置比例

1.JVM运行时堆的大小

  -Xms堆的最小值

  -Xmx堆空间的最大值

2.新生代堆空间大小调整

  -XX:NewSize新生代的最小值

  -XX:MaxNewSize新生代的最大值

  -XX:NewRatio设置新生代与老年代在堆空间的大小

  -XX:SurvivorRatio新生代中Eden所占区域的大小

3.永久代大小调整

  -XX:MaxPermSize

4.其他

   -XX:MaxTenuringThreshold,设置将新生代对象转到老年代时需要经过多少次垃圾回收,但是仍然没有被回收
在上面的配置中,老年代所占空间的大小是由-XX:SurvivorRatio这个参数进行配置的,看完了上面的JVM堆空间分配图,可能会奇怪,为啥新生代空间要划分为三个区Eden及两个Survivor区?有何用意?为什么要这么分?要理解这个问题,就得理解一下JVM的垃圾收集机制(复制算法也叫copy算法)

### JVM 内存结构 JVM(Heap)是 Java 虚拟机中最重要的内存区域之一,主要用于存储对象实例和数组。它是线程共享的,在 JVM 启动时创建,并贯穿整个应用程序的生命周期[^3]。 #### 1. **的特点** - **线程共享**:是所有线程共同使用的内存区域,区别于线程私有的栈和其他区域。 - **垃圾回收主要场所**:是垃圾收集器工作的核心区域,负责管理对象的生命周期以及释放不再使用的内存。 - **逻辑连续性**:尽管物理上可能不连续,但从逻辑上看,是一个连续的内存空间。 - **内存溢出风险**:如果内存耗尽且无法扩展,则会触发 `OutOfMemoryError` 异常。 #### 2. **的分代模型** 为了更有效地管理内存并提升垃圾回收效率,JVM分为多个子区域: ##### (1) 新生代(Young Generation) 新生代是用来存放新创建的对象的空间。大多数情况下,对象会在新生代中分配。它进一步划分为三个部分: - Eden 区:新对象通常在此区分配。 - Survivor0 和 Survivor1 区:用于存放经过一次 Minor GC 后仍然存活的对象。 Minor GC 是针对新生代的垃圾回收过程,频率较高。在这个过程中,Eden 区和其中一个 Survivor 区会被清理,存活下来的对象会被移动到另一个 Survivor 区或晋升至老年代。 ##### (2) 老年代(Old Generation / Tenured Generation) 老年代用来存放那些经历了多次 Minor GC 并依然存活的对象。Major GC 或 Full GC 主要作用于此区域,其执行成本相对更高,因此发生次数较少。 ##### (3) 永久代/元空间(Permanent Generation/Metaspace) 永久代曾用于存储类的元数据、静态变量等信息;然而自 JDK 8 开始,这部分功能已被移除,取而代之的是 Metaspace(元空间),位于本地内存而非内。 --- ### JVM 内存配置 合理的内存配置能够显著改善应用性能与稳定性。以下是几个常用的 JVM 参数及其含义: #### 1. `-Xms<size>` 和 `-Xmx<size>` 这两个参数分别定义了内存的初始大小和最大大小。建议将两者设为相同值以减少运行期间动态调整带来的开销。例如: ```bash java -Xms512m -Xmx512m MyApplication ``` #### 2. `-Xmn<size>` 该参数指定新生代的大小。适当增大新生代比例有助于降低 Major GC 频率,但需注意总大小限制。例如: ```bash java -Xmn128m MyApplication ``` #### 3. `-XX:NewRatio=<value>` 此选项控制新生代与老年代的比例,默认值通常是 2 表示新生代占整体的三分之一。可以通过修改这个比率来间接影响各代大小。 #### 4. `-XX:+UseG1GC`, `-XX:+UseParallelGC`, etc. 不同的垃圾收集算法会对布局产生一定影响。选择合适的 GC 策略也是优化的一部分。比如 G1 GC 更适合大内存场景下的低延迟需求。 --- ### 总结 深入理解 JVM 内存的工作原理及如何正确配置相关参数,可以帮助开发人员构建更加高效的 Java 应用程序。通过实践不断调整这些设置,最终达到最佳性能表现[^1][^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值