请问用Java代码,怎样测试一段程序占用了多少内存?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问用Java代码,怎样测试一段程序占用了多少内存?相关的知识,希望对你有一定的参考价值。

比如说有个下载pdf的功能,我要测试一下下载pdf这个功能到底占用多少内存,用程序代码怎样测试?组长给我的想法是,要对下载pdf功能进行内存监控,如果即将内存溢出则跳转到错误页面。

你可以先用内存监控工具,进行监控,看看这个功能到底用多少内存。如果不多,其实都不需要实现你说的代码监控的。如果你要使用代码监控,你可是使用Runtime类的几个属性,MaxMemory、FreeMemory、TotalMemory。然后实现个线程,在下载pdf功能前开启线程,然后完毕时关闭线程,如果内存即将溢出(设定个阈值,比如说15%),就报错,跳转到错误页面。 参考技术A 你就直接打开任务管理器,查看java.exe的进程,内存占用如果一直增加,达不到一个稳定值,你可以尝试先设置-Xmx增大内存,如果内存还是一直增加直至溢出,那就是你程序上出现内存泄露的问题了.内存溢出捕获这个异常在异常处理那里跳转就可以了. 或者你用JAVA的内存监测工具监测内存使用 ,如果解决不了,可以继续追问追问

不是用工具啊,是自己写程序代码来实现监控。

追答

最简单的都是通过任务管理器来看内存的,一般的内存溢出都可以解决,如果有溢出,那里的内存会突然增大,如果用程序写,没办法得到的准确的内存占用,内存泄露基本上都是程序上问题,全局对象有没有及时释放,数据库连接,结果集没及时关闭,一个方法里大量使用String里的+,解析大xml用JDOM等都会是导致内存溢出的因素,你要检查那里出现的内存溢出,你这个下载PDF如果把PDF都加载都内存中如果PDF比较大,你这个也很可能出现溢出,增大内存也是治标不治本的方法,从数据库取值如果是大文本这个字段所占内存基本都能估计出来的.

参考技术B /*计算某一段程序消耗的内存和时间*/
Runtime r = Runtime.getRuntime();
r.gc();//计算内存前先垃圾回收一次
long start = System.currentTimeMillis();//开始Time
long startMem = r.freeMemory(); // 开始Memory
GBSort(array,1,len);//!!!!!被测的程序!!!!!
long endMem =r.freeMemory(); // 末尾Memory
long end = System.currentTimeMillis();//末尾Time
//输出
System.out.println("TimeCost: "+String.valueOf(end - start)+"ms");
System.out.println("MemoryCost: "+String.valueOf((startMem- endMem))+"KB");
参考技术C 一般是监控用Jconsole吧。这个可以监控。jdk自带的。
内存溢出是可以捕获的。所以出现异常就跳到错误页面可以实现追问

怎么监控?能具体点么?前提是不是用工具来人为进行监控,而是让程序自动进行监控。

追答

可以参考这个类,Runtime可以得到一些你需要的信息。
jconsole是个监控的软件。优化的时候使用。

参考技术D 这个不能吧,可以根据你自己程序中变量的数量和规模大概估算一下。

以上是关于请问用Java代码,怎样测试一段程序占用了多少内存?的主要内容,如果未能解决你的问题,请参考以下文章

如何手动释放一个java线程占用的资源

怎样释放JAVA程序运行中所用的内存

如何用Java编写一段代码引发内存泄露

linux 命令ps -aux 查看进程所占内存大小,怀疑一个进程存在内存泄露,每个一段时间,内存大小增加4kB

一个Java对象到底占用多大内存

如何获得一个存活的java对象的内存占用大小?