我具有以下功能,用于启动jsvc守护程序以接收UDP消息:
@Override public void start() throws Exception { byte[] buf = new byte[1000]; DatagramPacket dgp = new DatagramPacket(buf, buf.length); DatagramSocket sk; sk = new DatagramSocket(1000); sk.setSoTimeout(0); byte[] rcvMsg = null; run(sk, dgp, rcvMsg); }
超时为0时,套接字将阻塞直到出现另一条消息为止。这是触发以下while循环连续运行的原因:
MessageConstructor tmc =null; Message message = null; public void run(DatagramSocket sk, DatagramPacket dgp, byte[] rcvMsg){ while(true){ try { sk.receive(dgp); } catch (IOException e) { e.printStackTrace(); } rcvMsg = dgp.getData(); tmc = new MessageConstructor(); message = tmc.constructMessageFromBinary(rcvMsg); tmc =null; message = null; } }
创建的唯一新对象是下面的MessageConstructor:
在ConstructTagMessageFromBinary函数内部,有一个消息,该消息是从ByteArrayInputStream填充的,它将接收到的UDP消息转换为int。
public Message constructTagMessageFromBinary(byte[] rcvMsg) { Message message = new Message(); ByteArrayInputStream bais = new ByteArrayInputStream(rcvMsg); DataInput input = new DataInputStream(bais); try { int MsgType = 0; MsgType = input.readShort(); message.setType(MsgType); return message; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; }
最后,消息是pojo。
公共类消息{
private int type; //getters and setters omitted
}
我将内存泄漏的范围缩小了:
tmc = new MessageConstructor(); message = tmc.constructMessageFromBinary(rcvMsg);
如果我将它们注释掉,则只要守护程序运行,内存就永远不会增长并保持一致。
我在MessageConstructor类中做错了什么,以接收以下stackoverflowerror:
Service exit with a return value of 143 java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at org.apache.commons.daemon.support.DaemonLoader.start(DaemonLoader.java:243) Caused by: java.lang.NullPointerException at MainDaemon.start(MainDaemon.java:116) ... 5 more Cannot start daemon Service exit with a return value of 5 java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at org.apache.commons.daemon.support.DaemonLoader.start(DaemonLoader.java:243) Caused by: java.lang.NullPointerException at MainDaemon.start(MainDaemon.java:117) ... 5 more Cannot start daemon Service exit with a return value of 5 Service exit with a return value of 143 Service exit with a return value of 143 Service exit with a return value of 143 Service exit with a return value of 143 Service exit with a return value of 143 Service exit with a return value of 143 Service exit with a return value of 143 Service exit with a return value of 143 java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at org.apache.commons.daemon.support.DaemonLoader.start(DaemonLoader.java:243) Caused by: java.lang.StackOverflowError
问题是我在循环中打开数据库连接而不关闭它。