Как запустить процесс Java из C ++ и получить память, которую он использует? - PullRequest
0 голосов
/ 10 февраля 2012

Я не могу на всю жизнь заставить GC работать последовательно, чтобы измерить количество памяти, используемой экземплярами некоторого класса.GC просто непредсказуемо (потратил 2 дня на поиски в Google, поэтому, если вы предоставите ссылки, пожалуйста, убедитесь, что вы попробовали, и это сработало, иначе я, скорее всего, уже знаю о вашем решении)

I 'Я использую Java EE 5, поэтому JVisuamVM для меня недоступен.

Поэтому я подумал о том, чтобы перейти на JNI, запустить свои процессы из кода C ++ и получить объем используемой ими памяти, поскольку я слышал, что C ++ может это сделатьчто.

Я уже использовал JNI для вещей типа "привет, мир", поэтому мне не нужно пошаговое введение, мне просто нужно знать, как я запускаю другой процесс изC ++ (что-то похожее на Runtime.getRuntime (). Exec ("java MyClassWithMainMethod");) и как мне получить память, используемую этим процессом.

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Если у вас утечка памяти, попробуйте использовать JProfiler или любой другой профилировщик Java.

Чтобы создать процесс в Windows:

STARTUPINFO info={sizeof(info)};
PROCESS_INFORMATION processInfo;
if (CreateProcess(path, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &info, 
    &processInfo))
{
    PROCESS_MEMORY_COUNTERS pmc;
    if ( GetProcessMemoryInfo( processInfo.hProcess, &pmc, sizeof(pmc)) )
    {
        printf( "\tPageFaultCount: 0x%08X\n", pmc.PageFaultCount );
        printf( "\tPeakWorkingSetSize: 0x%08X\n", 
              pmc.PeakWorkingSetSize );
        printf( "\tWorkingSetSize: 0x%08X\n", pmc.WorkingSetSize );
        printf( "\tQuotaPeakPagedPoolUsage: 0x%08X\n", 
              pmc.QuotaPeakPagedPoolUsage );
        printf( "\tQuotaPagedPoolUsage: 0x%08X\n", 
              pmc.QuotaPagedPoolUsage );
        printf( "\tQuotaPeakNonPagedPoolUsage: 0x%08X\n", 
              pmc.QuotaPeakNonPagedPoolUsage );
        printf( "\tQuotaNonPagedPoolUsage: 0x%08X\n", 
              pmc.QuotaNonPagedPoolUsage );
        printf( "\tPagefileUsage: 0x%08X\n", pmc.PagefileUsage ); 
        printf( "\tPeakPagefileUsage: 0x%08X\n", 
              pmc.PeakPagefileUsage );
    }
    ::WaitForSingleObject(processInfo.hProcess, INFINITE);
    CloseHandle(processInfo.hProcess);
    CloseHandle(processInfo.hThread);
}

Ссылки:
http://msdn.microsoft.com/en-us/library/ms682512(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms683219.aspx

1 голос
/ 10 февраля 2012

Нет никакого независимого от платформы способа сделать это, но вы запускаете процесс Java, как любой процесс командной строки. В UNIX это, вероятно, будет означать fork () и exec (), для первого вызова вы должны сделать if(( pid = fork() )), предоставляя вам идентификатор процесса нового процесса (который вы затем выполняете). (Обратите внимание, что else () означает, что вы находитесь в текущем процессе).

Как только вы выполнили и запустили процесс, вы узнаете его идентификатор процесса (он был возвращен fork ())

и вы можете использовать системные инструменты для проверки использования памяти, как: Как измерить фактическое использование памяти приложением или процессом?

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