【问题标题】:Linux memory problems.. with java program [duplicate]Linux内存问题..使用java程序[重复]
【发布时间】:2013-01-01 23:16:58
【问题描述】:

可能重复:
How to set the maximum memory usage for JVM?

我正在运行一个java程序,但是当内存使用率达到26.1%时,它不再增加,程序变得很慢。

可能是什么问题? java有内存使用限制吗?或者linux上每个应用程序的内存限制?

java 版本“1.7.0_11” Java(TM) SE 运行时环境 (build 1.7.0_11-b21) Java HotSpot(TM) 64 位服务器 VM(内部版本 23.6-b04,混合模式)


Tasks: 126 total,   1 running, 125 sleeping,   0 stopped,   0 zombie
Cpu(s): 97.5%us,  0.4%sy,  0.0%ni,  2.1%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  33018800k total,  9522548k used, 23496252k free,    12100k buffers
Swap: 32764528k total,        0k used, 32764528k free,   391812k cached
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 3463 wonn24    20   0 8769m 8.2g 9.8m S 391.3 26.1 257:09.24 java
 3725 hong8e    20   0 14876 1148  872 R  0.3  0.0   0:01.81 top
    1 root      20   0  4088  972  720 S  0.0  0.0   0:00.71 init
    2 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 kthreadd
    3 root      RT  -5     0    0    0 S  0.0  0.0   0:00.17 migration/0
    4 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0
    5 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00 watchdog/0
    6 root      RT  -5     0    0    0 S  0.0  0.0   0:00.15 migration/1
    7 root      15  -5     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/1

【问题讨论】:

  • 在此处粘贴代码..或在您的末尾尝试 java profiling

标签: java linux memory


【解决方案1】:

默认情况下,Java 的堆大小限制为 64Mb(如果内存服务器...)您可以使用命令行参数增加它,但在此之前,请确保您需要额外的内存并且没有泄漏.

【讨论】:

  • 虽然 32 位 windows 的最大内存默认为 64 MB,但他在 UNIX 上已经使用了 8 GB,因此此处不适用。你的解决方案越少越好,所以 +1
【解决方案2】:

默认情况下,Java 的服务器版本的最大堆大小为主内存的 1/4。只需少量库和线程堆栈开销,这很容易占据主内存的 26% 或 27%。

当您的 JVM 开始填满时,执行 GC 所需的时间会更短,并且可用内存越少意味着它也更频繁地发生(非常糟糕)理想情况下,您的实际使用量可能低至最大大小的 40% .在您的情况下,您的实际使用量可能至少为 7 GB。

我建议您尝试将最大堆大小增加到至少 16 GB,如果可以腾出内存,可能会增加到 24 GB。即-Xmx16g-Xmx24g

【讨论】:

  • official page on java 没有记录 mx 选项。
  • @MarkoTopolnik 但它确实说-X 选项是“非标准的”。 -mx 选项从 Java 1.1 中保留,它是一个文档化的选项。它实际上已被删除,因此该选项可能是非标准的,但“非标准”-Xmx 选项是标准的,而“标准”-mx 选项是非标准的。 :P
  • 最后,我使用了最简单的选项,因为-mx 就像 Java 8 支持 -ms 一样,并且不会很快消失。
  • @PeterLawrey 感谢您的回答。但是当我运行另一个程序时(程序的名称是 CRF++,它是一个由 c++ 语言编写的机器学习程序),程序内存使用量也是 26.1%,并且不再增加。 c++也有同样的内存限制?还是linux系统对主存使用有限制?
  • @Hong-seokKwon 操作系统有一个限制,但这是一个硬限制,通常非常高,即。如果它试图超过它,应用程序将失败,而不仅仅是放慢速度。运行 ulimit -a 以查看设置的限制。我不知道 C++ 程序会使用大约相同数量的内存的任何原因,除非它运行 JVM 来完成大部分工作。
猜你喜欢
  • 2022-07-15
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多