主题创建协议:
主题是聚焦特定技术文章的讨论小组,在这里,你可以与志同道合的伙伴畅所欲言。假如极客头条的读者关注或者加入了你所创建的主题,他们能在主题中发表内容,同时在自己的看板中,浏览这里的发言。主题中的精华内容,也可以为极客头条所有的用户看到。
申请创建主题之前,请先思考下面的问题:
1. 创建主题之后,你是否愿意投入精力建设和管理社区?如果你尚在犹豫,或者怀疑自己的热情,可能意味着你还需要等待一段时间。
2. 你是否能找到一群志趣相投的朋友?每个主题都需要一群与你相似,能与你找到共鸣的朋友。
如果对上面的问题,你都有肯定的回答,那么欢迎创建主题。
申请信息已提交审核,请注意查收邮件,我们会尽快给您反馈。
如有疑问,请联系geek@csdn.net
11039 2102618 关注已关注取消关注
2303 2043797 关注已关注取消关注
166 1979896 关注已关注取消关注
69 1946733 关注已关注取消关注
76 1877720 关注已关注取消关注
17 1833080 关注已关注取消关注
3186 1525399 关注已关注取消关注
162 1015352 关注已关注取消关注
1 804568 关注已关注取消关注
70
你只管努力,剩下的交给时光!
如今的编程是一场程序员和上帝的竞赛,程序员要开发出更大更好、傻瓜都会用到软件。而上帝在努力创造出更大更傻的傻瓜。目前为止,上帝是赢的。个人网站:www.xttblog.com。个人QQ群:135430763、454796847
个人大数据技术博客:https://www.iteblog.com
在上一篇文章中整理了java开发人员必须掌握的linux基本命令。由于java jdk命令行工具比较重要所以单独整理一个篇幅来讲解。相关资料有来源于网络、加上自己的见解整理而成、比较全面。上一篇文章地址:Java开发必须熟悉的Linux命令看这一篇就够了。
在笔者接触的很多公司中、发现很多java开发人员一旦发现应用无法响应、首先查看一下日志、在查找日志无果的情况下动不动就重启java应用先让其正常工作了再说。还有更夸张的是听到过制作定时脚本每天半夜定时重启、并笑着说重启解决一切问题。那种解决办法乃是下下策、经验不足的表现。除了查看日至之外、对于java进程JVM的检测其实sun公司提供了一套强大的虚拟机监视和故障处理工具。如果你对jdk有一点点了解、对于个java 进程的诊断其实就那么回事、我们应该查找到根源问题、从本上找到ava进程不能正常工作的原因、从而达到治本的目的。
简单的介绍一下jdk命令行工具是什么。
我们整java的肯定知道jdk的bin目录下面有 java.exe、javac.exe这两个命令行工具。但是除了这两个工具还有一些其他的非常实用的工具、这篇文章主要就是介绍用于监视虚拟机和故障处理的工具。非常有用哦。
JPS—虚拟机进程状况工具
常用的几个参数:
-l 输出Java应用程序的main class的完整包
-q 仅显示pid,不显示其它任何相关信息
-m 输出传递给main方法的参数
-v 输出传递给JVM的参数。在诊断JVM相关问题的时候,这个参数可以查看JVM相关参数的设置
ps:这个命令相信大多数java程序员都知晓、查找当前运行的java进程、当需要kill掉某个进程的时候可以用到、
jstat —虚拟机统计信息监视工具
jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ] ,可以用来查看堆信息,垃圾回收信息等,详细使用命令可以通过man jstat命令来查看。
查看垃圾回收信息
S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC:年轻代中Eden(伊甸园)的容量 (字节)
EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC:Old代的容量 (字节)
OU:Old代目前已使用空间 (字节)
PC:Perm(持久代)的容量 (字节)
PU:Perm(持久代)目前已使用空间 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
NGCMN:年轻代(young)中初始化(最小)的大小 (字节)
NGCMX:年轻代(young)的最大容量 (字节)
NGC:年轻代(young)中当前的容量 (字节)
OGCMN:old代中初始化(最小)的大小 (字节)
OGCMX:old代的最大容量 (字节)
OGC:old代当前新生成的容量 (字节)
PGCMN:perm代中初始化(最小)的大小 (字节)
PGCMX:perm代的最大容量 (字节)
PGC:perm代当前新生成的容量 (字节)
S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O:old代已使用的占当前容量百分比
P:perm代已使用的占当前容量百分比
S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)
S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)
ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)
DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)
TT: 持有次数限制
MTT : 最大持有次数限制
jinfo java配置信息工具
观察运行中的java程序的运行环境参数:参数包括Java System属性和JVM命令行参数、也可以设置参数的值,并使之立即生效。
。eg:
jmap Java内存映像工具
可以生成java应用程序的堆快照和对象统计信息。
下面的命令可以看到java进程中某一时刻的类示例数量以及所占的字节数。
打印进程的类加载器和类加载器加载的持久代对象信息,输出:类加载器名称、对象是否存活(不可靠)、对象地址、父类加载器、已加载的类大小等信息
1、使用jmap -heap pid查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况。
2、使用jmap -histo[:live] pid 查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象
ps:个人觉得这个比较有用、那时还在游戏公司上班、游戏正在外网公测、运维给游戏内玩家发了一封邮件、查询数据库的时候记录数太多导致服务器内存爆满一直full GC游戏进程假死。后来排查问题的时候用此命令查看类的数量以及字节数、发现某个类的个数非常多以及所占的内存非常大、很可疑、复制这个类名在eclipse里边ctrl+shift+t一查发现是jdbc jar包里边一个类、由此才确定是查询数据库导致的问题。
也可以将当前程序的堆快照导出到文件中:
jstack命令(Java Stack Trace)
可以用来查看java应用程序的堆栈信息。
jstack -l
可以用来查看进程中线程状态,检测死锁等。
jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有ps、top、printf、jstack、grep。
步骤一:先找出Java进程ID,我部署在服务器上的Java应用名称为mrf-center:
得到进程ID为21711
步骤二:找出该进程内最耗费CPU的线程 top -Hp pid
TIME列就是各个Java线程耗费的CPU时间,CPU时间最长的是线程ID为21742的线程
printf”%x\n”21742得到21742的十六进制值为54ee,下面会用到。
步骤三:jstack上场、它用来输出进程21711的堆栈信息,然后根据线程ID的十六进制值grep,如下
PS:可以看到CPU消耗在PollIntervalRetrySchedulerThread这个类的Object.wait(),我找了下我的代码,定位到下面的代码:
学习Java的同学注意了!!!
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流,裙号码:392216227【长按复制】 我们一起学Java!