所以我刚刚安装了新的 Ubuntu 16.04,里面有开始编程所需的所有东西。但现在我遇到了内存大问题。我无法打开我之前的笔记本电脑上的更多应用程序,因为之前的笔记本电脑装有 Linux 12.04,内存只有我现在的一半。我遇到的第一个问题是进程 XORG:
1040 root 20 0 2403428 1,091g 1,014g S 21,9 7,1 247:35.70 Xorg
笔记本电脑使用一天后,内存占用就太多了。第二个问题是 buff/cache,它总是占用超过 2gb。我读到这并且他们声明当我的系统需要时,这应该分块。所以我当前的状态是:
KiB Mem : 16063252 total, 2044612 free, 11033624 used, 2985016 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 2778236 avail Mem
所以我还有2GB的空闲空间。
现在我开始编译我的一个较大的项目。当 free 接近 0 时,编译过程会崩溃,因为它没有可用内存:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.16:test (surefire-itest) on project my-project: Execution surefire-itest of goal org.apache.maven.plugins:maven-surefire-plugin:2.16:test failed: The forked VM terminated without saying properly goodbye. VM crash or System.exit called ?
[ERROR] Command was/bin/sh -c cd /my-project && /usr/lib/jvm/java-8-oracle/jre/bin/java -Dfile.encoding=UTF-8 -jar my-project/target/surefire/surefirebooter8879869524337464183.jar my-project/target/surefire/surefire5896025025928619492tmp my-project/target/surefire/surefire_21839336642879397359tmp
这是崩溃前几秒钟的状态:
KiB Mem : 16063252 total, 178808 free, 13693208 used, 2191236 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 191788 avail Mem
是的,可用内存接近 0,但 buff/cache 中仍有 2 GB。为什么 linux/java 不使用这些内存?有什么方法可以优化我当前的内存使用情况吗?
答案1
您的编译器在 Java VM 中运行,默认情况下,无论您有多少可用内存,Java VM 都限制为 1GB。尝试提供java
命令以-Xmx2G
确保它可以回收两倍的内存,如果这还不够,请随意进一步增加该数字。请注意,如果您碰巧使用 32 位版本的 Java(考虑到您拥有的系统,这种情况不太可能发生),超过 2GB 不会有帮助。
答案2
缓存/缓冲区使用的内存不是你的问题,因为它是根据需要释放的,请参阅这。
一种可能性是:
作为德米特里指出很可能是你的 Java VM 崩溃了。为了进一步阐述他的回答,有几个开关用于指定 Java VM 可用的内存分配池的初始大小和最大大小。以下是摘录自Java 手册页
-Xmsn Specifies the initial size of the memory allocation
pool. This value must be a multiple of 1024
greater than 1 MB. Append the letter k or K to
indicate kilobytes, the letter m or M to indicate
megabytes, the letter g or G to indicate gigabytes,
or the letter t or T to indicate terabytes. The
default value is 2MB. Examples:
-Xms6291456
-Xms6144k
-Xms6m
-Xmxn Specifies the maximum size, in bytes, of the memory
allocation pool. This value must be a multiple of
1024 greater than 2 MB. Append the letter k or K
to indicate kilobytes, the letter m or M to indi-
cate megabytes, the letter g or G to indicate giga-
bytes, or the letter t or T to indicate terabytes.
The default value is 64MB. Examples:
-Xmx83886080
-Xmx81920k
-Xmx80m
根据您所运行的平台也会存在一些差异。
On Mac OS X platforms, the upper limit for this
value when running in 32-bit mode (-d32) is approx-
imately 2100m minus overhead amounts, and approxi-
mately 127t minus overhead amounts when running in
64-bit mode (-d64). On Solaris 7 and Solaris 8
SPARC platforms, the upper limit for this value is
approximately 4000m minus overhead amounts. On
Solaris 2.6 and x86 platforms, the upper limit is
approximately 2000m minus overhead amounts. On
Linux platforms, the upper limit is approximately
2000m minus overhead amounts.
另一种可能性:
我还注意到你没有启用交换。因此,如果不是虚拟机的问题,你可能需要查看这了解确定是否需要启用交换的方法。我认为你应该启用。
如果你正在跑步14.04 而不是 16.04正如您在帖子中所说,您可能会受到这个错误也许这个
如果你运行的是 16.04 并且 Xorg 泄漏内存导致你的问题这个错误由于回归而再次出现,在这种情况下你应该报告它发射台