精华内容
下载资源
问答
  • 这样的问题在c或c++里使用sizeof()方法就可以得到明确答案,在java里好像没有这样的方法(java一样可以实现),不过通过jmap工具倒是可以查看出一个对象的占用内存的大小,这里介绍一种通过分析java代码计算内存使用...

    一个对象实例占用了多少字节,消耗了多少内存?这样的问题在c或c++里使用sizeof()方法就可以得到明确答案,在java里好像没有这样的方法(java一样可以实现),不过通过jmap工具倒是可以查看出一个对象的占用内存的大小,这里介绍一种通过分析java代码计算内存使用情况的方法。

    注意,一下讨论的情况都是基于32位机,不适用用64位机,JVM是sun的HotSpot,不同的虚拟机实现可能会不同

    规则一:每个对象被按照8bytes粒度对齐(数组除外)

    在jvm中每个对象(数组除外)都有一个头,这个头有两个字,第一个字存储的时对象的一些标志位信息,例如:锁标志位、经历了几次gc等信息,第二个字是一个引用,指向了这个类的类信息。这里jvm给这两个字留了8个字节的空间(这个为啥用8个字节空间不是很清楚,一个字即两个字节,我一直认为4个字节就够了)

    按规则一:new Object();这个Object实例就占用了8个字节

    规则二:为类属性分配存储空间时不是按照类中定义的属性顺序,而是按如下的顺序:

    1、double\long;----8bytes

    2、int\float;----4bytes

    3、char\short;----2bytes

    4、boolean\byte;----1bytes

    5、reference;----4bytes

    例如:

    Java代码

    public class A {

    byte a;

    char b;

    int c;

    long d;

    Object e;

    }

    属性        需要字节数        累积字节数

    header        8bytes        8

    long:d        8bytes        16

    int:c        4bytes        20

    char:b        2bytes        22

    byte:a        1bytes        23

    Object:e        4bytes        27

    padding 5bytes        32

    最后一行padding 5bytes的目的是,规则一中描述每个对象按照8个字节的粒度对齐,这样下一个分配的对象的开始位置必须在8的倍数上,而离27最近的8的倍数是32,因此加了5bytes。A占用32bytes

    可以用jmap看一下这个计算是否准确

    规则三:对于继承时,要按照规则二先计算父类的类属性占用情况,再按照规则二计算子类的类属性占用情况,不能将父类和子类的属性混合在一起按规则二分配。

    例如:

    Java代码

    class B{

    long a;

    int b;

    int c;

    }

    class BB extends B{

    long d;

    }

    属性        占用字节数        累计字节数

    header        8        8

    a        8        16

    b        4        20

    c        4        24

    d        8        32

    这里累计字节正好是8的倍数,满足规则一,因此不用padding字节。BB对象内存占用了32bytes

    规则四:父类的最后一个属性和子类第一个属性必须按4个字节的倍数对齐

    例如:

    Java代码

    class B{

    long a;

    int b;

    char c;

    }

    class BB extends B{

    long d;

    }

    属性        占用的字节        累计字节

    head        8        8

    a        8        16

    c        2        18

    padding 2        20

    d        8        28

    padding 4        32

    第一次padding2是因为属性c分配内存后,不满足父类最后一个属性和子类第一个属性按4字节粒度对齐(18除4除不开),因此需要添加两个字节使其可以按4字节粒度对齐。

    第二次paadding4是依据规则一

    规则五:当子类的第一个属性是double或long,但是父类不能按8字节粒度对齐时,子类内存分配时的顺序将不按规则二进行,而是按:先int\float、char\short、boolean\byte、reference、long\double

    例如:

    Java代码

    class A{

    byte a;

    }

    class B extends A{

    long b;

    short c;

    byte d;

    }

    属性        占用字节数        累计占用字节数

    head        8        8

    a        1        9

    padding 3        12

    c        2        14

    d        1        15

    padding 1        16

    b        8        24

    第一次 padding 3是根据规则四

    第二次 padding 1是因为b属性是8个字节,因此需要按8个字节粒度对齐。B占用24bytes

    对于数组,与普通对象不同的是在头部,头部多了4个字节用于存储长度信息。因此数组的head是12bytes而不是8bytes

    展开全文
  • 分析java线程占用cpu或者内存高的代码 1、通过top查看占用cpu或者内存高的进程截图如下【备注输入大写P以cpu从大到小排序,大写M以内存大小排序】 2、通过对应的cpu找到PID也就是进程对应的pid,然后找到java进程...

    分析java线程占用cpu或者内存高的代码
    1、通过top查看占用cpu或者内存高的进程截图如下【备注输入大写P以cpu从大到小排序,大写M以内存大小排序】

    在这里插入图片描述

    2、通过对应的cpu找到PID也就是进程对应的pid,然后找到java进程106854这个进程id

    在这里插入图片描述

    3、通过命令top -Hp PID 例如top -Hp 106854
    就可以列出该进程下的所有线程id

    4、通过输出大写的P查看线程占用cpu最高的或者通过大写M查看内存占用最高的

    然后找到109391这个线程id

    5、使用命令printf “%x\n” 109391 输出对应的十六进制码,1ab4f这个码是为了过滤线程id查到对应的代码

    6、使用命令jstack PID|grep 1ab4f 【备注PID是进程的id,1ab4f是这个进程下的一个线程占用最高的cpu十六进制码】

    7、通过上面的输出发现kafka,所以会联想到,kafka一直监听消息,所以消耗cpu,正常现象

    8、如果出现自己写的类,说明需要修改代码逻辑了

    展开全文
  • 然后开始定位问题原因,因为阿里这边安全的原因,具体的图片就不方便上传了,拿网上的图来说使用top命令查看系统资源的使用情况,命令:top如图可以看到java的进程内存使用率较高,java进程的内存使用率达到了70%+2....

    故障:今天许多开发反馈测试平台卡,访问不了,第一感觉判断是服务器内存爆了,或者cpu占用过高,上服务器看了一下,确实是内存爆了。然后开始定位问题原因,因为阿里这边安全的原因,具体的图片就不方便上传了,拿网上的图来说

    使用top命令查看系统资源的使用情况,命令:top

    0549ef3913c85c98bfc93dcd09e88f33.png

    如图可以看到java的进程内存使用率较高,java进程的内存使用率达到了70%+

    2.定位线程问题(通过命令查看9718进程的线程情况),命令:ps p 9718 -L -o pcpu,pmem,pid,tid,time,tname,cmd

    05fbdf2c4307399db65525a89f8824a8.png

    由此可以看到这PID:9718的进程产生了很多线程。接下来就可以通过jstack查看内存使用的堆栈。

    3. 查看内存使用的堆栈:在这里我们挑选了TID=9731的线程进行分析,首先需要将9731这个id转换为16进制。需输入如下命令,

    printf "%x\n" 9731

    e761d41c72b442d21be0d033cb6abd5c.png

    接下需要使用16进制的2603

    4. 将PID为9718的堆栈信息打印到jstack.log中,命令:jstack -l 9718 > jstack.log

    52050030170e2bc7b0eafb87f2128c91.png

    5. 查看堆栈信息文件,命令:vim jstack.log

    在进行搜索TID为2603的相关信息。如图:

    71d44bac71c4dea3867fb2e56f570110.png

    可以看到这个线程状态为:WAITING。通过查看文件分析 看到大量 Java Thread State。

    说明它在等待另一个条件的发生,来把自己唤醒,或者干脆它是调用了 sleep(N)。

    此时线程状态大致为以下几种:

    java.lang.Thread.State: WAITING (parking):一直等那个条件发生;

    java.lang.Thread.State: TIMED_WAITING (parking或sleeping):定时的,那个条件不到来,也将定时唤醒自己。

    6.代码优化:将文件发送给开发。优化下线程

    这里还有一种排查思路

    在定位到具体的PID后,可以到处进程快照,看看这个线程做了啥

    jstack -l 9718 > ./9718.stack

    再用grep查看下线程在文件里做了啥

    cat 9718.stack |grep '2603' -C 8

    这里随便定位一个,基本上这样查都可以定位到线程的问题

    展开全文
  • 分析java线程占用cpu或者内存高的代码 1、通过top查看占用cpu或者内存高的进程(然后按下大写P会以cpu从大到小排序,大写M以内存大小排序) 2、通过对应的cpu找到PID也就是进程对应的pid,例如pid=19485 3、通过...

    分析java线程占用cpu或者内存高的代码
    1、通过top查看占用cpu或者内存高的进程(然后按下大写P会以cpu从大到小排序,大写M以内存大小排序)

    2、通过对应的cpu找到PID也就是进程对应的pid,例如pid=19485

    3、通过命令top -Hp PID 例如top -Hp 19485就可以列出该进程下的所有线程id

    4、通过输出大写的P查看线程占用cpu最高的或者通过大写M查看内存占用最高的,然后找到19530这个线程id

    5、使用命令printf “%x\n” 19530输出线程id对应的十六进制码,1ab4f这个码是为了过滤线程id查到对应的代码

    6、使用命令jstack PID|grep 4c4a【jstack 19485|grep 4c4a  备注PID是进程的id,4c4a是这个进程下的一个占用最高cpu的线程id对应的十六进制码】

    7、通过上面的输出找出对应的消耗CPU的代码。jstack 19485|grep 4c4a

    展开全文
  • 在JDK的bin目录有一个工具,叫jconsole.exe,双击打开后,连接你需要监控的JVM,然后就可以来查看CPU、内存占用情况。 还有JDK提供的 jvisualvm.exe,功能更强大。...
  • 如何准确定位Java进程中哪些线程资源占用内存高的问题第一步 通过top查看具体是哪个进程占用内存较多第二步 定位具体进程中哪些线程占用内存第三步 打印进程的堆栈信息到log中 第一步 通过top查看具体是哪个进程占用...
  • 使用top命令查看系统资源的使用情况,命令:top如图可以看到java的进程内存使用率较高,java进程的内存使用率达到了70%+2.定位线程问题(通过命令查看9718进程的线程情况),命令:ps p 9718 -L -o pcpu,pmem,pid,tid,...
  • 如下图:解决方法:A:可能是代码原因导致的问题:1、使用命令:top查看当前进程的状态2、从上图可以看到PID:916的java进程占用内存较大。定位线程问题(通过命令查看PID 为25894 进程的线程情况),命令:# ps p 916 -...
  • 使用 命令 ps -ef | grep Java名目名字 使用top命令查看系统资源的使用情况,命令:top ...定位线程问题(通过命令查看15960进程的线程情况),命令:ps p 15960 -L -o pcpu,pmem,pid,tid,time,tname,cmd ...
  • 2、从上图可以看到PID:916的java进程占用内存较大。定位线程问题(通过命令查看PID 为25894 进程的线程情况),命令:#ps p 916 -L -o pcpu,pmem,pid,tid,time,tname,cmd 由此可以看到这PID:916的进程产生了很...
  • 使用jstack排查java应用占用内存过高问题记录 1.使用top命令查看内存使用最高的应用 使用大写M可按照内存使用排序,大写P可按cpu使用排序; 可以看到第一个java应用占用的cpu和内存明显高于其他几个; 2.定位线程...
  • 场景:生产环境运行了一个java tomcat web应用,之前没有去观察他的资源使用情况,今天在查看日志时看了一下应用的内存,发现内存占用很高(这里说明一下,这个应用没有什么人访问,理论上来说是不会占用太多内存的...
  • 查看使用dstat和top查看内存使用最高的应用使用dstat查到内存占用最高的是java应用,使用2253M内存,但是这台服务器跑了好几个java,具体哪个进程使用top看下资源情况使用top可以看到java应用整体内存使用率超过了70...
  • 查看使用dstat和top查看内存使用最高的应用使用dstat查到内存占用最高的是java应用,使用2253M内存,但是这台服务器跑了好几个java,具体哪个进程使用top看下资源情况使用top可以看到java应用整体内存使用率超过了70...
  • 最近收到邮件报警,说内存使作率...2、从上图可以看到PID:916的java进程占用内存较大。定位线程问题(通过命令查看PID 为25894 进程的线程情况),命令:# ps p 916 -L -o pcpu,pmem,pid,tid,time,tname,cmd ...
  • 如下图:解决方法:A:可能是代码原因导致的问题:1、使用命令:top查看当前进程的状态2、从上图可以看到PID:916的java进程占用内存较大。定位线程问题(通过命令查看PID 为25894 进程的线程情况),命令:# ps p 916 -...
  • 查询各进程占用内存情况:ps aux | awk '{print $6/1024/1024 " GB\t\t" $2,$11}' |grep java|grep -v grep | sort -n 解决方法: A:可能是代码原因导致的问题: 1、使用命令:top查看当前进程的状态 2、从...
  • import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.LineNumberReader;import java.lang.management.ManagementFactory;impor...
  • java线程-cpu内存占用-定位分析

    千次阅读 2016-03-08 13:16:23
    一,创建测试环境(windows) 二,定位 正文: 测试环境如下: 建立2个线程类,一个run死循环执行大量io,另一个run死循环执行1...可看出,java进程里2个线程占用cpu。 现在大概定位问题了,如果对程序很熟悉
  • 使用top命令查看系统资源的使用情况,命令:top如图可以看到java的进程内存使用率较高,java进程的内存使用率达到了70%+2.定位线程问题(通过命令查看9718进程的线程情况),命令:ps p 9718 -L -o pcpu,pmem,pid,tid,...
  • 出现的问题截图: 问题排查 **查看cpu **查看对cpu影响大的10个进程ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head ?...**查看活着的线程,查看占用cpu高的Java线程 ./jmap -histo:live 19534 ...
  • 二、找到内存和CPU占用最高的线程pid 1,使用命令top -p ,显示你的java进程的内存情况,pid是你的java进程号,比如123 2,按H,获取每个线程内存情况 3,找到内存和cpu占用最高的线程pid,比如15248 4...
  • 1.使用top -H -p命令查看进程里边的多个线程的cpu使用情况,一般都是看使用最高的前三个线程,记录对应的进程号 2.通过jstack导出进程堆栈信息,然后在堆栈信息里边搜索top查出来的线程号(转换为16进制),找到对应的...
  • 使用top命令查看系统资源的使用情况,命令:top如图可以看到java的进程内存使用率较高,java进程的内存使用率达到了70%+2.定位线程问题(通过命令查看9718进程的线程情况),命令:ps p 9718 -L -o pcpu,pmem,pid,tid,...
  • 使用top命令查看系统资源的使用情况,命令:top如图可以看到java的进程内存使用率较高,java进程的内存使用率达到了70%+2.定位线程问题(通过命令查看9718进程的线程情况),命令:ps p 9718 -L -o pcpu,pmem,pid,tid,...
  • 首先通过jstack命令查看java进程中各个线程的栈信息jstack 3203 >1.txt 导出到1.txt文件待用2.首先通过top -H -p pid 分析出java进程中占用cpu高的线程号top -H -p 32033.获取到占用cpu高的线...
  • Linux服务器java进程占用系统内存

    千次阅读 2019-01-04 09:26:49
    如图可以看到java的进程内存使用率较高,java进程的内存使用率达到了70%+ 2.定位线程问题(通过命令查看9718进程的线程情况),命令:ps p 9718 -L -o pcpu,pmem,pid,tid,time,tname,cmd  由此可以看到这PID...
  • 今天发现有个java应用占用CPU一直很高,将查看哪个线程导致CPU占用率高的方法总结如下: 查看进程PID 使用top、ps等命令都可以,这里使用top: 可以看到PID=7679和PID=7745的进程占用CPU都很高。 通过top -Hp PID...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 341
精华内容 136
关键字:

查看java线程占用内存

java 订阅