堆内存参数如何设置?


程序员的公众号:源1024,获取更多资料,无加密无套路!

最近整理了一份大厂面试资料《史上最全大厂面试题》,Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等
获取方式: 关注公众号并回复 666 领取,更多内容持续奉上


堆内存:内存中最大的一块内存区域,也是被各个线程共享的内存区域,所有的对象实例(或复杂类型信息)都保存在堆内存中。

与栈之间的关系

对象做为引用类型是保存在堆内存中的,但是要通过保存在栈中的指针来访问。

对象可能包含属性和方法,而这些属性和方法中可能包含基本类型的变量。因此,堆内存中的一些变量在声明和调用过程中又会放到栈内存中进行执行。

参数设置:

  • -Xmx, 指定最大堆内存。 如 -Xmx4g. 这只是限制了 Heap 部分的最大值为4g。这个内存不包括栈内存,也不包括堆外使用的内存。
  • -Xms, 指定堆内存空间的初始大小。 如 -Xms4g。 而且指定的内存大小,并不是操作系统实际分配的初始值,而是GC先规划好,用到才分配。 专用服务器上需要保持 –Xms 和 –Xmx 一致,否则应用刚启动可能就有好几个 FullGC。当两者配置不一致时,堆内存扩容可能会导致性能抖动。
  • -Xmn, 等价于 -XX:NewSize,使用 G1 垃圾收集器 不应该 设置该选项,在其他的某些业务场景下可以设置。官方建议设置为 -Xmx 的 1/2 ~ 1/4.
  • -XX:MaxPermSize=size, 这是 JDK1.7 之前使用的。Java8 默认允许的Meta空间无限大,此参数无效。
  • -XX:MaxMetaspaceSize=size, Java8 默认不限制 Meta 空间, 一般不允许设置该选项。
  • -XX:MaxDirectMemorySize=size,系统可以使用的最大堆外内存,这个参数跟 -Dsun.nio.MaxDirectMemorySize 效果相同。
  • -Xss, 设置每个线程栈的字节数。 例如 -Xss1m 指定线程栈为 1MB

 系列文章索引

MyBatis的插件能在哪些地方进行拦截?

了解MyBatis的缓存机制吗

面试官:谈谈对volatile的理解

Spring中用到了哪些设计模式

面试官:说一下SQL的执行过程

线程池的工作原理


 

### JVM 堆内存与非堆内存大小设置方法及参数 #### 设置 JVM 堆内存大小 JVM堆内存主要用于存储 Java 对象实例,其大小可以在启动时通过命令行参数进行配置。常用的两个参数如下: - `-Xms`:指定初始堆内存大小。 - `-Xmx`:指定最大堆内存大小。 这两个参数决定了 JVM 启动时分配的最小堆内存以及运行过程中允许的最大堆内存[^3]。 例如,在启动应用程序时可以这样设置: ```bash java -Xms512m -Xmx2g MyApplication ``` 上述命令表示初始堆内存为 512MB,而最大堆内存为 2GB。 如果未显式设置这些参数,默认情况下,JVM 会根据操作系统和可用资源自动调整堆内存大小。然而,这种默认行为可能导致性能问题或 `OutOfMemoryError (OOM)` 错误发生[^2]。 --- #### 非堆内存(Metaspace 或 Direct Memory) 除了堆内存之外,JVM 还有其他类型的内存区域,统称为非堆内存。主要包括元数据区(Metaspace)和直接内存(Direct Memory)。 ##### Metaspace 大小设置 自 JDK 8 起,永久代(Permanent Generation)被移除并替换为元数据区(Metaspace),用于存储类的元信息。可以通过以下参数控制其大小: - `-XX:MetaspaceSize`:指定 Metaspace 初始大小。 - `-XX:MaxMetaspaceSize`:指定 Metaspace 最大大小。 例如: ```bash java -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m MyApplication ``` 如果不手动设置,Metaspace 默认不会触发垃圾回收机制,直到达到操作系统的限制。 ##### Direct Memory 大小设置 Direct Memory 是一种特殊的非堆内存,通常由 NIO 使用的 `DirectByteBuffer` 和 `Unsafe.allocateMemory()` 方法来管理。它的大小受以下参数影响: - `-XX:MaxDirectMemorySize`:指定 Direct Memory 的最大值。 例如: ```bash java -XX:MaxDirectMemorySize=128m MyApplication ``` 如果没有明确设置参数,则默认等于堆的最大值 (`-Xmx`)。需要注意的是,超出此限制可能会抛出 `OutOfMemoryError`[^1]。 --- #### 查看 JVM 内存使用情况 为了监控 JVM堆内存和非堆内存使用状况,可借助工具如 `jstat`, `jmap` 等。以下是具体方式: - **查看实时统计信息** 可以利用 `jstat` 工具观察堆内存的变化趋势: ```bash jstat -gc <PID> 1000 ``` - **生成堆转储文件** 如果怀疑存在内存泄漏问题,可通过 `jmap` 创建堆转储文件以便进一步分析: ```bash jmap -dump:live,format=b,file=heap.bin <PID> ``` 其中 `<PID>` 表示目标 Java 应用程序的进程 ID,可通过 `ps aux | grep java` 获取[^4]。 --- #### 总结 合理配置 JVM堆内存和非堆内存对于优化应用性能至关重要。堆内存主要依赖于 `-Xms` 和 `-Xmx` 参数;而非堆内存则涉及 Metaspace 和 Direct Memory 的独立调控。此外,定期检查内存状态有助于及时发现潜在风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值