Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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
每当出现新消息时,简单Java聊天客户端都会使用更多内存_Java_User Interface - Fatal编程技术网

每当出现新消息时,简单Java聊天客户端都会使用更多内存

每当出现新消息时,简单Java聊天客户端都会使用更多内存,java,user-interface,Java,User Interface,我们正在和我的两个朋友(我们都是新程序员)编写一个简单的聊天服务器/客户端。昨晚,当我们运行第一个正在运行的版本时,我们意识到每当出现新消息时,我们的客户机都会使用更多的内存(我尝试了使用gui和不使用gui,在这两种情况下,新消息仍然会使用更多的内存) 您可以在查看我们的代码。运行服务器,然后运行客户端进行测试 我将XChat用于IRC,在数千行文本之后,它仍然使用相同的内存量。我们正在努力使我们的应用程序像这样。我们需要关于代码和内存问题的建议 感谢并为我的英语感到抱歉。我还没有检查您的代码

我们正在和我的两个朋友(我们都是新程序员)编写一个简单的聊天服务器/客户端。昨晚,当我们运行第一个正在运行的版本时,我们意识到每当出现新消息时,我们的客户机都会使用更多的内存(我尝试了使用gui和不使用gui,在这两种情况下,新消息仍然会使用更多的内存)

您可以在查看我们的代码。运行服务器,然后运行客户端进行测试

我将XChat用于IRC,在数千行文本之后,它仍然使用相同的内存量。我们正在努力使我们的应用程序像这样。我们需要关于代码和内存问题的建议


感谢并为我的英语感到抱歉。

我还没有检查您的代码,但您是在删除旧聊天信息还是保留对它们的引用


您可以使用内存分析器来查看是否确实在泄漏内存,但内存增长是自然的,除非最终出现内存不足异常

我没有检查你的代码,但是你是在删除旧的聊天信息还是保留对它们的引用


您可以使用内存分析器来查看是否确实在泄漏内存,但内存增长是自然的,除非最终出现内存不足异常

在Oracle Java 6 JDK中使用jvisualvm对应用程序进行内存配置以查看内存去向。

在Oracle Java 6 JDK中使用jvisualvm对应用程序进行内存配置以查看内存去向


我们保留所有要显示的消息 在客户端的JTextPane中显示它们(与任何 其他聊天客户端)

你有你的回答。内存消耗会增加,因为您存储消息以显示它们。当然,随着消息数量的增加,内存也会增加


我们保留所有要显示的消息 在客户端的JTextPane中显示它们(与任何 其他聊天客户端)



你有你的回答。内存消耗会增加,因为您存储消息以显示它们。因此,内存当然会随着消息数量的增加而增加。

我们保留所有消息,以便在客户端的JTextPane中显示它们(与任何其他聊天客户端一样),客户端只应将最后500条消息保留在内存中,并丢弃那些较老的消息(或将其写入磁盘)。如果您全天候运行,则任何客户端都无法将所有消息保留在内存中。我们保留所有消息以在客户端的JTextPane中显示它们(与任何其他聊天客户端一样)。客户端只应将最后500条消息保留在内存中,并丢弃那些较老的消息(或将其写入磁盘)。如果你24/7运行它,没有一个客户端可以将所有消息都保留在内存中。每条消息使用的内存有多大…?@Matti,我不知道如何测量它,我只是在htop上观察客户端,在几行消息之后,它的内存使用量增加了大约0.1%的内存(我有4gb),这听起来不太正常。虚拟机在启动时分配一定数量的内存,然后在可能和需要时分配更多内存。GC将在您执行时清理一些内存,但GC的目标不是使内存占用尽可能小。@Kaj,您看过我们的代码了吗?这正常吗?唯一的问题是我们将旧消息保存到内存以外的地方,然后在必要时读取它们吗?我不使用git,读取所有这些代码不是我应该做的事情。:)更改代码,以便保留最大行数/消息数。不可能无限滚动。当我浏览代码时,我看到的一件事是,您使用的是ObjectOutputStream,该流正在构建对象图并引用旧对象,因此您需要在该流上调用reset()。每条消息使用的内存有多大…?@Matti,我不知道如何测量它,我只是在htop上观察客户机,在几行消息之后,它的内存使用量增加了大约0.1%的内存(我有4gb),这听起来不太正常。虚拟机在启动时分配一定数量的内存,然后在可能和需要时分配更多内存。GC将在您执行时清理一些内存,但GC的目标不是使内存占用尽可能小。@Kaj,您看过我们的代码了吗?这正常吗?唯一的问题是我们将旧消息保存到内存以外的地方,然后在必要时读取它们吗?我不使用git,读取所有这些代码不是我应该做的事情。:)更改代码,以便保留最大行数/消息数。不可能无限滚动。当我浏览代码时看到的一件事是,您正在使用ObjectOutputStream,该流正在构建对象图,并且正在引用旧对象,因此您需要调用reset()那么XChat或任何其他IRC客户机如何能像我们的客户机一样做同样的事情,但有恒定的RAM?也许他们会将消息保存在磁盘上,并仅在需要时重新加载旧消息?但除此之外,我想您可以理解,随着显示的数据量的增加,消耗的内存量也会增加。另一方面,消息只能占用与消息大小相关的几个字节。我的猜测是,出于许多原因,您在内存中存储的信息比每条消息只存储一个新的字符串要多。那么XChat或任何其他IRC客户端如何能够像我们的客户端一样,在RAM恒定的情况下执行相同的操作?也许他们会将消息保存在磁盘上,并仅在需要时重新加载旧消息?但除此之外,我想您可以理解,随着显示的数据量的增加,消耗的内存量也会增加。另一方面,消息只能占用与消息大小相关的几个字节。我的猜测是,出于许多原因,您在内存中存储的内容比每条消息中只存储一个新的字符串要多。