2012-03-12 2 views
6

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

+6

По определению поток имеет то же пространство памяти, что и другие потоки процесса. Ваш вопрос не имеет большого смысла. JVM = процесс. 1 имеет много потоков. –

+0

JVM = процесс, это означает, что каждый процесс java имеет собственную JVM? – Nicolas

+0

Да. Когда вы запускаете java, вы запускаете новую JVM. –

ответ

2

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

Поэтому достаточно, чтобы полагаться на

0

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

1

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

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


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

Смежные вопросы