Java排查问题随笔

  常言道:“好记性不如烂笔头”,确实很有道理。在日常工作中,偶尔处理下线上问题还是很常见的,经常出现的情况就是忘记一些常用命令(套路)的用法了,因此整理下来非常用必要,以便关键时刻可以节省到处搜索的时间。

常用Linux命令

  1. top命令,直观查看机器资源使用情况。

(1)top -Hp PID 查看指定进程具体线程、内存使用情况
(2)输入top后,按P以CPU 占用率大小的顺序排列进程列表
(3)输入top后,按M以内存占用率大小的顺序排列进程列表

 

  2. free命令,这个命令估计大家也肯定经常用, 但是命令结果每行每列具体含义,经常容易忘记。

 

1)先看第一行   
       total used free shared buffers cached
Mem:          7804       7643        161        153        333       2658
机器总的总内存(total)为7804MB、其中使用了(used)7643MB、还剩下(free)161MB未使用,这几个指标应该是最好理解的。
另外某部分内存是可以共享的,比如程序代码片段可以被多个进程共享,这部分就是shared指标的含义了,也就是说有153MB内存被用于做共享内存了。
重点说下buffers和cached两个指标,这2个指标所占用的内存都是Linux为了提高访问性能而用来做高速缓存的,查了下资料有说cache是用于文件系统缓存,buffer是用于块设备缓存,还有的书籍说内核2.2以后cache和buffer整合成了一个"通用数据块层",想要深究只能自行查询更官方的文档了。简而言之,这部分内存是Linux内核自行维护的,不需要我们关心,正因为有了这些高速缓存,linux才不需要频繁IO操作,性能才得以提高。

2)第二行

  -/+ buffers/cache:       4651       3153

  这行的含义经常容易搞混。其实它想表达的是如果系统禁用buffer和cache高速缓存,那么系统实际就只使用了4651MB内存,还剩余3153MB内存。换个说法,就是第一行的

used = 实际使用的内存 + buggers/cache的内存, 而第一行的free= total - used。

 3)第三行

  Swap:        30517        231      30286

  这行的数据表示交换空间的总量、使用量、和剩余量。由于交换空间是在内存不足的情况下,使用磁盘当内存用,所以这行如果出现了使用量比较多的情况,那就真的事内存不够,要好好检查下是不是有什么内存泄漏了。

 

 4)总结下

  实际上判断内存使用情况,直接看第二行就行了,这行是系统程序实际使用的内存情况,而对于buffer和cache完全是由内核去控制的,应该是不建议我们去干预的。另外如果第三行数据有异常,就该认真排查了。

 

查看JVM堆栈命令

  1. jmap 

1)jmap -dump:file=hprof-jvm.bin -F PID 转存jvm堆栈信息文件
获取到堆栈信息的二进制文件后,可以使用Eclipse的MAT去分析是否存在异常情况,MAT这个东西确实好用,而且能帮我们自动分析去一些异常,比如内存泄漏什么的。附上下载地址 http://www.eclipse.org/mat/。

2)jmap -histo PID
获取每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数(-histo:live )加上后,只统计活的对象数量.

  

  2.jstack -l PID >> jstack.data。打印活动线程信息

 

查看GC日志

  目前接触项目都是CMS比较多(不知道是不是我们公司比较土~~),GC日志打印内容非常多,第一次看的话确实是懵。了解 CMS 垃圾回收日志,里面有比较清晰说明。这里我只摘录查阅资料后几点个作为笔记。

1)我们的CMS full gc时,经常会看到如下信息:CMS: abort preclean due to time, 这个问题有篇文章讲的很透彻:https://blogs.oracle.com/jonthecollector/entry/did_you_know。主要的意思是:preclean是为了加速下一级的remark过程,因为remark过程是STW的。preclean过程中为了更好的使用parallel,它会等待一次小gc(默认等待5s),如果5s内小gc没来,就会强制开始STW remark过程,并打印信息abort preclean due to time。就是说,出现这个log实际上关系不大,除非我们发现remark过程耗时过久。

2)
13901.282: [GC 13901.283: [ParNew: 8766574K->400883K(9216000K), 1.9300940 secs] 10239467K->1917256K(11578944K), 1.9309390 secs] [Times: user=13.68 sys=0.07, real=1.93 secs]
这段ParNew GC日志最后有三个时间
[Times: user=13.68 sys=0.07, real=1.93 secs]含义是指user是用户态花费的时间,sys是内核态花费的时间,而real是实际花费的时间,user+sys是CPU时间,每个CPU core单独计算,所以这个时间可能会是real的好几倍。

 

参考链接

  linux top命令中的cache & buffers

  Linux Top 命令解析 比较详细

  关于CMS: abort preclean due to time

  通过 jstack 与 jmap 分析一次线上故障

    了解 CMS 垃圾回收日志

  

 

转载于:https://www.cnblogs.com/yipaihushuo/p/9901704.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426512.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java学习(55):定义一个抽象类的继承

不同的是定义一个抽象类先 //抽象类 public abstract class interface4 { public abstract void fly(); public abstract void eat(); } //定义老鹰类继承 /定义一个老鹰类 public class interface3 extends interface4{ public void fly(){ System.out.println(“我是老鹰&…

java学习(57):内部类

/** 2 * 1.内部类可以直接访问外部类的成员,包括私有 3 * 2.外部类要访问内部类的成员必须创建对象 4 * author jjz 5 * 6 */ public class outer { //外部定义的方法 public void play(){ System.out.println(“我喜欢打篮球”); } public static void main(String…

java学习(59):static修饰内部类

class Outer { private int num 10; private static int num2 100; //内部类用静态修饰是因为内部类可以看出是外部类的成员public static class Inner {public void show() {//System.out.println(num);System.out.println(num2);}public static void show2() {//System.out…

java学习(61):适配器

定义一个动物的抽象类 public abstract class Animal { //定义一个抽象类的方法 public abstract void run(); //定义一个抽象类的构造器 public Animal(){ System.out.println(“抽象类的构造器”); } } 定义一个哺乳动物的抽象类 package com.zx; abstract class Mammal ext…

9个图片滑块动画

链接:https://www.html5tricks.com/9-jquery-image-slider.html 实例: 该实例下载链接:https://www.html5tricks.com/jquery-drag-image-slider.html 转载于:https://www.cnblogs.com/wanlibingfeng/p/9915376.html

java学习(62):java抽象类

定义一个抽象的食物方法 package com.zx; //定义一个食物的抽象方法 public abstract class Food { public abstract void taste(); } 定义食物面条 package com.zx; public class Flour extends Food{ public void taste() { System.out.println(“我可以做面条”); } } 定义食…

java学习(63):普通内部类

定义一个普通内部类 package com.zx; public class NotebookComputer01{ //定义一个非私有化的变量 public int num; public class CPU{ //类型 public String number; //运行速度 public long speed; public String counter(int num){ return Integer.toBinaryString(num); } …

java学习(64):类访问私有内部内部类方法

package com.zx; public class NotebookComputer01{ //定义一个非私有化的变量 private int num; private CPU cpu; //方法呗私有化 private class CPU{//类型private String number;//运行速度private long speed;public void counter(int num){System.out.println(Integer.t…

Settings中电池选项-Android13

Settings中电池选项-Android13 1、设置中界面2、电池计算2.1 充电时间计算2.1.1 BatteryUsageStats获取2.1.2 BatteryStatsImpl计算 2.2 电池剩余使用时间2.2.1 Estimate获取2.2.2 BatteryStatsImpl计算 3、电池信息来源4、命令模拟* 日志 [电池]Android 9.0 电池未充电与充电字…

java学习(66):局部类内方法访问

定义一个类 package com.zx; public class NotebookComputer {private int num; private CPU cpu;public String fromIntoBit(){ class CPU2{// 局部内部类public String countBit(int num){return Integer.toBinaryString(num);}}return (new CPU2().countBit(num));}/**** 普…

java学习(67):匿名内部类

package com.zx; /* 2 匿名内部类 3 就是内部类的简化写法。 4 5 前提:存在一个类或者接口 6 这里的类可以是具体类也可以是抽象类。 7 8 格式: 9 new 类名或者接口名(){ 10 重写方法; 11 …

11.8学习笔记

封装一套自己的model类(增 删 查 改) select * from news where 1 :默认子查询查询所有的条件 ,如果有其他的条件可以覆盖默认查询所有的条件 mysqli_insert_id //返回添加的id mysqli_affected_rows();//返回删除的行数 例子: header("…

java学习(68):局部内部类

public class test113 {public void method(){final int age 23;class Localinner{public void method(){System.out.println("歌谣");System.out.println(age);}}new Localinner().method();}public static void main(String[] args) {test113 onew test113();o.met…

java学习(69):java模式设计之适配器

1需求是 //公司招员工,要求会讲中、英、法、日四国语言,同时还很会编程的员工。 这时候,我们先定义一个接口,实现接口中的方法我们就认为满足 //公司招员工,要求会讲中、英、法、日四国语言,同时还很会编…

selenium 验证码——万能码的使用

使用万能码需要导入一个random类生成随机码 # codingutf-8 import randomver random.randint(1000,9999)print u生成验证码:%d %vernum input(u输入验证码:) print numif num ver:print u登陆成功 elif num 999999:print u登陆成功 else:print u验证…

Intellij IDEA创建的Web项目配置Tomcat并启动Maven项目

点击如图所示的地方,进行添加Tomcat配置页面弹出页面后,按照如图顺序找到,点击号tomcat Service -> Local注意,这里不要选错了哦,还有一个TomEE Service!按照下面图所示进行配置。图中数字的地方代表的配…

java学习(70):GUL图形用户界面初识

import java.awt.*; import javax.swing.*; public class test04 {public static void main(String[] args){//定义一个图形界面JFrame aanew JFrame();//建立一个标题aa.setTitle("歌谣");//创建一个按钮JButton an1new JButton("歌谣");//设置初始位置aa…

oracle实时分析,Oracle Exalytics 大幅提升实时分析洞察力

【天极网OOW2013上海消息】甲骨文近日宣布推出Oracle Exalytics商务智能云服务器的新版本Oracle Exalytics X3-4。新系统显著增强了软件功能和硬件更新,极大提升了针对商务分析的业内最快集成系统的性能。新的Oracle Exalytics X3-4具有2 TB主内存,2.4TB…

java学习(71):GUL边界布局管理器

//面向对象思想,边界管理布局器 import java.awt.*; import javax.swing.*; public class test06 extends JFrame {JButton an1,an2,an3,an4,an5;//把需要的组件定义在这里public static void main(String[] args){test06 lx1new test06();//主函数调用即可}//定义…

java学习(72):GUL流式布局管理器

//面向对象思想,流式管理布局器 import java.awt.*; import javax.swing.*; public class test07 extends JFrame {JButton[] an{null,null,null,null,null,null,null,null};//把需要的组件定义在这里public static void main(String[] args){test07 lx1new test07…