JVM 堆内存回顾

有一天被负责 BI 的同事问道,为什么应用设置了 -Xms128m -Xmx128m 后,应用还是要占用 300 mb 左右的内存大小
想当然回答到:因为还有其他东西占用,这个只是用来约束栈堆的。
但是事后想了下,回答得不够好,就有以下这个文章重新梳理下这个答案

JVM 由哪些东西构成 ?

核心组件包括:

  • 类加载器子系统
  • 运行时数据区
  • 执行引擎
  • 本地方法接口

jvm_heap

其中 -Xms128m -Xmx128m用来控制 堆 的起始和最大的限制。由于还有其他组件也需要运行,所以总体大小应该是超过 128 mb 的。

在非堆中有:

  • 元空间 - 方法区:用来存储加载类的信息,方法元数据,常量池等。 -XX:MaxMetaspaceSize 来控制它的限制
  • 通过 -Xss 来控制 Thread Stacks , 每个线程在创建时都会分配一个私有的栈内存,用于存储局部变量、方法调用栈帧等。默认大小在大多数 64 位 JVM 上是 1MB . 即使是一个简单的应用,通常也有多个线程(主线程、GC 线程、Finalizer 线程、可能的应用线程等)。10 个线程就需要大约 10MB 的栈内存。
- the End -
0%