• imageio.write 惹的祸,占用cpu过高,堆溢出问题


    两次与imageio接触:

    1.在一个队列中消费消息的时候一个线程抛出堆溢出

    2.一次在线上cpu占用率过高

    线上出现cpu过高解决办法:

    1.启动一个shell命令窗口,top命令查看java进程

    2.在启动一个shell命令窗口,top -H -p 12233,查看这个进程的线程号

    3. 在启动一个shell命令窗口,当看到某个想成请求cpu过高的时候,输入jstack  12233 >>/data/test.txt,dump

    线程的日志文件

    4.将进程号转换为16进制,方法是在shell中输入printf %x 12233 转成比如3b82

    5. grep  -C 10 3b82或者jstat pid |grep -C 10 pid(16进制转换之后)

    其他方案:

    jstat -gcutil 15178 1s  观察一段时间GC状况

    jmap -histo 15178 | less 查看一下对象实例数量和空间占用

    jstack 5511 | wc -l 查看当前系统的线程总数
    加载当前的堆信息:jmap -dump:live,format=b,file=dump.hprof 5511
    统计总共线程数

    知识点:

    原文:https://blog.csdn.net/u010827436/article/details/46564641

    0.分类
    功能
        
    命令
    线程     jstack
    内存     jmap
    性能     jstat
    1.查找到Jvm的进程id,以后所有命令基本都需要
    jps
    # 附带jvm参数信息
    jps -v
    # 只显示id
    jps -q
    #输出main method的参数
    jps -m
    #输出完全的包名,应用主类名,jar的完全路径
    jps -l
    # 向下个命令输出pid
    jps | grep 'Bootstrap' | awk '{print $1}' |
    2.jstat命令使用
    jps  -opt  pid -h n (每隔多少行出现行头)interval(间隔多久)  count(多少次)
    # 查询gc百分比
    jstat -gcutil pid 1000
    # 显示三代的使用量
    jstat -gccapacity pid 1000
    # 显示加载class的数量,及所占空间等信息
    jstat -class pid
    # 显示VM实时编译的数量等信息
    jstat -compiler pid
    # 可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
    jstat -gc pid
    # 当前VM执行的信息
    jstat -printcompilation pid
    # 用于查看垃圾收集的统计情况(这个和-gcutil选项一样),如果有发生垃圾收集,它还会显示最后一次及当前正在发生垃圾收集的原因
    jstat -gccause pid
     
    3.jinfo可以输出并修改运行时的java 进程的参数
    jinfo -opt  pid
    # 打印所有pid相关的vm配置
    jinfo pid
    # 只显示某个配置 例如永久代:MaxPermSize
    jinfo -flag MaxPermSize pid
    # -flag [+|-]< name >:设置或取消指定java虚拟机参数的布尔值
    jinfo -flag +PrintGCDetails 2000
    # jinfo虽然可以在java程序运行时动态地修改虚拟机参数,但并不是所有的参数都支持动态修改
    4.jmap打印出某个java进程内存内的,所有‘对象’的情况
    jmap  -opt  pid
    # 使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件
    jmap -dump:format=b,file=test.bin pid
    # 打印正等候回收的对象的信息
    jmap -finalizerinfo pid
    # 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况
    jmap -heap pid
    # 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.
    # 统计大对象的时候很实用 但是会触发一次full gc
    jmap histo:live pid | head -n 23
    # 打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来
    jmap -permstat pid
     
    5.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息
    jstack -opt  pid
    # 一般使用是将jstack的结果输出到文件中来查看
    jstat pid > jstat01.log
    # 或者直接使用grep查找
    jstat pid |grep -C 10 pid(16进制转换之后)
    # 或者直接搜索关键字 Deadlock 之类的

    转换工具 http://tool.oschina.net/hexconvert

    dump 文件里,值得关注的线程状态有:
         死锁,Deadlock(重点关注)
         执行中,Runnable  
         等待资源,Waiting on condition(重点关注)
         等待获取监视器,Waiting on monitor entry(重点关注)
         暂停,Suspended
         对象等待中,Object.wait() 或 TIMED_WAITING
         阻塞,Blocked(重点关注)
         停止,Parked

  • 相关阅读:
    深入浅出 Redis client/server 交互流程
    VMware三种网络连接模式(转载)
    ARP 原理及攻击
    symbol lookup error:undefined symbol
    printf 颜色格式串"33[34;1m"
    运行openvas
    openvas 安装
    升级openssl 支持TLS1.2
    Windows登录密码明文获取器
    Linux字符串截取和处理命令 cut、printf、awk、sed、sort、wc
  • 原文地址:https://www.cnblogs.com/QAZLIU/p/10151879.html
Copyright © 2020-2023  润新知