繁体   English   中英

如何从C ++启动Java进程并获取其使用的内存?

[英]How to start a java process from C++, and get the memory it uses?

我无法终生让GC始终如一地工作,因此无法衡量某个类的实例使用的内存量。 GC只是不可预测的(花了2天的时间进行了谷歌搜索,因此,如果您提供参考,请确保您已尝试过它,并且能正常工作,否则我很可能已经知道您的解决方案)

我正在使用Java EE 5,因此JVisuamVM对我不可用。

所以我考虑使用JNI,从C ++代码开始我的进程,并获取它们使用的内存量,因为我听说C ++可以做到这一点。

我已经将JNI用于“ hello world”之类的事情,所以我不需要逐步介绍,我只需要知道如何从C ++启动另一个进程即可 (类似于Runtime.getRuntime()。 exec(“ java MyClassWithMainMethod”);),以及如何获取该进程使用的内存。

如果发生内存泄漏,请尝试使用JProfiler或任何其他Java Profiler。

在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/zh-CN/library/ms682512(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms683219.aspx

没有平台无关的方法来执行此操作,但是就像启动任何命令行过程一样,您可以启动Java进程。 在UNIX上,这可能意味着fork()和exec(),对于第一个调用,您将执行if(( pid = fork() ))给您新进程的进程ID(然后在其上执行)。 (请注意,else()表示您正在使用当前进程)。

执行并启动流程后,您将知道其流程ID(由fork()返回)

您可以使用系统工具来检查其内存使用情况,就像: 如何测量应用程序或进程的实际内存使用情况?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM