Вот код, который применяется для моделирования ситуации, которая будет бросать 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)
, он просто отлично работает. Зачем?
Вы можете попытаться проверить, генерирует ли он одну и ту же ссылку. Один из способов проверить - создать экземпляр Set и добавить ArrayList в набор. Сообщение, что вы можете взять счет. Если по какой-то причине jvm не создает новый экземпляр, размер набора и список будут отличаться. Стоит проверить это, чтобы понять, создается ли новый экземпляр в цикле или нет. Я попробовал то же самое с помощью java 1.7 и получил исключение Outofmemory.
-Xint
? Не думайте, что это будет GC, потому что каждый созданныйObject
должен иметь ссылку вlist
...new Object()
наnew String("Test")
.