为什么运行javajava cpu占用高 分析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年前)&nbsp&
3Q! 我发现堆内存没有超出,系统也运行正常,所以才觉得纳闷=口=
(2年前)&nbsp&
<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年前)&nbsp&
<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年前)&nbsp&
<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月 扩充话题大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 java程序占用cpu过高 的文章

 

随机推荐