我正在尝试创建一个可以拥有多个用户的服务器,我只创建2个线程,但我的BufferedReader.readLine()似乎正在制作多个线程并导致OutOfMemory异常,我不明白为什么会这样做?
导致异常的函数:
public void run() {
try {
Username = Input.readLine();
} catch (IOException e1) {
disconnect();
}
String lastInput = null;
try {
while ((lastInput = Input.readLine()) != null) {
System.out.println(lastInput);
if (lastInput.startsWith("Chat: ")) {
sendToAllClients(lastInput.substring(7));
}
}
} catch (IOException e) {
disconnect();
}
}
例外:
Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unknown Source)
at java.lang.AbstractStringBuilder.append(Unknown Source)
at java.lang.StringBuffer.append(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at Main.User.run(User.java:46)
at java.lang.Thread.run(Unknown Source)
注意:Username = Input.readLine()正在进行异常
答案 0 :(得分:1)
要避免无限循环,因此要避免OOM异常:
try{
while ((currentInput=Input.readLine()) != null) {
if (currentInput.startsWith("Chat: "))
sendToAllClients(currentInput.substring(7));
}
catch (IOException e) { //bad to swallow exception: let's the method throw it or make something with it here}
答案 1 :(得分:0)
readLine()不会创建线程。
如果'lastInput'为null,则应退出循环并关闭流。
如果您遇到异常,请记录或打印,关闭流,然后中断。
答案 2 :(得分:-1)
Out of memory heap space
进入画面是程序进入无限循环。
您的代码:
while (true) {
try {
lastInput = Input.readLine();
} catch (IOException e) {}
if (lastInput != null) {
System.out.println(lastInput);
if (lastInput.startsWith("Chat: ")) {
sendToAllClients(lastInput.substring(7));
}
}
表示循环内的代码将无限次运行多次,而没有任何条件充当退出条件。即使问题即将来临:您正在捕获该异常并且代码继续在循环内继续。
这会导致Out of Memory : Heap Space.
建议的解决方案:
while (true)
{
try
{
lastInput = Input.readLine();
}
catch (IOException e)
{
break;
}
if (lastInput != null)
{
System.out.println(lastInput);
if (lastInput.startsWith("Chat: "))
{
sendToAllClients(lastInput.substring(7));
}
}
}
一旦用户输入任何导致异常的名称(实际上作为while循环的退出条件),此循环就会中断
修改强>
我看到的一个领域可能是问题的根源:
lastInput.substring(7)
如果lastInput
字符串的大小很大,几乎可以填满系统上安装的heap space of the JVM
,那么从substring
调用7th character to the last character
会在内部触发创建新的String
(因为字符串是不可变的),&如果剩余的堆空间不足,substring
执行会给出OutOfMemory exception
。
答案 3 :(得分:-1)
首先:检查你的程序循环。 第二:设置参数集JAVA_OPTS = -Xms32m -Xmx512m。