javajava中运行时异常cou

windows下查找java应用占用CPU过高问题
最近在测试一个用java语言实现的数据采集接口时发现,接口一旦运行起来,CPU利用率瞬间飙升到85%-95%,一旦停止就恢复到40%以下,这让我不得不面对以前从未关注过的程序性能问题。
在硬着头皮查找资料定位错误修正bug的过程中参考了下面两篇文章:
windows下揪出java程序占用cpu很高的线程 并找到问题代码 死循环线程代码:
java程序cpu占用过高问题分析:(这篇文章中的图片显示不了)
最初想通过java自带的jconsole和jvisualvm来调试,但发现jconsole只能知道应用整体情况,不能定位问题,而jvisualvm最多查找到类,
如果所示,但不能更详细的进行定位。于是参考了上面两篇文章一步步实现了最终目的。
一、查找进程
查找问题进程比较简单,因为问题集中在CPU资源占用过高,那么我们查找进程时只需关注CPU。方法有两种:
1、查看Windows任务管理器
打开Windows任务管理器,查看——&选择列,勾选PID,然后查看进程项,并让其按照CPU列排序如图,找到 javaw.exe进程,其PID是9272。
2、利用jvisualvm工具
打开工具,然后启动应用,在Applications面板中即可看到应用所在进程的PID9272。
需要注意的是该工具并不能定位到线程。
查找到进程以后,将该进程的信息保存到本地,在cmd命令窗口中执行命令:jstack 9272 & C:\test\cdf.log,该命令的作用是将PID为9272的进程信息保存在本地C:\test\cdf.log文件中。
二、查找线程
根据进程查找线程,也有两种方法。
1、使用window自带命令pslist
首先确认系统是否安装了pslist命令程序,如果命令不识别即没有安装,则上微软官方网址http://technet.microsoft.com/en-us/sysinternals/bb896682.aspx下载,下载完将其解压到C:\Windows\System32路径下即可使用。
在cmd命令窗口中执行命令:pslist -dmx 9272,该命令的作用是罗列属于9272进程的线程信息。
通过该命令可以看到TID为的线程占用资源最多。这样就基本确定了线程。
2、利用微软提供的Process Explorer工具
一般在windows下只能查看进程的CPU占用率,想要查看线程的CPU占用率可以通过该工具。下载地址是:http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
下载后运行起来,找到PID为9272的进程
右键点击Properties...选项,看到如下信息:
可以看到占用CPU最多的也是TID为的两个线程。
三、问题定位
问题定位需要以下步骤:
1、将线程TID转换为十六进制
因为通过jstack工具导出的信息中线程TID是十六进制的,所以我们首先转换进制,这里通过系统自带的计算器进行转换。
记录下2498这个数字。
2、在jstack工具导出的cdf.log中查找“2498”
通过Notepad++工具打开该文档,搜索到如下信息,可以看到问题定位到了MQStart.java:174。
去程序中需找该代码:
同理,对于TID=12484的线程也如同以上步骤进行查找,找到了170行代码。
由此基本可判断问题就出在了该段代码上。
四、修复bug
1、查找原因
通过以上步骤已经定位到了代码片段,但是这段代码看上去没什么错误,查找资料说很多情况是进入死循环了,但是这里确定不会死循环。思路似乎进入了死胡同。
无奈之下我将170行的if内的代码段全注释掉了,发现CPU依然飙高,这说明并不是这几行代码的错误,然后我if内做了一个输出操作,发现程序快速的不间断的进行输出。
看到这个结果我突然醒悟,这段代码虽然没有进入死循环,但是循环内的代码并不复杂,而且没必要如此频繁的进行检查操作,这中间应该停歇一下。
2、修改方法
根据以上分析,我修改了这段代码:
再次运行测试发现CPU维持在50%以内。
O了,大功告成!
学习java性能调优书籍
Java程序性能优化 让你的Java程序更快、更稳定.pdf:
java优化占用内存的方法(一)
MyEclipse javaw.exe 占用内存资源过大的主要原因
如何找到 java 程序 CPU 使用率100%的原因
java分析CPU过高方法(Windows系统)
JAVA进程高CPU占用故障排查
记一次线上Java程序导致服务器CPU占用率过高的问题排除过程
Java线上应用故障排查之一:高CPU占用
windows下揪出java程序占用cpu很高的线程 并找到问题代码 死循环线程代码
分析JAVA应用CPU占用过高的问题
Java所编写的程序在运行的时候占用内存是否真的很大了?
没有更多推荐了,Eclipse启动时显示Could not create the Java Virtual Machine 如何解决?_百度知道
Eclipse启动时显示Could not create the Java Virtual Machine 如何解决?
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
解决方法:1、找到安装eclipse时的路径。2、在窗口搜索栏中输入org.eclipse.ui.ide.prefs,搜索该文件。3、右键单击该文件,用文本将其打开。4、修改完之后将其保存将“SHOW_WORKSPACE_SELECTION_DIALOG”的值修改为true。5、再次回到桌面,双击eclipse启动图标,这一次启动,但是需要重新建立一个新的工作空间。6、启动成功。Eclipse :是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。主要组成:Eclipse是一个开放源代码的软件开发项目,专注于为高度集成的工具开发提供一个全功能的、具有商业品质的工业平台。它主要由Eclipse项目、Eclipse工具项目和Eclipse技术项目三个项目组成,具体包括四个部分组成--Eclipse Platform、JDT、CDT和PDE。JDT支持Java开发、CDT支持C开发、PDE用来支持插件开发,Eclipse Platform则是一个开放的可扩展IDE,提供了一个通用的开发平台。它提供建造块和构造并运行集成软件开发工具的基础。Eclipse Platform允许工具建造者独立开发与他人工具无缝集成的工具从而无须分辨一个工具功能在哪里结束,而另一个工具功能在哪里开始。软件开发包:Eclipse SDK(软件开发者包)是Eclipse Platform、JDT和PDE所生产的组件合并,它们可以一次下载。这些部分在一起提供了一个具有丰富特性的开发环境,允许开发者有效地建造可以无缝集成到Eclipse Platform中的工具。Eclipse SDK由Eclipse项目生产的工具和来自其它开放源代码的第三方软件组合而成。Eclipse项目生产的软件以 GPL发布,第三方组件有各自自身的许可协议。
采纳率:100%
检查一下你的jdk有没有安装。检查你的环境是否正确。至于如何检查,请看图或百度。
jdk环境没问题,那么可能就是你eclipse.ini里面动过了,-Xmx可能太大了,你改小点试试。但要注意一下几点(Myeclipse跟Eclipse一样的):1.
本回答被提问者和网友采纳
Eclipse启动时显示Could not create the Java Virtual Machine原因是eclipse版本和虚拟机不兼容导致。解决办法:打开eclipse所在目录,找到 eclipse.ini文件,将其修改为如下内容,即可启动Eclipse
你的JDK是否已经安装成功,并且是否已经配置了java的环境变量。
确定做好以上两步骤,eclipse解压就能用的。最后一点: JDK和eclipse都是有32位和64位的, 要和电脑系统位数保持一致才行。
都没问题吧,eclipse和JDK都是64位啊
删除C:\Windows\System32目录下的Java.exe、javaw.exe、javaws.exe这三个文件。试试看
其他2条回答
为您推荐:
其他类似问题
勃兰兑斯的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。&&完打开eclipse时为什么报错:Error:could not find java SE Runtime Environment?由编辑于 9:56:191个牛币所有回答列表(5)&LV20jdk版本环境不对?最佳答案&LV19用java -version测了没问题 javac也没有问题&LV3环境变量 没配置 好&LV10在 计算机 属性里 &找环境变量,配置下&LV2eclipse.iniw文件里的-vmC:\Program Files (x86)\Java\jdk1.8.0_101\bin\javaw.exe 要是对的 &还有就是eclipse版本跟jdk的版本 必须都是32位 或都是 64位完完等完等完等完等完等等相关问答完完完等等完完等等等等等最近浏览暂无贡献等级&LV2&LV2暂无贡献等级&LV1&LV2&LV3&LV11&LV17&LV2扫描二维码关注最代码为好友"/>扫描二维码关注最代码为好友,运行java出现问题。
本篇记录tomcat的配置。请新建文件${TOMCAT}/bin/setenv.sh(或者Windows下:${TOMCAT}/bin/setenv.bat),tomcat会自动读取该配置。
OutOfMemoryError: Java heap space 堆空间不足
Error occurred during initialization of VM Could not reserve enough space for object heap Error: Could not create the Java Virtual Machine.
发现是虚拟机要使用的堆容量不足。
修改环境变量,调整堆内存大小
1.Linux修改环境变量
vi /etc/environment
2.增加此行
export _JAVA_OPTIONS=&-Xms64m -Xmx64m -Xmn32m&
其中的64m表示使用64M的内存。-Xms是堆的最小大小,-Xmx是堆的最大值,-Xmn是堆中的新生代最小值。Xmn中的值不能超过总的堆内存大小
3.生效环境变量
source /etc/environment
4.运行java。看看能否运行,如果还是不能运行,到第二步,减小内存。
java -version
OutOfMemoryError: PermGen space 永久代保存区域溢出
PermGen是虚拟机中的永久代,不属于堆。里面主要有class的信息等。出现这个错误一般都是加载的class过多了。比如你的tomcat有许多的应用,每个应用的class文件或者jar包非常多。虽然Java在运行程序时,根据需要加载class文件,但是一旦加载后,移除该class的就会比较少了,但是java肯定有这个机制,只是这个机制的判断比较复杂,要如何判断一个class不再使用,确实比较麻烦。
要设置Java的PermGen,见下面的参数
JAVA_OPTIONS=&-XX:PermSize=64M -XX:MaxPermSize=128m&
这个是设置初始的PermGen的大小为64M,最大的PermGen为128m。
声明:未经允许禁止转载 东东东
陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自本文链接地址:
相关文章推荐:
Copyright & 2018java里运行程序之后出现这个是什么意思???_百度知道
java里运行程序之后出现这个是什么意思???
另外有事在一个包下有多个含main的类,怎么运行当前窗口所在的类,我发现有时候它会运行其他的类
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
你检查一下操作,是否在debug的时候修改了代码导致的。先让debug走完再修改代码进行下一次debug。针对一个包下多个类含有main函数的问题,你可以在当前的类编辑界面中点击右键,Run As -& Application
或者 Debug As都可以
采纳率:50%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 java运行时常量池 的文章

 

随机推荐