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