我正在使用jnetpcap v1.4r1425构建一种Wireshark的自定义版本。我只想打开离线pcap文件并在我的表视图中显示它们,除了速度外,它的工作效果很好。
我打开的文件大约有100 mb,包含70万个软件包。
public ObservableList<Frame> readOfflineFiles1(int numFrames) {
ObservableList<Frame> frameData = FXCollections.observableArrayList();
if (numFrames == 0){
numFrames = Pcap.LOOP_INFINITE;
}
final StringBuilder errbuf = new StringBuilder();
final Pcap pcap = Pcap.openOffline(FileAddress, errbuf);
if (pcap == null) {
System.err.println(errbuf); // Error is stored in errbuf if any
return null;
}
JPacketHandler<StringBuilder> packetHandler = new JPacketHandler<StringBuilder>() {
public void nextPacket(JPacket packet, StringBuilder errbuf) {
if (packet.hasHeader(ip)){
sourceIpRaw = ip.source();
destinationIpRaw = ip.destination();
sourceIp = org.jnetpcap.packet.format.FormatUtils.ip(sourceIpRaw);
destinationIp = org.jnetpcap.packet.format.FormatUtils.ip(destinationIpRaw);
}
if (packet.hasHeader(tcp)){
protocol = tcp.getName();
length = tcp.size();
int payloadOffset = tcp.getOffset() + tcp.size();
int payloadLength = tcp.getPayloadLength();
buffer.peer(packet, payloadOffset, payloadLength); // No copies, by native reference
info = buffer.toHexdump();
} else if (packet.hasHeader(udp)){
protocol = udp.getName();
length = udp.size();
int payloadOffset = udp.getOffset() + udp.size();
int payloadLength = udp.getPayloadLength();
buffer.peer(packet, payloadOffset, payloadLength); // No copies, by native reference
info = buffer.toHexdump();
}
if (packet.hasHeader(payload)){
infoRaw = payload.getPayload();
length = payload.size();
}
frameData.add(new Frame(packet.getCaptureHeader().timestampInMillis(), sourceIp, destinationIp, protocol, length, info ));
//System.out.print(i+"\n");
//i=i+1;
}
};
pcap.loop(numFrames, packetHandler , errbuf);
pcap.close();
return frameData;
}
对于第一个可能有40万个软件包的代码,此代码非常快,但此后,它的速度将大大降低。前40万个软件包大约需要1分钟,其余的大约需要10分钟。这是什么问题?
这不是因为列表花费的时间太长了吗? listmethod add是O(1),不是吗?
我也在官方的jnetpcap论坛上问过这个问题,但是它不是很活跃。
编辑:
事实证明,由于堆的使用,它的速度大大降低了。有办法减少这种情况吗?
最佳答案
如探查器所示,您的内存不足,并且开始变慢。
用-Xmx
提供更多内存,或者不立即将所有数据包都加载到内存中。