Как запустить пользовательский код очистки, чтобы JVM не выбрасывал OutOfMemory? [Дубликат]

Интересно, что ни один из ответов на этой странице не упоминает два крайних случая, надеюсь, никто не возражает, если я их добавлю:

Случай с краем # 1: одновременный доступ к Словарю

Родовые словари в .NET не являются потокобезопасными, а иногда могут бросать NullReference или даже (чаще) a KeyNotFoundException при попытке получить доступ к ключу из двух параллельных потоков. Исключение в этом случае является довольно ошибочным.

Случай с краем # 2: небезопасный код

Если код NullReferenceException задан кодом unsafe, вы можете посмотреть на переменные указателя , и проверьте их на IntPtr.Zero или что-то в этом роде. Это одно и то же («исключение нулевого указателя»), но в небезопасном коде переменные часто переводятся в типы значений / массивы и т. Д., И вы ударяете головой о стену, задаваясь вопросом, как тип значения может исключение.

(Еще одна причина для небезопасного использования небезопасного кода, если вам это нужно)

10
задан zneak 16 March 2012 в 07:35
поделиться

4 ответа

Вы можете зарегистрировать javax.management.NotificationListener, который вызывается при достижении определенного порога.

Что-то вроде

final MemoryMXBean memBean = ManagementFactory.getMemoryMXBean();
final NotificationEmitter ne = (NotificationEmitter) memBean;

ne.addNotificationListener(listener, null, null);

final List<MemoryPoolMXBean> memPools = ManagementFactory
    .getMemoryPoolMXBeans();
for (final MemoryPoolMXBean mp : memPools) {
  if (mp.isUsageThresholdSupported()) {
    final MemoryUsage mu = mp.getUsage();
    final long max = mu.getMax();
    final long alert = (max * threshold) / 100;
    mp.setUsageThreshold(alert);

  }
}

Где слушатель - это ваша собственная реализация NotificationListener.

7
ответ дан henry 25 August 2018 в 08:10
поделиться

Вы можете попробовать следующее:

// Get current size of heap in bytes
long heapSize = Runtime.getRuntime().totalMemory();

// Get maximum size of heap in bytes. The heap cannot grow beyond this size.
// Any attempt will result in an OutOfMemoryException.
long heapMaxSize = Runtime.getRuntime().maxMemory();

// Get amount of free memory within the heap in bytes. This size will increase
// after garbage collection and decrease as new objects are created.
long heapFreeSize = Runtime.getRuntime().freeMemory();

Как найдено здесь - http://www.exampledepot.com/egs/java.lang/GetHeapSize.html

3
ответ дан Nikhil 25 August 2018 в 08:10
поделиться

Я не уверен в этом, но не могу JConsole решить вашу цель?

0
ответ дан Shashank Kadne 25 August 2018 в 08:10
поделиться

Просто используйте WeakReferences для отбрасываемых результатов, тогда они будут отброшены, если необходимо, по соображениям пространства.

1
ответ дан user207421 25 August 2018 в 08:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: