Tôi có một ứng dụng chạy trên tomcat và đôi khi tôi có lỗi dưới đây:Lỗi trong tomcat "quá nhiều tập tin mở"
SEVERE: Socket accept failed
java.net.SocketException: Too many open files
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398)
at java.net.ServerSocket.implAccept(ServerSocket.java:522)
at java.net.ServerSocket.accept(ServerSocket.java:490)
at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:60)
at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:216)
at java.lang.Thread.run(Thread.java:722)
....
SEVERE: Error processed default web.xml named conf/web.xml at /local/myApp/apache-tomcat/conf/web.xml
java.io.FileNotFoundException: /local/myApp/apache-tomcat/conf/web.xml (Too many open files)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at org.apache.catalina.startup.ContextConfig.getWebXmlSource(ContextConfig.java:1838)
at org.apache.catalina.startup.ContextConfig.getGlobalWebXmlSource(ContextConfig.java:1745)
at org.apache.catalina.startup.ContextConfig.getDefaultWebXmlFragment(ContextConfig.java:1418)
at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1253)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:878)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:369)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5269)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3926)
at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:426)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1345)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1530)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1519)
at java.lang.Thread.run(Thread.java:722)
tôi kiểm tra các giới hạn của các tập tin mở và nó là 1024 nhưng khi tôi kiểm tra số lượng các tập tin mở của ứng dụng với lsof nó gần 200, tại sao điều này xảy ra nếu nó không đạt đến giới hạn? Tôi có nên tăng giới hạn không? Có lý do nào khác để nhận lỗi này không? Cách duy nhất để dịch vụ chạy đúng một lần nữa, nó khởi động lại tomcat, có cách nào khác để lấy lại bình thường không?
Xin cảm ơn trước.
EDIT: Đây là servlet xử lý phương thức doPost, lúc đầu tôi không đóng mọi luồng, có phải vậy không? Tôi được thêm vào cuối cùng tuyên bố để làm điều đó:
InputStream is = null;
DataInputStream dis = null;
OutputStream os = null;
DataOutputStream dos = null;
String paramName = "";
try {
os = response.getOutputStream();
is = request.getInputStream();
dis = new DataInputStream(is);
dos = new DataOutputStream(os);
.....
}catch (Throwable e) {
LOGGER.error(e.getMessage());
} finally {
if (dis != null) {
dis.close();
}
else if(is != null) {
is.close();
}
if (dos != null) {
dos.close();
}
else if(os != null) {
os.close();
}
}
EDIT2: Sau khi thực hiện một số thử nghiệm tôi nhận ra rằng nếu tôi đóng đầu tiên DataInputStream và sau đó là InputStream, tôi nhận được trong một phần khác của giao tiếp một số trước tin nhắn (Tôi không biết tại sao). Tôi đã thay đổi thứ tự đóng luồng và dường như mọi thứ đều ổn. Nhưng tôi vẫn có vấn đề. Bất kỳ ý tưởng?
finally {
if(is != null) {
try {
is.close();
} catch (IOException e) {
LOGGER.error(e.getMessage());
}
}
if (dis != null) {
try {
dis.close();
} catch (IOException e) {
LOGGER.error(e.getMessage());
}
}
if(os != null) {
try {
os.close();
} catch (IOException e) {
LOGGER.error(e.getMessage());
}
}
if (dos != null) {
try {
dos.close();
} catch (IOException e) {
LOGGER.error(e.getMessage());
}
}
}
Có, tôi đã kiểm tra trang web này, nhưng dịch vụ cũng không sử dụng quá 200 tối đa, tại sao tăng đến 4096 giới hạn? – alicia
Bạn nên tìm kiếm lỗi của mình trên trang web trước tiên: http://stackoverflow.com/questions/5656458/java-net-socketexception-too-many-open-files – developerwjk
Chia sẻ mã của bạn! chúng tôi không thể giúp đỡ mà không có bất kỳ đoạn mã nào. – tokhi