Использование памяти потоком или процессом в Java - PullRequest
6 голосов
/ 13 марта 2012

В моем приложении я запускаю несколько потоков с ненадежным кодом, поэтому я должен предотвратить переполнение памяти. У меня есть WatchDog, который анализирует время текущего потока (потоки были вызваны в последовательном режиме). Но как я могу определить использование памяти? Я знаю только использование памяти всей виртуальной машины с Runtime.totalMemory()? Если есть возможность выяснить использование потока или использование отдельного процесса, было бы здорово. С использованием памяти процесса я мог вычислить использование потока так или иначе.

Ответы [ 3 ]

2 голосов
/ 09 июля 2012

Поскольку JVM, выполняющая программу Java, является процессом Java, вам не нужно об этом беспокоиться.Все потоки разделяют одно и то же пространство памяти в процессе JVM.

Следовательно, достаточно полагаться на

1 голос
/ 09 июля 2012

Java-приложение не может контролировать объем памяти или (или ЦП), используемый его потоками, независимо от того, выполняются ли потоки доверенного или ненадежного кода. Там нет API для выполнения это в современных поколениях JVM. И конечно, нет никаких API для мониторинга использования памяти потоком. (Даже не ясно, что это значимое понятие ...)

Единственный способ гарантировать использование ресурсов недоверенного Java-кода - это запустить код в отдельной JVM и использовать элементы управления ресурсами уровня операционной системы (такие как ulimit, nice, sigstop и т. Д.) И "-Xmx "чтобы ограничить использование ресурсов этой JVM.


Некоторое время назад Sun выпустила JSR 121 для решения этой проблемы. Этот JSR позволил бы разделить приложение на части (называемые «изолятами»), которые обменивались данными с помощью передачи сообщений, и предоставлял возможность одному изолятору отслеживать и контролировать другое. К сожалению, API-интерфейсы Isolate еще не были реализованы в любой основной JVM.

0 голосов
/ 09 июля 2012

Что вам нужно сделать, это запустить ненадежный код в своем собственном процессе / JVM. Это возможно с использованием интерфейсов JNI (если ваша операционная система разрешает это).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...