如何找到占用CPU和内存最高的线程

一、如何找到CPU和内存占用最高的线程

  1. 代码示例

    我们先来写一段代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    @Test
    public void testLinuxTop() throws Exception{
    boolean b=true;
    System.out.println("start the cpu Thread");
    while (b){
    int i=(int)Math.random()*1000;
    if (i%3==1){
    }
    if (i==1000){
    System.out.println("stop");
    b=false;
    }
    }
    }

    随便写了个死循环,然后怎么看下CPU占用情况呢?

    TOP命令

    先用ps -ef|grep tomcat查看一下你当前tomcat的进程号,比如我看出来我的进程号是8545

    然后用TOP命令查看当前所有进程

    1
    2
    top -p 8545
    top -p 8545 -H //这样也可以

    使用地址中,进入了下面这个界面之后就要按H了

    于是你就会看到下面这张图片

    QQ20170301-0@2x

    CPU占用接近满了,内存占用30M,怎么会占用这么多?OK,我们记住PID 8545

  2. jstack命令

    OK,我们在栈里面来找出这段代码,可以直接用jstack把栈里面的东西打出来

    直接使用下面的就可以

    jstack 8545 > stack.log 在你的当前目录下面就会出现一个stack.log文件,这是包括所有的栈信息的,这里的8545是tomcat的进程号tomcat的进程号tomcat的进程号,重要的事情强调一下

    如何找到有问题的代码呢?

    我们刚才拿到了一个CPU最高的进程号8545,OK,转化为16进制,使用下面命令

    1
    2
    3
    printf "%x\n" 8545
    //或者
    printf 0x%x 8545

    上面两种都可以拿到16进制的8545,或者你自己去用计算器拿去,这里我们得到的是0x2162或者2161(上面一种可以直接拿到2161,没有0x),我们要的就是2161

    可以直接到jstack.log文件里面去搜索,就看到出问题的代码了

  3. 想直接看

    下面提供一种直接看的方法

    1
    jstack 8545|grep -A 30 2162

    得到线程堆栈信息中2162这个线程所在行的后面30行

  4. question

    4.1 我使用jstack pid报错了怎么办?

    使用jstack pid可能会出现8545 operation permitted之类的错误,解决办法,请切换至root用户执行命令

  5. over

Compartir

JAVA面试题之基础篇

  1. 九种基本数据类型的大小,以及他们的封装类。各自占多少字节

    boolean, byte, char, short, int, long, float, double, void 还有一种引用类型

    Boolean, Byte, Character, Short, Integer, Long, Float, Double, Void

    存在原因:节省内存开销

    2 2 2 4 8

  2. String 类能被继承吗,为什么。

    不能,String是一个final类

  3. 讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,当 new 的时候,他们的执行顺序

    类实例化的过程中,先执行父类的构造器,然后执行隐式的构造代码,再执行构造方法中的代码

  4. JAVA8 的 ConcurrentHashMap 为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何设计

    它摒弃了Segment(锁段)的概念,而是启用了一种全新的方式实现,利用CAS算法,段锁性能也不是很高,而CAS操作是CPU支持的操作,是一种原子操作

    1、下面讲一下concurrentHashMap的结构

    ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成(一个segment里面有一个hashEntry数组)。Segment是一种可重入锁ReentrantLock,在ConcurrentHashMap里扮演锁的角色,HashEntry则用于存储键值对数据。一个ConcurrentHashMap里包含一个Segment数组,Segment的结构和HashMap类似,是一种数组和链表结构

    Read More

Compartir

Logstash学习经验

一、概述

  1. Logstash是什么

    Logstash是一个内置有分析和转换工具的日志分析工具,是一个管道,可以把生产上面的日志从服务器移动到另外一个地方,支持多种格式

  2. 核心配置

    Logstash核心包括inputscodecsfiltersoutputs等,inputs负责将某种格式的日志数据传输到Logstash中,codecs对于数据流进行某种方式处理(如JSON、msgpack、plain等),filters用于过滤信息,outputs是Logstash的输出部分

    Read More

Compartir

Logstash中grok filter example例子

一、Logstash

本文适合有部分Logstash经验的人阅读,如果不懂Logstash是什么,请看我另外一篇博文

1、filters

Logstash核心组成部分就包括filters,这是个过滤器。一般日志中还是有很多有用信息的,利用Logstash的filter机制可以将这些信息抽取出来

1)、JSON Filter

​ 这种方式对于日志数据源是json格式的比较有效,这里我不多讲,一般人日志不会特意弄成json格式的吧…

Read More

Compartir

按位逻辑操作符那些事儿

按位操作符运算符概述

在java底层里面,用到了很多这种符号,不对这些按位逻辑符号弄清楚,不容易看懂jdk源码,这里对按位符号做一个简单的梳理

运算符 用法 描述
按位与( AND) a & b 对于每一个比特位,只有两个操作数相应的比特位都是1时,结果才为1,否则为0。
按位或(OR) `a \ b` 对于每一个比特位,当两个操作数相应的比特位至少有一个1时,结果为1,否则为0。
按位异或(XOR) a ^ b 对于每一个比特位,当两个操作数相应的比特位有且只有一个1时,结果为1,否则为0。
按位非(NOT) ~ a 反转操作数的比特位,即0变成1,1变成0。
左移(L) a << b a 的二进制形式向左移 b (< 32) 比特位,右边用0填充。
有符号右移 a >> b 将 a 的二进制表示向右移b(< 32) 位,丢弃被移出的位。
无符号右移 a >>> b 将 a 的二进制表示向右移b(< 32) 位,丢弃被移出的位,并使用 0 在左侧填充。

这里注意,java里面没有无符号左移,因为无符号左移<<<和左移<<是一样的概念

Read More

Compartir

Array.sort和Collections.sort实现原理解析

Arrays.sort和Collections.sort实现原理解析

1、使用

  • 排序

2、原理

  1. 事实上Collections.sort方法底层就是调用的array.sort方法,而且不论是Collections.sort或者是Arrays.sort方法,

  2. 跟踪下源代码吧,首先我们写个demo

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public static void main(String[] args) {
    List<String> strings = Arrays.asList("6", "1", "3", "1","2");
    Collections.sort(strings);//sort方法在这里
    for (String string : strings) {
    System.out.println(string);
    }
    }

    简单得不能再简单的方法了,让我们一步步跟踪

    Read More

Compartir

写给自己的2017

天地不仁,以万物为刍狗

​ ——平凡的人

​ 转眼2017了,毕业也快1年了,工作也近一年有余了,从离开学校那会儿起,自己的目标是什么?自己想要的是什么,倒现在依然还很模糊,然而,还是这么活着……

​ 但是,唯一我清楚的是,不能再这样继续下去了……

Read More

Compartir