Почему OOM не выбрасывается, когда я увеличиваю аргументы xms и xmx

1

Вот код, который применяется для моделирования ситуации, которая будет бросать OOM:

public class OOMTest {
    public static void main(String[] args)  {
        heapOOM();
    }

    public static void heapOOM()     {
        List<Object> list = new ArrayList<Object>();
        while(true) {
            list.add(new Object());
        }
    }
}

Когда я применяю аргументы, как xmx ниже, в которых xmx и xms ниже 18M, он отлично работает и будет бросать OOM:

-Xms18M -Xmx18M -XX:+HeapDumpOnOutOfMemoryError

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

Но когда xmx и xms больше, чем 19M, проект будет запускаться без остановки, при этом в диспетчере задач будет колебаться около 39 МБ.

Может ли кто-нибудь дать мне некоторое представление о том, почему это явление происходит? Большое спасибо!

PS Когда я меняю new Object() на new String("test") или new Long(2), он просто отлично работает. Зачем?

  • 0
    Может быть, JIT оптимизирует это? Что произойдет, если вы запустите свою программу с флагом -Xint ? Не думайте, что это будет GC, потому что каждый созданный Object должен иметь ссылку в list ...
  • 0
    Пожалуйста, попробуйте заменить new Object() на new String("Test") .
Показать ещё 16 комментариев
Теги:
jvm
out-of-memory

1 ответ

0

Вы можете попытаться проверить, генерирует ли он одну и ту же ссылку. Один из способов проверить - создать экземпляр Set и добавить ArrayList в набор. Сообщение, что вы можете взять счет. Если по какой-то причине jvm не создает новый экземпляр, размер набора и список будут отличаться. Стоит проверить это, чтобы понять, создается ли новый экземпляр в цикле или нет. Я попробовал то же самое с помощью java 1.7 и получил исключение Outofmemory.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню