Управление пределом памяти для JVM с использованием Xmx - PullRequest
0 голосов
/ 02 ноября 2018

Имея такое простое приложение

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        System.out.println("Enter a number: ");
        int n = reader.nextInt();
        reader.close();
    }
}

Я запускаю его с другими Xmx параметрами (имейте в виду, что JConsole был введен в процесс)

  • -Xmx1M не будет работать
  • -Xmx2M ошибка
  • -Xmx4M ничего не печатает
  • -Xmx6M и больше - будет работать

JConsole показывает мне странное использование памяти для приложения

Если запускается с -Xmx8M

  • Используется 3,0 МБ
  • Commited 8.4MB
  • Макс. 8,4 МБ

При запуске с -Xmx16M

  • Используется 4,0 МБ
  • Commited 16,8 МБ
  • Макс. 16,8 МБ

И с -Xmx32M

  • Используется 11,0MB
  • Commited 33.6MB
  • Макс. 33,6 МБ

Хотя использование внешнего программного обеспечения для измерения потребления памяти может оказать некоторое влияние на эти значения, все же кажется, что Java будет съедать все, что вы позволяете ему, даже если это не требуется. Это часть Java, которую я больше всего ненавижу, но пытаюсь понять.

Что происходит с памятью, которая не требуется моей программе, но была съедена JVM, потому что я позволил это сделать, изменив параметр Xmx? Можно ли повлиять на количество «потерянной» памяти другим способом, чем параметр Xmx?

1 Ответ

0 голосов
/ 02 ноября 2018

Ява съест все, что вы позволите ему съесть, даже если это не требуется.

Java не агрессивно очищает память. Если вы дадите ему память, она рассчитывает использовать ее для уменьшения загрузки процессора.

Могу ли я повлиять на количество «потерянной» памяти другим способом, чем параметр Xmx?

Вы можете уменьшить минимальный размер, вы можете контролировать, как быстро он растет. На самом деле, есть более 500 параметров для управления GC, но в целом совет заключается в том, чтобы установить как можно меньше, если вы действительно не знаете, что делаете, чтобы не столкнуться с проблемами, которые не произошли бы, если бы вы оставили их в покое.

Главное, что нужно помнить, это то, что ваше время это деньги, а память стоит денег. В какой-то момент не стоит тратить время на попытки сэкономить немного памяти.

На основе средней заработной платы разработчиков и средних цен на память ПК (расходы в вашей организации будут варьироваться)

1 day - 16 GB
1 hour - 2 GB
5 minutes - 160 MB
1 minute - 32 MB

Если вы тратите больше минуты, экономя менее 32 МБ, это, вероятно, того не стоило.

Это часть Java, которую я больше всего ненавижу,

Я ненавижу неправильное использование юнитов, но на самом деле я должен научиться преодолевать это

m - milli
M - Mega
b - bits
B - Bytes
1 MB = 8 Mb = 1000000000 mB = 8000000000 mb
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...