在linux上,java应用程序的top命令输出中的DATA是什么?


1

我有一个在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 DATA部分。实际上,根据JVM的配置,堆大小约为128m。我的问题是为Java应用程序存储的数据部分是什么?有什么线索吗?我该如何优化呢?

谢谢,埃姆雷


您不能自己做,但是一旦有五个人投票赞成将其移动到那里,它就会自动发生(或多或少)。或者,注册该论坛并在此重新发布。
Aleks G 2012年

Answers:


1

DATA表示应用程序使用brk(2)-即扩展数据段分配的内存。

Java将把许多不同的东西放入数据段中:

  • 本机运行时层分配的任何内存(使用native关键字的代码)
  • 使用JNI / JNA从Java加载的DLL /共享库分配的任何内存
  • 通过JIT(代码缓存)加载,解释和编译字节码的内存
  • GC和其他运行时支持代码使用的内存结构
  • 堆栈

请注意,为程序提供128MB的堆将分配更多空间,因为Java还将创建一些结构来管理堆,但这些结构不是堆的一部分。因此128MB意味着您将有128MB可以在其中分配Java对象。


感谢亚伦的详细信息!所以您的意思是DATA部分(按Top输出)将几乎包括所有Java应用程序所需的内存空间?包括堆,堆栈和外部加载的库。您是否有任何推荐工具可用于分析DATA部分?我认为JProfiler或JProbe只会分析堆部分,对您没有帮助,对吧?
Emre He

我不知道可以进行进一步分析的工具,但我不是该领域的专家。我建议您问一个新的更具体的问题,例如“我的应用程序有128MB的堆,但使用1.6GB的实际RAM。如何找到1.4GB的存储空间?”
亚伦·迪古拉

最后我们发现这是由JNI加载.so文件引起的,它占用了更多内存。谢谢你的帮助。
Emre He

0

这是专用于可执行代码以外的物理内存量,也称为“数据驻留集”大小或DRS。通常,您可以参考手册页,其中详细描述了所有列。要获取手册页,请键入man top


首先谢谢。我可以从Top手册中看到“ DATA-数据+堆栈大小(kb)”,这是什么意思?也许是根据java静态变量或String定义?
Emre He
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.