为什么 buf/cache 占用这么多内存,而且不分块

为什么 buf/cache 占用这么多内存,而且不分块

所以我刚刚安装了新的 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 泄漏内存导致你的问题这个错误由于回归而再次出现,在这种情况下你应该报告它发射台

来源:http://www.manpagez.com/man/1/java/

相关内容