gpt4 book ai didi

java - 拖尾文件时java中的巨大虚拟内存

转载 作者:行者123 更新时间:2023-11-30 11:34:53 27 4
gpt4 key购买 nike

我使用来自 commons IO 的 Apache Tailer 制作了一个程序,它在机器上的许多日志文件上执行类似“tail -f”的操作。基本上,它在一个线程中运行,将文件作为 RandomAccessFile 打开,检查其长度,寻找结尾等。它将收集到的所有日志行发送到客户端。

有点不舒服的是,在 Linux 上它可以显示大量的 VIRT 内存。现在它显示 16.1g VIRT (!!) 和 203m RES。

我已经阅读了一些关于虚拟内存的内容,并了解到它通常“没什么可担心的”。但是,16 GB?它真的健康吗?

当我用 pmap 查看进程时,没有显示任何日志文件名,所以我猜它们不是内存映射的。我在pmap 输出的意思是“分配的内存”。这是什么意思? :)

但是,pmap -x 显示:

Address           Kbytes     RSS   Dirty Mode   Mapping
...
---------------- ------ ------ ------
total kB 16928328 208824 197096

..所以我想它毕竟不驻留在 RAM 中..但是当打开这样的文件、寻找文件的末尾等时,它是如何在内存方面工作的?

我应该担心那些 GB 的 VIRT 内存吗?它现在“监视”了 84 个不同的日志文件,这些文件在磁盘上的总大小为 31414239 字节。

编辑:我只是在另一台不太“类似于生产”的 Linux 机器上对其进行了测试,但没有得到相同的数字。 VIRT 最多达到 ~2,5 GB。我发现一些默认的 JVM 设置不同(使用“java -XX:+PrintFlagsFinal -version”检查):

Value              Small machine    Big machine
InitialHeapSize 62690688 2114573120
MaxHeapSize 1004535808 32038191104
ParallelGCThreads 2 13

..所以,嗯..我猜它在大机器上占用了更多的堆,因为最大限制(方式)更高?而且我也猜想始终明确指定这些值是个好主意。

最佳答案

一些事情:

  • 每个 Tailer 实例都有自己的线程。每个线程都有一个堆栈。默认情况下(在 64 位 JVM 上)每个线程堆栈为 1Mb,因此您将为堆栈使用 84Mb。您可以考虑在启动时使用 -Xss 选项来减少它。

  • 较大的 virt 大小不一定是坏事。但如果它转化为对物理内存的需求......而你没有那么多......那真的很糟糕。


Hmm I actually run it without any JVM args at all right now. Is that good or bad? :-)

我现在明白了。是的,这很糟糕。大型 64 位机器上 JVM 的默认堆大小远远超出您的实际需要。

假设您的应用程序仅对日志行进行简单处理,我建议您将最大堆大小设置为相对较小的大小(例如 64Mb)。这样一来,即使发生泄漏,也不会吞噬大量实际内存,从而影响系统的其余部分。

关于java - 拖尾文件时java中的巨大虚拟内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15413980/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com