2015-06-02 2 views
0

У меня есть приложение, которое запускает собственный код из DLL. Нативный код создает много объектов и занимает весь баран. В моем приложении Java я продолжаю проверять доступную оперативную память (Physical), и когда достиг определенного уровня, я вызываю System.runFinalization(), который, конечно, занимает некоторое время, но освобождает память, которая была занята объектами из собственного кода, который не имеет живой ссылки.Java System.runFinalization() на сервере Windows 2012

Теперь проблема в том, что это очень хорошо работает в Windows 7, но мой клиент использует Windows Server 2012. Когда System.runFinalization() выполняется на сервере, память не освобождается сразу (как это делается на Windows 7), но для освобождения всей памяти требуется около 5 минут, и приложение продолжает ждать выполнения System.runFinalization() в течение этого времени. Обратите внимание, что в Windows 7 освобождение памяти не является немедленным, но все же оно завершено всего за несколько секунд. Любая помощь будет действительно оценена!

+0

Что вы подразумеваете под * «память не выдается немедленно» *? Сбор мусора и, таким образом, доступный как часть управляемой кучи или выпущенный обратно в ОС? * «Нативный код создает много объектов» * объекты java (через JNI) или объекты C++? Вы должны более точно описать свой сценарий. – the8472

+0

Сразу же означает, что он не отражается в диспетчере задач, он просто перестает увеличиваться. System.runFinalization не освобождает элемент управления до тех пор, пока память не будет освобождена примерно через 5 минут, а затем будет выполнен следующий оператор в коде. –

+0

ли он потребляет циклы процессора во время выполнения финализации? это страница в памяти? – the8472

ответ

0

От JavaDocs:

public static void runFinalization() 

Запускает финализации, методы каких-либо объектов, ожидающих завершения. Вызов этого метода предполагает, что затраты на виртуальную машину Java усиливаются для запуска методов окончательной обработки объектов, которые были , которые были отброшены, но методы финализации которых еще не были выполнены . Когда управление возвращается из вызова метода, Java Virtual Machine приложил все усилия для завершения всех выдающихся завершений .

Нет гарантий, что когда будет называться finalize() или даже если оно будет называться.

+0

Я это понимаю, но в моем случае на сервере, который полностью (почти) занят 16G, и когда я вызываю метод runFinalization, ram выдается примерно через 5 минут, а затем runFinalization возвращает элемент управления затем выполняется программа и следующий оператор. –

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