У меня есть веб-сервер Vert.x, который предоставляет службу Websocket. Сервер Vert.x отправляет некоторые данные клиенту, когда клиент регистрируется на сервере, а затем клиент отправляет ACK обратно на сервер, чтобы убедиться, что эти данные уже доставлены надежно.
Я обнаружил, что сервер Vert.x потребляет много памяти после завершения всей работы.
Ниже приведены шаги для воспроизведения проблемы:
- Config JVM parameter before starting our test:
- Open /vert.x-2.02-final/bin/
- Измените значение JVM_OPTS с "" на "-Xms128M -Xmx128M"
- Сохраните и выйдите, измените serverIpAddress на IP-адрес вашего сервера в
VertXSocketClient
.
- Клиент зарегистрируется на канале веб-сокета 1180 на сервере Vert.x. Вы можете получить код здесь: https://www.dropbox.com/s/ptenlx78iin8dmj/VertXSocketClient.java
- запустите testserver с помощью команды
vertx run testserver.java
Использование памяти сервером Vert.x будет распечатано в вашей консоли в формате:
общая память - свободная память = используемая память (МБ)
System.gc()
Runtime runtime = Runtime.getRuntime();
int mb = 1024 * 1024;
totalMemory = runtime.totalMemory() / mb;
freeMemory = runtime.freeMemory() / mb;
Я вызываю System.gc()
каждые 5 секунд, чтобы освободить память. Да, я знаю. System.gc()
не следует вызывать часто. Это негативно влияет на производительность системы. Используемая память не уменьшается без такой инструкции.
Вы можете скачать код здесь: https://www.dropbox.com/sh/6oxtfhgwffed72c/AAAX-BvYdGaTBgnRagxD9Bf-a/TestServer.java
- запустите VertXSocketClient с помощью команды
vertx run VertXSocketClient.java
Клиент автоматически зарегистрируется на сервере канала веб-сокета, и экземпляр сервера отправит данные клиенту после завершения регистрации.
Вот пример кода для отправки данных клиенту:
byte[] serverResponseData = serverResponse.getBytes();
Buffer buffer= new Buffer(serverResponseData);
ws.write(buffer);
С приведенным выше кодом используемая память будет составлять до 62 МБ после выполнения всей работы, тогда как если я закомментирую ws.write(buffer)
, то только до 15 МБ.
Я предполагаю, что сервер Vert.x всегда выделяет 62 МБ памяти на весь срок службы. Разве он не должен освобождать память после завершения работы?
ws.write
, вероятно, связано с увеличением размера буфера после записи, чтобы обеспечить возможность записи в будущем, хотя это всего лишь предположение. Однако я скажу, что на самом деле не нахожу эти цифры особенно высокими, поэтому я не уверен, почему вы беспокоитесь об этом. - person KennethJ   schedule 12.10.2014