我正在开发一个处理大量非常密集流量的 Java 服务器。服务器接受来自客户端的数据包(通常为数兆字节)并将它们转发给其他客户端。服务器从不显式存储任何传入/传出数据包。然而服务器不断遇到OutOfMemoryException
例外情况。
I added System.gc()
进入服务器的消息传递组件,希望内存能够被释放。此外,我将 JVM 的堆大小设置为 GB。我仍然遇到同样多的例外情况。
所以我的问题是:如何确保兆字节消息不会无限期地排队(尽管不需要)?有没有办法让我对这些对象调用“删除”以保证它们不使用我的堆空间?
try
{
while (true)
{
int r = generator.nextInt(100);//generate a random number between 0 and 100
Object o =readFromServer.readObject();
sum++;
// if the random number is larger than the drop rate, send the object to client, else
//it will be dropped
if (r > dropRate)
{
writeToClient.writeObject(o);
writeToClient.flush();
numOfSend++;
System.out.printf("No. %d send\n",sum);
}//if
}//while
}//try
对象流保存对从中写入/读取的每个对象的引用。这是因为序列化协议允许向后引用流中较早出现的对象。您也许仍然可以使用此设计,但使用 writeUnshared/readUnshared 而不是 writeObject/readObject。我认为(但不确定)这将阻止流保留对该对象的引用。
正如考恩所说,reset()
方法也在这里发挥作用。最安全的做法可能是使用writeUnshared
紧接着reset()
当写信给你的时候ObjectOutputStream
s
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)