如何以编程方式观察程序使用了多少内存?

时间:2015-09-08 19:29:04

标签: java memory-management heap-memory

我正在JAVA开发编程竞赛经理。

比赛经理的概念:

竞赛经理的主要概念概述如下。如果您对此有所了解,可以在图片之前跳过行。

  • 服务器在Judge PC上运行。
  • 所有参赛者均与Judge作为客户联系。
  • 为参赛者提供问题陈述的硬拷贝,并在C++上编写解决方案。他们使用JAVA编写的Contest Manger软件提交解决方案。
  • 对于每个问题,判断文件中都有一些输入数据,文件中有相应的输出数据。
  • 当参赛者提交他的解决方案时,Judge服务器会根据Judge提供的输入进行操作。
  • 然后,判断服务器将参赛者的输出与之前提供的正确输出进行匹配。
  • 然后判断服务器根据匹配结果给出判决,如接受,错误答案,编译错误,超出时间限制等。
  • 每个问题都有一个预定义的时间限制。这意味着提交的解决方案必须在特定时间段内运行。 (通常范围从1秒到15秒)
  • 所有参赛者都可以看到所提交解决方案的判决结果。下面的图片将清除这种情况。这是提交队列,所有参赛者和法官都可以看到。

enter image description here

问题背景:

在图片中,您可以看到一个红色标记区域,其中每个提交的解决方案所用的时间以毫秒为单位。我可以通过以下代码轻松完成:

long start,end;
start = new Date().getTime();
int verdictCode = RunProgram(fileEXE, problem.inputFile, fileSTDOUT, problem.timeLimit);
end = new Date().getTime();
submission.timeElapsed = end - start;

此处,RunProgram函数运行提交的解决方案(程序)并针对输入文件生成输出文件。如果你需要它的细节,请稍后问我,我会描述。

主要问题:

然而,还有另一种称为Memory Limit Exceeded的判决书  这里没有实现。我想实现它。但不知道该怎么做。我用Google搜索了一下。有人讲述了剖析,但我没有得到如何正确地做,并且不知道它是否符合我的目的。

这意味着,会有一个名为Memory Elapsed的列,如Time Elapsed。 因为像Codeforces这样的在线评委已经在展示它,所以可以做到这一点。但我的问题是,是否有可能在JAVA中做同样的事情?

  • 如果是,那怎么样?
  • 如果不是,那你怎么能确定?

注意:

  • 该软件有一些依赖性。它必须在Windows平台上运行。

2 个答案:

答案 0 :(得分:1)

我认为你在询问用C ++编写的本机程序的统计数据,对吗?您无法使用Java测量操作系统中其他程序的内存使用情况,您只能获取有关Java中当前 JVM的内存信息。要测量内存使用情况或其他进程的CPU使用情况,您需要一个依赖于平台的解决方案(使用JNI运行的本机代码)。幸运的是,人们已经实现了这样的事情,因此您可以使用普通的Java对象来执行您想要的操作,而无需编写任何C / JNI代码。查看Hyperic Sigar库,以便轻松地执行您想要的操作。

答案 1 :(得分:0)

我想你想要Runtime class

Runtime runtime = Runtime.getRuntime(); 
System.out.println("Free memory: " + runtime.getFreeMemory() + " / " + rutime.getMaxMemory());