[英]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.