「java占用pid」Java占用内存类型变量排序
本篇文章给大家谈谈java占用pid,以及Java占用内存类型变量排序对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、java获取linux进程pid错误
- 2、java内存占用大堆内存少
- 3、查看某个端口是否被占用及其占用应用
- 4、电脑Java8update内存使用率高
- 5、如何在Windows下查看JAVA端口占用明细
- 6、原来jdk自带了这么好玩的工具——使用 jstack定位死循环
java获取linux进程pid错误
java获取linux进程pid错误需要用ps-ef命令。使用ps-ef命令获取所有的PID进行筛选出反射机制,使用JDK9新增加的API就可以不显示错误了。
java内存占用大堆内存少
首先java内存可以大体分为堆内存和栈内存。一般收的内存使用过大是指堆内存使用过大。一般分步骤分析。
现在内存过大到底到何种程度。是否引起了GC或者FUll GC。是否影响了正常工作。
1.明白现在内存有多大,可以通过工具看,和使用的内存比例。如果项目中需要缓存很多缓存,可以理解使用是合理的。如果服务器内存够大,应用可以适当调整XMX xms参数进行JVM调整。
2.如果系统中没有使用缓存,和大对象内存过高,那就考虑是否有内存泄漏。可以使用jmap等jVM调优工具进行对象分析。然后定位过高原因修改代码。
jmap -dump:format=b,file=文件名 [pid]
dump当前系统,根据dump文件我们可以分析当前系统中存在的内存问题。
分析dump文件的工具很多,JDK自带的Jhat,Eclipse也有相关的插件。
我使用的是Eclipse Memory Analyzer,功能很强大,能够生成各种报表,另外可以在不同的时间生成不同的dump,然后通过工具分析两个dump的内存变化。
大家专注我,我写了好多JVM 原理和调优的文章。
文版权归是三僡然所有,转载请标明出处。欢迎转载,欢迎评论,欢迎分享。如果你有文章想分享可以联系我。
查看某个端口是否被占用及其占用应用
如我想查看自己电脑的18084端口是否被占用
图中显示有记录,证明是被占用的,而且占用的程序进程号pid为:19084
在图中可以看到进程号pid为19084的应用程序为java.exe,说明这是个在jvm运行的java程序在占用18084端口
(2)使用任务管理器关闭
因为上面用命令关闭了一次,再启动java.exe程序后,pid进程号变成了:28932
找到这个pid对应的应用,右击点结束任务即可
linux下的比较简单
直接netstat 查看,kill杀掉进程即可
查看端口对应的pid对应的应用程序
ps -ef|grep 11748
电脑Java8update内存使用率高
可能是代码原因导致的问题,也可能是其他原因导致的问题。
使用dstat和top查看内存使用最高的应用,查到内存占用最高的是java应用,使用2253M内存,但是这台服务器跑了好几个java,具体哪个进程使用top看下资源情况,使用top,使用dstat可以看到java应用整体内存使用率超过了70%,其中pid为16494的进程一个应用占了28.7的内存,使用ps查看16494的线程情况,命令:psp16494-L-opcpu,pmem,pid,tid,time,tname,cmd,看到16494这个pid的应用产生了很多线程。在分析前需要将17417这个id转换为16进制,方便查找信息12[root@localhost~]#printf"%x\n"17417,440916进制为4409。将pid为16494的应用打印到日志中1[root@localhost~]#jstack-l16494jstack.log。查看内存堆栈信息,1[root@localhost~]#vimjstack.log,[root@localhost~]#vimjstack.log在日志信息中查找刚刚转换的4409。可以看到这个线程状态为WAITING通过查看日志发现有大量的waitingoncondition。1,parkingtowaitfor存在大量线程等待被唤醒,占用大量内存。
如何在Windows下查看JAVA端口占用明细
开始----运行----cmd,或者是window+R组合键,调出命令窗口输入命令:netstat-ano,列出所有端口的情况。在列表中我们观察被占用的端口,比如是49157,首先找到它。查看被占用端口对应的PID,输入命令:netstat-aon|findstr"49157",回车,记下最后一位数字,即PID,这里是2720继续输入tasklist|findstr"2720",回车,查看是哪个进程或者程序占用了2720端口,结果是:svchost.exe或者是我们打开任务管理器,切换到进程选项卡,在PID一列查看2720对应的进程是谁,如果看不到PID这一列,则我们点击查看---选择列,将PID(进程标示符)前面的勾打上,点击确定。这样我们就看到了PID这一列标识,看一下2720对应的进程是谁,如果没有,我们把下面的显示所有用户的进程前面的勾打上,就可以看到了,映像名称是svchost.exe,描述是,Windows的主进程,与上面命令查看的完全一致。结束该进程:在任务管理器中选中该进程点击”结束进程“按钮,或者是在cmd的命令窗口中输入:taskkill/f/t/imTencentdl.exe。
原来jdk自带了这么好玩的工具——使用 jstack定位死循环
线程快照是java虚拟机内每一个线程正在执行的方法堆栈的集合,生成线程快照的主要目的是用于定位线程出现问题的位置;常见的问题有
命令格式
jstack的option参数并不多,真正用到的也就三个,接下来我们一个个介绍一下
- -F :当线程挂起(Suspended)时,使用jstack -l pid命令是不会打印堆栈信息的,使用-F则可以强制输出线程堆栈;但是会停止但
- -l :打印的信息除了堆栈外,还会显示锁的附加信息;
- -m :同时输出java和C/C++的堆栈信息;在java的系统类库里面,有很多方法都是native修饰的,这些native修饰的方法你在java层面是看不到源码的,因为这些方法都是C/C++实现的;
在线程的堆栈中,需要特别留意以下几种状态:
不带option参数的命令
打印结果如下
第一行各个单词的解析,
这里我们使用2个窗口,分别使用以下2个命令来测试
通过2个窗口对比可以看到,加了-l的命令多打印了锁的信息;
一般情况下,如果程序出错了, 都不会直接在生产环境的服务器上找错误,这个时候就可以用到一个非常实用的功能,将堆栈快照导出来,然后copy到别的电脑上看,命令如下
执行后,就可以看到文件已经导出来了
通过cat命令可以看到,里面的内容和我们在命令行输出的内容是一样的
首先我们准备好一个死循环的线程,在线程内定一个while的死循环,并且给这个线程起个名字为:yexindogn,阿里巴巴的开发规范里面有一个规定,就是每个线程必须起一个名字,起名字就是为了 以后程序出问题的时候好找错误;
接着我们将此代码打成jar包扔到linux服务器上运行,直接输入 java -jar Test.jar 命令即可运行,运行后我们可以看到控制台一直在输出112这个字符,这就代表程序已经在运行了;
接着在看下CPU的运行情况,使用top命令查看cpu占用情况,排在第一位的是进程号为30328的进程,占用了6.6%的cpu; 这边我使用了2个命令行连到同一台服务器,一个窗口用来运行刚刚的jar包,另一个窗口用来查找错误;
知道进程号了,接着就是找线程了,输入以下命令
打印结果如下,这里有一点需要注意,在我们加上-Hp指令后,PID展示就是线程的id了,这时候我们看到占用CPU最高的线程id是30365;
还有另一种方式,就是使用ps命令来查找线程
通过这个命令我们可以看到这边占用最高的线程id也是30365 ;
以上的方式我们成功找到了占用cpu高的线程id是30365,但这个id是十进制的,在这里需要先转为16进制,输入命令
计算出对应的16进制为:769d
当然也可以用其他的计算工具,比如mac系统自带计算器就支持进制之间的转换
在命令行输入以下命令,这种方法更加快速,推荐使用
其中,grep 命令是查找结果为769d的内容,-A 20 表示打印匹配所在行的后20行内容。直接帮我们定位到所在线程的堆栈,结果如下
当然也可以用下面的死办法,先打印出所有的堆栈快照;
打印结果如下
接着我用刚刚计算出来的16进制复制出来在这里搜索一下,经过查看就知道是我们刚刚起了名字为yexindong的线程出错了,出错的位置在Test.java的第13行代码
我们看看java代码,确实是第13行这里的死循环导致的
首先打开任务管理器,因为默认windows的任务管理器是不显示进程pid的,所以我们需要设置一下,选择 查看 选择列(S)...
选中PID进程表示符后点击确定按钮
然后我们就可以看到占用CPU最高的java进程PID为:976
因为windows不能直接查看java进程中的线程信息,所以我们需要借助一个工具,这个工具是微软自己开发的,叫做Process Explorer ,网上很多,需要的童鞋请自行百度,打开后找到pid为976的进程右击选择 属性
在弹出的窗口中找到线程这一栏,它的排序默认就是按照cpu占用的率倒序排列的,所以最上面的就是占用cpu最高的线程了,记住它的线程id:3548
刚刚拿到的进程id是十进制的,但是我们导出的jstack信息里面,线程id是以16进制来展示的,所以我们要先将这个线程id为3548转为16进制的,使用windows自带的计算器即可,在快捷命令行输入calc
计算器打开后将其设置为程序员使用的计算器
接着输入线程id3548,在按一下16进制,就会自动进行转换,结果为ddc,记住这个16进制;
在命令行输入以下指令导出进程的堆栈快照信息
几秒钟后,快照导出了,静静地躺在文件夹里,等待着我们打开
用Notepad++打开导出的文件,搜索刚刚计算出来的16进制ddc,就可以定位到线程出错的位置了
有些童鞋可能会觉得用这个jstack命令麻烦了,那java在代码里面可不可以打印出堆栈呢?你别说,还真有,就是这个方法:Thread.getAllStackTraces();光说不练假把式,来个demo测试一下吧
执行后打印结果如下,由此可以看到,将当前进程的所有线程都打印出来了,但是这边只打印了简单的堆栈信息,对于开发人员来说,已经起到了监控作用;
作为调优和找错的工具来说,可以说jstack是用的最多的一个工具了,但是由于局限性,现在已经慢慢被替换掉了;大家更倾向于使用阿里巴巴开发的工具arthas;感兴趣的童鞋可以了解下!
关于java占用pid和Java占用内存类型变量排序的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。