Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 写入/读取产生垃圾的数据包_Java_Android_Thread Sleep_Datagram_Garbage - Fatal编程技术网

Java 写入/读取产生垃圾的数据包

Java 写入/读取产生垃圾的数据包,java,android,thread-sleep,datagram,garbage,Java,Android,Thread Sleep,Datagram,Garbage,我在Android上有一个客户端,它使用Android VPN服务公开的TUN接口来拦截软件包。在这方面,我读取所有传入的数据包并将它们写入TUN接口。这基本上意味着我对收到的每个数据包进行写入。这方面的问题是,Android似乎会分别为每个写调用和读调用分配,这是大量垃圾,导致大量重复的垃圾收集 下面是读取操作的代码,它从我的服务器读取所有传入的数据包。正如评论中提到的,我从一个简单的例子中读到: public void run(){ ByteBuffer缓冲区=ByteBuffer.allo

我在Android上有一个客户端,它使用Android VPN服务公开的TUN接口来拦截软件包。在这方面,我读取所有传入的数据包并将它们写入TUN接口。这基本上意味着我对收到的每个数据包进行写入。这方面的问题是,Android似乎会分别为每个写调用和读调用分配,这是大量垃圾,导致大量重复的垃圾收集

下面是读取操作的代码,它从我的服务器读取所有传入的数据包。正如评论中提到的,我从一个简单的例子中读到:

public void run(){
ByteBuffer缓冲区=ByteBuffer.allocate(32767);
而(!Thread.currentThread().isInterrupted()){
试一试{
buffer.clear();
//getVpnTunnel是底层数据报通道的简单getter。
int packetSize=conn.getVpnTunnel().read(buffer);//在此处分配int[80]垃圾
flip();
如果(包装尺寸<1){
//没有数据,请等待,然后读取。
试一试{
睡眠(5);
}捕捉(中断异常e){
e、 printStackTrace();
打破
}
继续;
}
开关(…){
违约:
抛出新的IllegalStateException(“接收到无效消息”);
}
}捕获(IOE异常){
e、 printStackTrace();
打破
}
}
}
当我读取数据包/消息时,我会剥离并检查我的自定义类型头(1字节),然后将所有适当的数据包写入Android TUN接口

现在我的问题是,我是否可以在不使用缓冲读取的情况下减少生成的垃圾量?我是否可以以任何方式缓存异常,使其不必为每个读写调用分配新的异常?或者这根本不可能,我应该调整我的线程。睡眠等待时间

记住,这个read调用实际上读取客户端接收到的所有数据包,所以我有点好奇我应该睡多少觉。一方面,我不想在有数据包传入时等待,但另一方面,减少睡眠计时器将生成更多要读取的调用,从而导致更频繁的垃圾收集


希望您能给我一些建议,提前谢谢。

我们遇到了类似的问题。实际上,我们可以通过在
while
循环中只使用
read
命令,而不使用任何额外的代码来重现这一点。你解决问题了吗?@noti正如代码所示,确实是读取方法生成了这个“垃圾”。但是,我没有找到解决方案,我不确定是否可以避免让该方法生成这些字节。我们通过使用JNI成功地避免了这些字节。我们不使用FileInputStream类,而是调用本机的
read
函数,该函数不会引发任何异常。@noti这实际上是一个非常酷的解决方案。至少在普通Java中,我看不到任何防止这种情况发生的方法。如果你要提交一份更详细的书面解释,我很想把它作为问题的答案。(我不确定使用JNI是否会带来其他并发症?)。
public void run() {
    ByteBuffer buffer = ByteBuffer.allocate(32767);

    while (!Thread.currentThread().isInterrupted()) {
        try {
            buffer.clear();
            // getVpnTunnel is a simple getter for the underlying datagram channel.
            int packetSize = conn.getVpnTunnel().read(buffer); // int[80] garbage allocated  here
            buffer.flip();

            if (packetSize < 1) {
                // No data, wait then read.
                try {
                    Thread.sleep(5);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    break;
                }
                continue;
            }

            switch (...) {
                default:
                    throw new IllegalStateException("Invalid Message Received");
            }
        } catch (IOException e) {
            e.printStackTrace();
            break;
        }
    }
}