java imageio cpu过高_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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
imageio.write()是Java中的一个方法,用于将图像写入指定的输出流或文件中。它的用法如下: 1. 导入相关类 ```java import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; ``` 2. 创建BufferedImage对象 ```java BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); ``` 3. 将图像数据写入BufferedImage对象中 ```java // TODO: 将图像数据写入BufferedImage对象中 ``` 4. 将BufferedImage对象写入文件或输出流中 ```java File output = new File("output.png"); try { ImageIO.write(image, "png", output); } catch (IOException e) { e.printStackTrace(); } ``` 其中,第一个参数image是要写入的BufferedImage对象,第二个参数是输出格式,第三个参数是输出的文件或输出流。 注意,ImageIO.write()方法支持的输出格式包括:BMP、GIF、JPEG、PNG、WBMP等。 完整示例代码: ```java import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class ImageIOWriteExample { public static void main(String[] args) { int width = 200; int height = 200; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { int rgb = (x + y) % 2 == 0 ? 0xFFFFFF : 0x000000; image.setRGB(x, y, rgb); } } File output = new File("output.png"); try { ImageIO.write(image, "png", output); } catch (IOException e) { e.printStackTrace(); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值