Ненормальное выделение памяти кучи в HTTP2 - PullRequest
1 голос
/ 25 марта 2019

Я создаю Службу обмена сообщениями, используя Tomcat Server. Я также использую сетевой протокол HTTP2 (+ Nio) и настроил Tomcat Connector для его использования. При тестировании с небольшим количеством пользователей моя куча JVM увеличивается в геометрической прогрессии. Проверка дампа кучи с помощью MAT дает множество класса процессора HTTP2 Stream, вызываемого при записи / чтении данных в браузер.

Эти классы Stream Processor используют CharHeap и Byte Heap для записи данных клиенту. До этого все хорошо, но эти Временные объекты продолжают сохраняться в Heap с классом процессора Stream, поскольку это - Garbage Root. Поскольку соединение HTTP2 будет уничтожено только после закрытия страницы пользователем, объект класса потокового процессора также сохранится, и поэтому все объекты, используемые для записи / чтения данных из / в браузер, продолжат сохраняться и увеличат объем кучи памяти

Я использую Ubuntu OS, Tomcat v9.0.14, Java v9.

MAT подозрительный отчет дает

191 экземпляр «org.apache.coyote.http2.Stream», загруженный «java.net.URLClassLoader @ 0x6c01e4148», занимает 29 509 752 (61,19%) байта.

Моя конфигурация коннектора Tomcat:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true" > <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /> 
/* Certificate options here*/
 </Connector>

Это поведение по умолчанию при использовании HTTP2? Если да, есть ли способ уменьшить объем динамической памяти (разыменование объектов из потокового процессора HTTP2)? или я смотрю не в ту сторону?

...