写/读包产生垃圾

时间:2014-10-14 17:41:26

标签: java android thread-sleep datagram garbage

我在Android上有一个客户端,它使用Android VPNService公开的TUN接口来拦截软件包。在这方面,我读取所有传入的数据包并将它们写入TUN接口。这基本上意味着我为我收到的每个数据包写一个写。这个的问题在于,对于每次写入和读取调用,Android分别分配int[67] and int[80],这是很多垃圾,导致大量重复的垃圾收集。

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

中读到
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;
        }
    }
}

当我读取数据包/消息时,我剥离并检查我的自定义类型标头(1个字节)并将所有相应的数据包写入Android TUN界面。

现在我的问题是,我是否可以减少不使用缓冲读取而产生的垃圾量?我可以以任何方式缓存异常,以便它不必为每个读写调用分配新的异常吗?或者它根本不可能,我应该调整我的Thread.sleep等待时间吗?

请记住,这个读取调用基本上是读取客户端收到的所有数据包,所以我有点好奇我应该睡多少。一方面我不想等待有数据包传入,但另一方面,减少睡眠定时器会产生更多的读取调用,导致更频繁的垃圾收集。

希望你能提前给我一些建议。

0 个答案:

没有答案