来源:蜘蛛抓取(WebSpider)
时间:2016-12-20 14:36
标签:
java程序占用cpu过高
java获得CPU使用率,系统内存,虚拟机内存等情况 - 永源blog - ITeye技术网站
博客分类:
JXM:Monitoring and Management Interface for the Java(TM) Platform 通过jmx可以监控vm内存使用,系统内存使用等 以下是网上某博客代码,特点是通过window和linux命令获得CPU使用率。
利用java程序实现获取计算机cpu利用率和内存使用信息。
创建一个Bean用来存贮要得到的信
public class MonitorInfoBean {
/** 可使用内存. */
private long totalM
剩余内存. */
private long freeM
/** 最大可使用内存. */
private long maxM
/** 操作系统. */
private String osN
/** 总的物理内存. */
private long totalMemoryS
/** 剩余的物理内存. */
private long freePhysicalMemoryS
/** 已使用的物理内存. */
private long usedM
/** 线程总数. */
private int totalT
/** cpu使用率. */
private double cpuR
public long getFreeMemory() {
return freeM
public void setFreeMemory(long freeMemory) {
this.freeMemory = freeM
public long getFreePhysicalMemorySize() {
return freePhysicalMemoryS
public void setFreePhysicalMemorySize(long freePhysicalMemorySize) {
this.freePhysicalMemorySize = freePhysicalMemoryS
public long getMaxMemory() {
return maxM
public void setMaxMemory(long maxMemory) {
this.maxMemory = maxM
public String getOsName() {
return osN
public void setOsName(String osName) {
this.osName = osN
public long getTotalMemory() {
return totalM
public void setTotalMemory(long totalMemory) {
this.totalMemory = totalM
public long getTotalMemorySize() {
return totalMemoryS
public void setTotalMemorySize(long totalMemorySize) {
this.totalMemorySize = totalMemoryS
public int getTotalThread() {
return totalT
public void setTotalThread(int totalThread) {
this.totalThread = totalT
public long getUsedMemory() {
return usedM
public void setUsedMemory(long usedMemory) {
this.usedMemory = usedM
public double getCpuRatio() {
return cpuR
public void setCpuRatio(double cpuRatio) {
this.cpuRatio = cpuR
之后,建立bean的接口
public interface IMonitorService {
public MonitorInfoBean getMonitorInfoBean() throws E
然后,就是最关键的,得到cpu的利用率,已用内存,可用内存,最大内存等信息。
import java.io.InputStreamR
import java.io.LineNumberR
import sun.management.ManagementF
import com.sun.management.OperatingSystemMXB
import java.io.*;
import java.util.StringT
* 获取系统信息的业务逻辑实现类.
* @author GuoHuang
public class MonitorServiceImpl implements IMonitorService {
private static final int CPUTIME = 30;
private static final int PERCENT = 100;
private static final int FAULTLENGTH = 10;
private static final File versionFile = new File("/proc/version");
private static String linuxVersion =
* 获得当前的监控对象.
* @return 返回构造好的监控对象
* @throws Exception
* @author GuoHuang
public MonitorInfoBean getMonitorInfoBean() throws Exception {
int kb = 1024;
// 可使用内存
long totalMemory = Runtime.getRuntime().totalMemory() /
// 剩余内存
long freeMemory = Runtime.getRuntime().freeMemory() /
// 最大可使用内存
long maxMemory = Runtime.getRuntime().maxMemory() /
OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory
.getOperatingSystemMXBean();
// 操作系统
String osName = System.getProperty("os.name");
// 总的物理内存
long totalMemorySize = osmxb.getTotalPhysicalMemorySize() /
// 剩余的物理内存
long freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize() /
// 已使用的物理内存
long usedMemory = (osmxb.getTotalPhysicalMemorySize() - osmxb
.getFreePhysicalMemorySize())
// 获得线程总数
ThreadGroup parentT
for (parentThread = Thread.currentThread().getThreadGroup(); parentThread
.getParent() != parentThread = parentThread.getParent())
int totalThread = parentThread.activeCount();
double cpuRatio = 0;
if (osName.toLowerCase().startsWith("windows")) {
cpuRatio = this.getCpuRatioForWindows();
cpuRatio = this.getCpuRateForLinux();
// 构造返回对象
MonitorInfoBean infoBean = new MonitorInfoBean();
infoBean.setFreeMemory(freeMemory);
infoBean.setFreePhysicalMemorySize(freePhysicalMemorySize);
infoBean.setMaxMemory(maxMemory);
infoBean.setOsName(osName);
infoBean.setTotalMemory(totalMemory);
infoBean.setTotalMemorySize(totalMemorySize);
infoBean.setTotalThread(totalThread);
infoBean.setUsedMemory(usedMemory);
infoBean.setCpuRatio(cpuRatio);
return infoB
private static double getCpuRateForLinux(){
InputStream is =
InputStreamReader isr =
BufferedReader brStat =
StringTokenizer tokenStat =
System.out.println("Get usage rate of CUP , linux version: "+linuxVersion);
Process process = Runtime.getRuntime().exec("top -b -n 1");
is = process.getInputStream();
isr = new InputStreamReader(is);
brStat = new BufferedReader(isr);
if(linuxVersion.equals("2.4")){
brStat.readLine();
brStat.readLine();
brStat.readLine();
brStat.readLine();
tokenStat = new StringTokenizer(brStat.readLine());
tokenStat.nextToken();
tokenStat.nextToken();
String user = tokenStat.nextToken();
tokenStat.nextToken();
String system = tokenStat.nextToken();
tokenStat.nextToken();
String nice = tokenStat.nextToken();
System.out.println(user+" , "+system+" , "+nice);
user = user.substring(0,user.indexOf("%"));
system = system.substring(0,system.indexOf("%"));
nice = nice.substring(0,nice.indexOf("%"));
float userUsage = new Float(user).floatValue();
float systemUsage = new Float(system).floatValue();
float niceUsage = new Float(nice).floatValue();
return (userUsage+systemUsage+niceUsage)/100;
brStat.readLine();
brStat.readLine();
tokenStat = new StringTokenizer(brStat.readLine());
tokenStat.nextToken();
tokenStat.nextToken();
tokenStat.nextToken();
tokenStat.nextToken();
tokenStat.nextToken();
tokenStat.nextToken();
tokenStat.nextToken();
String cpuUsage = tokenStat.nextToken();
System.out.println("CPU idle : "+cpuUsage);
Float usage = new Float(cpuUsage.substring(0,cpuUsage.indexOf("%")));
return (1-usage.floatValue()/100);
} catch(IOException ioe){
System.out.println(ioe.getMessage());
freeResource(is, isr, brStat);
} finally{
freeResource(is, isr, brStat);
private static void freeResource(InputStream is, InputStreamReader isr, BufferedReader br){
if(is!=null)
is.close();
if(isr!=null)
isr.close();
if(br!=null)
br.close();
}catch(IOException ioe){
System.out.println(ioe.getMessage());
* 获得CPU使用率.
* @return 返回cpu使用率
* @author GuoHuang
private double getCpuRatioForWindows() {
String procCmd = System.getenv("windir")
+ "\\system32\\wbem\\wmic.exe process get Caption,CommandLine,"
+ "KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount";
// 取进程信息
long[] c0 = readCpu(Runtime.getRuntime().exec(procCmd));
Thread.sleep(CPUTIME);
long[] c1 = readCpu(Runtime.getRuntime().exec(procCmd));
if (c0 != null && c1 != null) {
long idletime = c1[0] - c0[0];
long busytime = c1[1] - c0[1];
return Double.valueOf(
PERCENT * (busytime) / (busytime + idletime))
.doubleValue();
return 0.0;
} catch (Exception ex) {
ex.printStackTrace();
return 0.0;
* 读取CPU信息.
* @param proc
* @author GuoHuang
private long[] readCpu(final Process proc) {
long[] retn = new long[2];
proc.getOutputStream().close();
InputStreamReader ir = new InputStreamReader(proc.getInputStream());
LineNumberReader input = new LineNumberReader(ir);
String line = input.readLine();
if (line == null || line.length() & FAULTLENGTH) {
int capidx = line.indexOf("Caption");
int cmdidx = line.indexOf("CommandLine");
int rocidx = line.indexOf("ReadOperationCount");
int umtidx = line.indexOf("UserModeTime");
int kmtidx = line.indexOf("KernelModeTime");
int wocidx = line.indexOf("WriteOperationCount");
long idletime = 0;
long kneltime = 0;
long usertime = 0;
while ((line = input.readLine()) != null) {
if (line.length() & wocidx) {
// 字段出现顺序:Caption,CommandLine,KernelModeTime,ReadOperationCount,
// ThreadCount,UserModeTime,WriteOperation
String caption = Bytes.substring(line, capidx, cmdidx - 1)
String cmd = Bytes.substring(line, cmdidx, kmtidx - 1).trim();
if (cmd.indexOf("wmic.exe") &= 0) {
// ("line="+line);
if (caption.equals("System Idle Process")
|| caption.equals("System")) {
idletime += Long.valueOf(
Bytes.substring(line, kmtidx, rocidx - 1).trim())
.longValue();
idletime += Long.valueOf(
Bytes.substring(line, umtidx, wocidx - 1).trim())
.longValue();
kneltime += Long.valueOf(
Bytes.substring(line, kmtidx, rocidx - 1).trim())
.longValue();
usertime += Long.valueOf(
Bytes.substring(line, umtidx, wocidx - 1).trim())
.longValue();
retn[1] = kneltime +
} catch (Exception ex) {
ex.printStackTrace();
} finally {
proc.getInputStream().close();
} catch (Exception e) {
e.printStackTrace();
* @param args
* @throws Exception
* @author GuoHuang
public static void main(String[] args) throws Exception {
IMonitorService service = new MonitorServiceImpl();
MonitorInfoBean monitorInfo = service.getMonitorInfoBean();
System.out.println("cpu占有率=" + monitorInfo.getCpuRatio());
System.out.println("可使用内存=" + monitorInfo.getTotalMemory());
System.out.println("剩余内存=" + monitorInfo.getFreeMemory());
System.out.println("最大可使用内存=" + monitorInfo.getMaxMemory());
System.out.println("操作系统=" + monitorInfo.getOsName());
System.out.println("总的物理内存=" + monitorInfo.getTotalMemorySize() + "kb");
System.out.println("剩余的物理内存=" + monitorInfo.getFreeMemory() + "kb");
System.out.println("已使用的物理内存=" + monitorInfo.getUsedMemory() + "kb");
System.out.println("线程总数=" + monitorInfo.getTotalThread() + "kb");
其中,Bytes类用来处理字符串
public class Bytes {
public static String substring(String src, int start_idx, int end_idx){
byte[] b = src.getBytes();
String tgt = "";
for(int i=start_ i&=end_ i++){
tgt +=(char)b[i];
浏览 27810
getTotalPhysicalMemorySize()getFreePhysicalMemorySize()均只能获取到一根内存条的容量错了,仅是getTotalPhysicalMemorySize()方法
yongyuan.jiang
浏览: 321462 次
来自: 深圳
放在自己工程上不报错,已放在服务器上就报错
能运行?我报错啊、
yue_ch 写道getTotalPhysicalMemory ...
getTotalPhysicalMemorySize()get ...
private RealSubject realSubject ...查看: 16447|回复: 16
eclipse占用大量的CPU和内存的原因?
论坛徽章:0
我最近用eclipse在写程序,特别是打开一些内容多的类,CPU顺速上升,内存一直居高不降,感觉比jbuilder卡多了,我1G的内存,跑jbuilder从来感觉不到卡,用它反而卡了,本来以前装了次myeclipse,后来卡得不行,卸载了,
谁告诉我,到底是怎么回事?
论坛徽章:0
卡得要死啊,谁帮帮我啊
论坛徽章:2
应该不会占很多内存的,看看是不是其它原因!
我的是256+128都不会很卡的
论坛徽章:0
eclipse.exe倒什么都不占,就是那个javaw.exe,占的内存一般是230以上,以前装了myeclipse的时候竟然占到400+。特别是做struts的开发,烦死我了。
论坛徽章:0
你是不是起服务器了啊?
论坛徽章:0
你把eclipse的快捷方式做如下修改,咝衅饋砭蜁好得
(74 KB, 下载次数: 169)
10:10 上传
论坛徽章:0
6楼的兄弟 怎么全部 是日文啊?
论坛徽章:0
我的都不卡
我是两个SDR的内存&&CPU是XP 800&&用起都不很卡
看看是不是有病毒
论坛徽章:0
最初由 jcjcak 发布
[B]6楼的兄弟 怎么全部 是日文啊? [/B]
日文系統下的日文版唄,在中文版下也這麼設,就不會卡了.
论坛徽章:0
最初由 东逐水悠悠 发布
日文系統下的日文版唄,在中文版下也這麼設,就不會卡了. [/B]
解释一下,这些设置都是干吗的啊
itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有
北京市公安局海淀分局网监中心备案编号: 广播电视节目制作经营许可证:编号(京)字第1149号为何我的java项目运行一段时间后,物理内存使用越来越高? - 开源中国社区
当前访客身份:游客 [
当前位置:
公司的一个运行在tomcat上的java ee项目,主要功能上是作为接口服务器。服务器上物理内存8G,tomcat启动时jvm初始堆内存以及最大堆内存都设置为1400M,项目运行起来后,物理内存还剩快2G的样子。但是慢慢运行几天后,用top命令看内存使用情况,java进程占用的内存越来越多,最后把物理内存用满了,但是之后就不会在增加(不会去用swap),同时,tomcat性能上感觉没有什么影响,也不会抛出OOM什么的,负载低的时候cpu使用率也不超过10%。
后来针对这个项目有做过接口的压力测试,接口内部处理逻辑就是接受请求报文后保存到数据库,压测30分钟,机子的物理内存也是越用越多,到最后用满,但是接口的响应速度没有什么影响。整个压测过程,我用visualVM观察jvm的情况,发现堆内存基本上只用了500多M,还没达到最大值(项目启动时给虚拟机分配的初始值和最大值是1400M)。压测结束后,有50多个线程是live状态(tomcat配置的最大线程数300),看了下ThreadDump 貌似都是http请求相关的线程。
我想请教下,这种情况是否正常?既然分配的堆内存都没用完,那些后来慢慢增长的物理内存用在哪些地方了(难道是线程的栈内存?),为什么随着负载降低,这些物理内存没被释放掉呢。
这里贴下项目的JVM启动参数和tomcat server.xml设置的一些参数:
export JAVA_OPTS="-server -Xms1400M -Xmx1400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true "
----------
&Connector port="9010" protocol="HTTP/1.1"
IEncoding="UTF-8" minSpareThreads="25" maxSpareThreads="75"
disableUploadTimeout="true"
acceptCount="300" maxThreads="300" maxProcessors="1000" minProcessors="5"
useURIValidationHack="false"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
URIEncoding="UTF-8"
--------------
小弟对JVM优化的经验基本为零,各位大大能解惑的话,不胜感激,顺便跪求JVM优化相关的书籍?T_T
共有11个答案
<span class="a_vote_num" id="a_vote_num_
这应该是linux系统的缓冲吧,你可以用free命令查看一下你真实使用的内存是多少。
<span class="a_vote_num" id="a_vote_num_
哈哈,真巧啊。之前我给别的项目组做了一个web的管理系统,他们也跟我说过这个问题。后来我排查方法和你一样。不是java的问题,只要没OOM,就不存在内存泄露的问题。还有一个问题得注意,是不是JAVA占用的内存超出了你设置的值,如果是,是不是考虑什么地方使用了NIO,这部门内存是内核层的,不属于用户层,可能看不出来。
--- 共有 2 条评论 ---
不用操心了
(2年前) &
3Q! 我发现堆内存没有超出,系统也运行正常,所以才觉得纳闷=口=
(2年前) &
<span class="a_vote_num" id="a_vote_num_
书的话看看JVM性能调优
<span class="a_vote_num" id="a_vote_num_
把JVM dump出来。然后用mat分析
--- 共有 1 条评论 ---
嗯。。dump出来了,堆内存使用正常
(2年前) &
<span class="a_vote_num" id="a_vote_num_
后来发现是我查看内存的方式有问题,用top命令看到的Mem使用率是包括buffers和caches的,如果用free看的话,其实内存使用率没那么高,大部分都是缓存,这是linux的内存管理机制?
<span class="a_vote_num" id="a_vote_num_
你如果是用linux系统,
那么这种情况应该是正常的,只要系统稳定, 没啥好担心的.
<span class="a_vote_num" id="a_vote_num_
<span class="a_vote_num" id="a_vote_num_
你设置了1400m 怎么可能会超过这个值 超了就相当于OOM了(可以去看看gc的机制)
用TOP命令不合适吧 还是用jvm监控的东西 最简单的jconsole也能看到大致情况
一般情况下 cpu没满负荷 没有OOM 系统运行正常 那就没有问题
--- 共有 1 条评论 ---
嗯,我就好奇为什么top命令看到的内存都是满的,看来是我关注错地方了,应该用free来看,linux运维知识欠缺啊。
(2年前) &
<span class="a_vote_num" id="a_vote_num_
引用来自“lhjiang”的评论这应该是linux系统的缓冲吧,你可以用free命令查看一下你真实使用的内存是多少。嗯,用free命令看的话就是正常了,top下看到的是cache+buffers的内存使用情况,实际上没那么多&
<span class="a_vote_num" id="a_vote_num_
更多开发者职位上
有什么技术问题吗?
Tek_Ete...的其它问题
类似的话题2011年12月 扩充话题大版内专家分排名第三
2011年9月 扩充话题大版内专家分月排行榜第二2011年7月 扩充话题大版内专家分月排行榜第二2011年2月 扩充话题大版内专家分月排行榜第二2011年1月 扩充话题大版内专家分月排行榜第二2010年10月 扩充话题大版内专家分月排行榜第二
2011年3月 扩充话题大版内专家分月排行榜第三
2012年2月 挨踢职涯大版内专家分月排行榜第三2011年11月 挨踢职涯大版内专家分月排行榜第三2011年10月 挨踢职涯大版内专家分月排行榜第三
2010年7月 扩充话题大版内专家分月排行榜第三
2009年9月 扩充话题大版内专家分月排行榜第二
2012年2月 扩充话题大版内专家分月排行榜第三2011年5月 扩充话题大版内专家分月排行榜第三2010年6月 扩充话题大版内专家分月排行榜第三
2010年1月 扩充话题大版内专家分月排行榜第二
2010年2月 扩充话题大版内专家分月排行榜第三2009年10月 扩充话题大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。