Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux下Java的虚拟内存使用情况,内存使用过多_Java_Linux_Memory_Virtual Memory - Fatal编程技术网

Linux下Java的虚拟内存使用情况,内存使用过多

Linux下Java的虚拟内存使用情况,内存使用过多,java,linux,memory,virtual-memory,Java,Linux,Memory,Virtual Memory,我对在Linux下运行的Java应用程序有一个问题 当我使用默认的最大堆大小(64MB)启动应用程序时,我看到使用tops应用程序会为应用程序分配240MB的虚拟内存。这会导致计算机上的某些其他软件出现一些问题,这些软件的资源相对有限 据我所知,保留的虚拟内存无论如何都不会被使用,因为一旦达到堆限制,就会抛出OutOfMemoryError。我在windows下运行了相同的应用程序,发现虚拟内存大小和堆大小相似 我是否可以在Linux下为Java进程配置正在使用的虚拟内存 编辑1:问题不在于堆。

我对在Linux下运行的Java应用程序有一个问题

当我使用默认的最大堆大小(64MB)启动应用程序时,我看到使用tops应用程序会为应用程序分配240MB的虚拟内存。这会导致计算机上的某些其他软件出现一些问题,这些软件的资源相对有限

据我所知,保留的虚拟内存无论如何都不会被使用,因为一旦达到堆限制,就会抛出
OutOfMemoryError
。我在windows下运行了相同的应用程序,发现虚拟内存大小和堆大小相似

我是否可以在Linux下为Java进程配置正在使用的虚拟内存

编辑1:问题不在于堆。问题是,例如,如果我将堆设置为128MB,Linux仍然会分配210MB的虚拟内存,这是永远不需要的**

编辑2:使用
ulimit-v
可以限制虚拟内存量。如果大小集小于204 MB,则应用程序将不会运行,即使它不需要204 MB,只需要64 MB。所以我想理解为什么Java需要这么多虚拟内存。这能改变吗


编辑3:系统中还运行其他几个嵌入式应用程序。而且系统确实有一个虚拟内存限制(根据注释和重要细节)。

不,您不能配置VM所需的内存量。但是,请注意,这是虚拟内存,不是驻留内存,因此如果不实际使用,它只会留在那里而不会造成伤害


另外,您可以尝试其他JVM,然后是Sun one,内存占用较小,但我不能在此提出建议。

Sun的java 1.4有以下参数来控制内存大小:

-Xmsn 指定内存分配池的初始大小(以字节为单位)。 此值必须是1024的倍数 大于1MB。附加字母k 或K表示千字节,或m或m 表示兆字节。默认值 值为2MB。示例:

           -Xms6291456
           -Xms6144k
           -Xms6m
           -Xmx83886080
           -Xmx81920k
           -Xmx80m
-Xmxn 指定内存分配池的最大大小(以字节为单位)。 此值必须是1024的倍数 大于2MB。附加字母k 或K表示千字节,或m或m 表示兆字节。默认值 值为64MB。示例:

           -Xms6291456
           -Xms6144k
           -Xms6m
           -Xmx83886080
           -Xmx81920k
           -Xmx80m


Java5和Java6还有更多。请看

仅是一个想法,但您可以检查它的影响


这不是一个实际的解决方案,因为它会限制所有进程的可用地址空间,但这将允许您在有限的虚拟内存中检查应用程序的行为。

这是Java的一个长期问题,但它在很大程度上没有意义,通常是基于查看错误的信息。通常的说法是“Java上的Hello World需要10兆字节!为什么需要呢?”好吧,下面有一种方法可以让64位JVM上的Hello World声称需要超过4G字节。。。至少通过一种形式的测量

java -Xms1024m -Xmx4096m com.example.Hello java-Xms1024m-Xmx4096m.com.example.Hello 测量记忆的不同方法 在Linux上,该命令为内存提供了几个不同的数字。下面是关于Hello World示例的说明:

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2120 kgregory 20 0 4373m 15m 7152 S 0 0.2 0:00.10 java PID用户PR NI VIRT RES SHR S%CPU%MEM TIME+命令 2120 kgregory 20 0 4373m 15m 7152 S 0 0.2 0:00.10爪哇
  • VIRT是虚拟内存空间:虚拟内存映射中所有内容的总和(见下文)。它基本上是没有意义的,除非它不是(见下文)
  • RES是驻留集大小:当前驻留在RAM中的页面数。在几乎所有的情况下,当你说“太大”时,这是唯一应该使用的数字。但这仍然不是一个很好的数字,尤其是在谈论Java时
  • SHR是与其他进程共享的驻留内存量。对于Java进程,这通常仅限于共享库和内存映射文件。在本例中,我只运行了一个Java进程,因此我怀疑7k是操作系统使用库的结果
  • 默认情况下不会启用交换,此处也不会显示交换。它指示当前驻留在磁盘上的虚拟内存量,无论它是否实际位于交换空间中。操作系统非常擅长将活动页面保存在RAM中,交换的唯一方法是(1)购买更多内存,或(2)减少进程数量,因此最好忽略这个数字
Windows任务管理器的情况要复杂一些。在Windows XP下,有“内存使用情况”和“虚拟内存大小”列,但没有说明它们的含义。WindowsVista和Windows7添加了更多的列,它们实际上是。其中,“工作集”测量是最有用的;它大致相当于Linux上RES和SHR的总和

理解虚拟内存映射 进程消耗的虚拟内存是进程内存映射中所有内容的总和。这包括数据(例如Java堆),但也包括程序使用的所有共享库和内存映射文件。在Linux上,您可以使用该命令查看映射到进程空间的所有内容(从这里开始,我只会提到Linux,因为我使用的是Linux;我确信Windows上有等效的工具)。以下是“Hello World”计划记忆地图的摘录;整个内存映射的长度超过100行,并且有1000行的列表并不罕见

0000000040000000 36K r-x-- /usr/local/java/jdk-1.6-x64/bin/java 0000000040108000 8K rwx-- /usr/local/java/jdk-1.6-x64/bin/java 0000000040eba000 676K rwx-- [ anon ] 00000006fae00000 21248K rwx-- [ anon ] 00000006fc2c0000 62720K rwx-- [ anon ] 0000000700000000 699072K rwx-- [ anon ] 000000072aab0000 2097152K rwx-- [ anon ] 00000007aaab0000 349504K rwx-- [ anon ] 00000007c0000000 1048576K rwx-- [ anon ] ... 00007fa1ed00d000 1652K r-xs- /usr/local/java/jdk-1.6-x64/jre/lib/rt.jar ... 00007fa1ed1d3000 1024K rwx-- [ anon ] 00007fa1ed2d3000 4K ----- [ anon ] 00007fa1ed2d4000 1024K rwx-- [ anon ] 00007fa1ed3d4000 4K ----- [ anon ] ... 00007fa1f20d3000 164K r-x-- /usr/local/java/jdk-1.6-x64/jre/lib/amd64/libjava.so 00007fa1f20fc000 1020K ----- /usr/local/java/jdk-1.6-x64/jre/lib/amd64/libjava.so 00007fa1f21fb000 28K rwx-- /usr/local/java/jdk-1.6-x64/jre/lib/amd64/libjava.so ... 00007fa1f34aa000 1576K r-x-- /lib/x86_64-linux-gnu/libc-2.13.so 00007fa1f3634000 2044K ----- /lib/x86_64-linux-gnu/libc-2.13.so 00007fa1f3833000 16K r-x-- /lib/x86_64-linux-gnu/libc-2.13.so 00007fa1f3837000 4K rwx-- /lib/x86_64-linux-gnu/libc-2.13.so ... 00000000 40000000 36K r-x--/usr/local/java/jdk-1.6-x64/bin/java 00000000 40108000 8K rwx--/usr/local/java/jdk-1.6-x64/bin/java 00000000 40EBA0000 676K rwx--[anon] 0000000 6FAE00000 21248K rwx--[anon] 0000000 6FC2C0000 62720K rwx--[anon] 0000000 70000000 699072K rwx--[anon] 0000000 72AAB0000 2097152K rwx--[anon] 0000000 7AAAB0000 349504K rwx--[anon] 0000000 7C0000000 1048576K rwx--[
ENV MALLOC_ARENA_MAX=4
# tune glibc memory allocation, optimize for low fragmentation
# limit the number of arenas
export MALLOC_ARENA_MAX=2
# disable dynamic mmap threshold, see M_MMAP_THRESHOLD in "man mallopt"
export MALLOC_MMAP_THRESHOLD_=131072
export MALLOC_TRIM_THRESHOLD_=131072
export MALLOC_TOP_PAD_=131072
export MALLOC_MMAP_MAX_=65536