У меня есть клиент на Android, который использует интерфейс TUN, предоставляемый Android VPNService для перехвата пакетов. В этом отношении я читаю все входящие пакеты и записываю их в интерфейс TUN. Это в основном означает, что я пишу для каждого получаемого пакета. Проблема с этим заключается в том, что, по-видимому, для каждого вызова для записи и чтения Android выделяет int [67] и int [80] соответственно, что является большим количеством мусора, что приводит к множеству повторяющихся сборок мусора.
Вот код для операции чтения, который считывает все входящие пакеты с моего сервера. Как упоминалось в комментариях, я читал с простого канала Дейтаграммы :
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?
Помните, что этот прочитанный вызов по существу читает все пакеты, полученные клиентом, поэтому мне немного любопытно, насколько я должен спать. С одной стороны, я не хочу ждать, пока есть входящие пакеты, но, с другой стороны, сокращение таймера сна приведет к появлению большего количества вызовов для чтения, что приведет к более частым сбору мусора.
Надеюсь, вы можете дать мне несколько советов, спасибо заранее.