2013-09-27 6 views
3

Я создаю программу java, в которой мой класс предполагает, что A имеет определенное предопределенное поведение. Но пользователь может переоценить мой класс, чтобы изменить его поведение. Таким образом, мой скрипт проверяет, есть ли какой-либо подкласс, чем я буду называть его поведение, но что, если он написал код кода или утечку памяти в своем коде.Как хранить память, выделенную некоторым java-методом во время выполнения

Это может нанести вред моему процессу. Есть ли какой-либо способ в java для мониторинга памяти, выделенной каким-то методом.

Просьба предложить.

+0

Вы хотите программно отслеживать использование памяти или ищете инструмент, который позволяет подключиться к работающей программе и исследовать, как она использует память? – Joni

+0

Нет. Я не хочу контролировать общий процесс (например, JMX), но я хочу, чтобы moniter конкретный метод. – Saurav

+0

Вы подключили приложение к отладчику и проверили, отслеживает ли он распределение объектов? Я смутно помню, как несколько лет назад делал что-то подобное, когда искал утечку памяти. – Torben

ответ

0

Для внешнего мониторинга, вы можете использовать VisualVM или JConsole (часть JDK), для внутреннего вы можете использовать класс Runtime:

Runtime rt = Runtime.getRuntime(); 
    long totalMem = rt.totalMemory(); 
    long maxMem = rt.maxMemory(); 
    long freeMem = rt.freeMemory(); 

Via класса Thread, вы можете проверить состояние всех потоков. Никогда не использовал его напрямую, потому что серверы приложений или API обработки пакетной обработки выполняют свою работу ... Поэтому мне не нужно изобретать колесо. И я предлагаю использовать такие инструменты, как VisualVM ...

EDIT: Смотрите также эту тему: Why do threads share the heap space?

Вы не можете анализировать использование кучи из одной нити. Если у вас возникли проблемы с выполнением внешнего кода, вы должны уделить ему внимание так же хорошо, как и другие потоки, и проанализировать потоки или кучи. Это можно сделать, как указано в VisualVM или JConsole, который также был добавлен Oracle (или SUN).

+0

OP явно запросил способ контролировать память, выделенную методом, а не для способа контролировать память, выделенную всей JVM, что делает это предложение. – Torben

+0

Но анализ всей JVM также может помочь. Да, возможно, используя режим DEBUG. И метод не потребляет память ... Даже нить не ... –

0

У Oracle есть довольно хороший документ об устранении утечек памяти. Это предполагает, что в качестве инструмента следует использовать NetBeans Profiler.

http://www.oracle.com/technetwork/java/javase/memleaks-137499.html

Я считаю, что вы можете использовать один и тот же API отладки для проверки на плохое поведение кода в то время как он работает, но это придет с потерей производительности и, вероятно, сродни убийству муху кувалдой. Я лично не позволил бы что-нибудь подобное вступить в производство. Вместо этого я бы опирался на тщательное тестирование и экспертную оценку.

+0

Профилировщик NetBeans также является просто инструментом анализа JVM, при этом вам, скорее всего, придется использовать среду NetBeans. –

1

но что, если он написал некоторые блокирующий код или лук-порей памяти в его код

Прежде всего я предлагаю вам документировать класс хорошо. Опишите, что пользователю разрешено делать, а что нет. Приведите примеры использования, если это возможно.

Для части кода блокировки, если у вас есть проблемы с синхронизацией, вы можете обернуть выполнение метода, скажем, Future и разрешить ExecutorService выполнить код. Таким образом, вы сможете отменить выполнение, если выполнение занимает слишком много времени.

Для проблемы с утечкой памяти, я думаю, вы не говорите об утечках памяти, а увеличиваете потребление памяти, вызванное вызовом переопределенного метода. Утечки памяти в java редки в конце концов.

Вы не сможете обнаружить потребление памяти методом, это не так, как работает Java. Память глобальная. Что вы будете делать, если, например, загружена внешняя библиотека (JNI) или какая-то библиотека в пути к классам, которая теперь будет использовать больше памяти? Ты просто не можешь сказать.

Другие, тогда мониторинг общего потребления памяти, нет другого способа (кто-то скажет мне, если я ошибаюсь).

+0

Да, похоже, я тоже написал ... Поэтому я предложил использовать инструменты анализа кучи. –

0

В зависимости от того, какое поведение может выполнять подкласс, мы можем подумать о вариантах. Например, если это операция, связанная с базой данных, мы можем заставить их выполнять очистку соединений, если она основана на файлах, мы можем заставить их прочитать файл через ваш класс и проверить, насколько велик файл, если это любой HTTP-вызов или некоторые другие функции потоковой передачи, мы можем смотреть на принудительные ограничения соответственно.

Если вы просто обеспокоены загрузкой размера кучи и утечками памяти, вы можете посмотреть на http://java.dzone.com/tips/getting-jvm-heap-size-used, в котором объясняется, как получить программную память во время выполнения. Но тогда вам придется делать периодические проверки, и вы никогда не можете быть уверены в том, что использование памяти вызвано поведением подкласса.

0

Я только что нашел this в то время как я пытался создать средство, которое регистрирует распределение памяти:

В посте How to track any object creation in Java since freeMemory() only reports long-lived objects? указано, что есть проект с открытым исходным кодом Java Allocation Instrumenter, что вы могли бы использовать, чтобы зарегистрировать свой собственный обратный вызов (у него также есть примеры) и с помощью этого вы можете получить то, что вам нужно.

Я начал несколько дней назад, чтобы работать над подобным проектом, и, исследуя, я нашел ваш вопрос и нижеследующий пост.

лично мне нужен этот вид кода в некоторых модульных тестах, чтобы проверить, если один выделяет слишком много объектов внутри критических методов и обнаружил, что использование Runtime класса был не потому, что наши правила Garbage collector может помешать и тест записал отрицательные числа для выделенной памяти.

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