我有一个在 Linux 平台上运行的 JBoss 应用程序,它的顶部输出如下(实际上不是准确的数据):
PID USER PR NI VIRT RES SHR S %CPU %MEM CODE DATA TIME+ COMMAND
1379 root 16 0 9.7g 1.6g 1980 S 0.7 1.3 36 9.7g 0:11.03 java
它总共有 1.6g 物理内存,并且有 9.7g 数据部分。实际上,使用 JVM 配置的堆大小约为 128m。我的问题是 Java 应用程序的数据部分存储了什么?有什么线索吗?我该如何优化它?
谢谢,埃姆雷
答案1
DATA
表示应用程序分配的内存使用brk(2)
-即扩展数据段。
Java 会将很多不同的东西放入数据段:
- 堆
- 本机运行时层分配的任何内存(使用
native
关键字的代码) - 使用 JNI/JNA 从 Java 加载的 DLL/共享库分配的任何内存
- JIT(代码缓存)加载、解释和编译字节码的内存
- GC 和其他运行时支持代码使用的内存结构
- 堆栈
请注意,为程序分配 128MB 的堆将分配更多空间,因为 Java 还会创建一些不属于堆的结构来管理堆。因此 128MB 意味着您将有 128MB 的空间可用于分配 Java 对象。
答案2
这是用于执行除可执行代码以外的其他操作的物理内存量,也称为“数据驻留集”大小或 DRS。通常,您可以参考详细描述所有列的手册页。要获取手册页,请键入man top
。