gpt4 book ai didi

java - java程序运行60M或90M正常吗?

转载 作者:行者123 更新时间:2023-11-30 05:55:19 24 4
gpt4 key购买 nike

我有一个代理服务器程序,它监听一个套接字并创建一个线程池来处理连接,这些连接会在必要时生成新线程以处理任何额外开销。当我在 java 1.5 上启动程序时,它的内存占用量是 90M,而如果我使用 java 1.6 jvm,它有 60M 占用量,这对于一个简单的代理服务器程序来说似乎更大,这正常吗?

我问这个是因为系统内存相当有限,有时会抛出 OutOfMemoryException。

以上统计数据是当我开始使用小于 10 的初始线程池大小时。我将初始线程池大小增加到 50,它在 jvm 1.5 上的内存占用量约为 120M。

如何减少内存使用量?

最佳答案

这似乎适合小型 Java 进程 - 请记住,如果您正在寻找非常小的内存占用空间,Java 并不是真正的理想选择。

您应该记住,JVM 是基于 Stack 的机器,其中每个线程都有自己的 Stack。

堆栈的大小因您运行的 JVM 类型而异——(我相信,因为我已经丢失了详细说明这些值的 oracle.com 页面)32 位 JVM 以 320kb 的堆栈运行每个线程,而 64 位 JVM 为每个线程分配 1Mb - 这解释了为什么拥有大线程池会增加内存大小。

除了 Stack,JVM 还会为 Heap 分配内存空间 - Stack 空间通常不会从 Heap 中分配,因此所有这些都会挂载。

如果您超出了内存限制,您可以在启动 Java 应用程序时尝试通过使用命令行开关来限制使用量。

java -Xmx100m -Xss128k <followed by your other usual params>
  • -Xmx 用于限制最大堆大小(例如,-Xmx100m 会将堆限制为 100Mb。
  • -Xss 用于限制分配给每个线程的堆栈大小(例如,-Xmx128k 会将每个堆栈限制为 128Kb)。

您还可以使用其他调整参数,但是在限制内存时应该小心,因为这可能会导致您的应用程序出现问题。

垃圾收集是另一个可以调整的领域,以帮助内存使用,但我不会在这么小的应用程序上深入到那个领域。

正如 Ingo 所提到的,我建议您对您的应用程序使用分析器来查看内存的分配位置——许多流行的 IDE 要么内置了分析器,要么将它们作为插件提供。

关于java - java程序运行60M或90M正常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8429218/

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