问题概述
1.1 问题概述
项目上线一段时间后,最近几天 在访问量不是很大的情况下 CPU持续上涨 只能通过手动重启Tomcat才能解决问题
问题分析定位
1.2.1 分析结果
JDK中处理图片的对象 MediaTracker的BUG
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6818960
为了解决此类问题,我们通过其它方式来避免JDK这个BUG,但是会存在图片失真的风险;
1.2.2 分析过程
通过部署我们提供的CPU监控脚本,发现其中有一个线程一直占用CPU 直至CPU超出预警线。线程信息 如下截图:
我们单独写了单元测试类,专门测试解析图片代码 并且使用 Jconsole 工具进行监控,最终找到一处处理CMYK的图片代码有异常. 而Oracle官方论坛也有此类问题的讨论
https://cn.forums.oracle.com/forums/thread.jspa?messageID=5358460
Image image=Toolkit.getDefaultToolkit().getImage(imgFilePath);
//如果图片路径是不变,那么上面方法返回的 Image 对象就会是最开始那一个,通过对返回的 Image 调用 flush 方法,可以手动丢弃以前加载的信息
image.flush();
MediaTracker mediaTracker = new MediaTracker(new Container());
mediaTracker.addImage(image, 0);
mediaTracker.waitForID(0);
既然这个有BUG ,那么我们不得不采用
Image image=ImageIO.read(file);
但是 ,ImageIO.read()方法无法读取CMYK编码的JPEG图片,见附件(cmyk_dog.jpg)
可以用以下方法解决:
http://stackoverflow.com/questions/2408613/problem-reading-jpeg-image-using-imageio-readfile-file
但是存在图片失真问题 ,
这个后期解决.......
- 大小: 12 KB
- 大小: 38.1 KB
- 大小: 100.1 KB
分享到:
相关推荐
在Java编程中,处理大容量文本文件是一项挑战,因为传统的逐行读取方式可能会消耗大量内存,导致程序崩溃。为了高效地处理这类问题,我们可以利用Java的`java.nio`包中的BufferedReader和FileChannel等类,实现按行...
它可以帮助开发者定位CPU消耗高的问题,通过查看方法调用栈,找出导致CPU负载过高的原因。源代码可能会包含对Java虚拟机(JVM)采样和解析数据的实现,以及如何将这些信息转化为用户友好的图形界面的代码。 3. **源...
在Java应用程序的运行过程中,有时候会遇到JVM(Java虚拟机)CPU使用率过高的问题。这通常是由于线程执行不恰当或者存在死锁、资源争抢等状况引起的。为了定位并解决这些问题,开发者需要有效地监控和分析Java线程的...
正则表达式在编程中广泛用于文本匹配和处理,但如果不小心编写了复杂的或有回溯问题的正则表达式,可能会导致CPU利用率急剧上升,甚至达到100%,严重影响系统性能。这个问题通常出现在使用非确定性有限自动机(NFA)...
在Javacard CPU设计中,通过微码,可以更高效地解析和执行Java指令。论文详细描述了如何设计这种处理器,并构建了基于该CPU的测试平台,将整个系统集成在一片FPGA上,实现了硬件Javacard指令处理。 这种硬件实现的...
伪共享发生在多线程环境中,当多个线程频繁修改位于同一CPU高速缓存行上的不同变量时,可能导致整个缓存行被频繁地在不同的CPU之间传递,从而降低程序性能。可以通过将数据结构设计得更加合理来避免伪共享。 #### ...
【Java多线程解析】 Java中的多线程技术是编程中的一个重要领域,它允许程序同时执行多个任务,从而更高效地利用CPU资源。在Java中,多线程主要用于模拟现实世界中的并发行为,例如"生产者-消费者"模型。本文将深入...
### Java并发编程:volatile关键字解析 #### 一、内存模型的相关概念 在深入了解`volatile`关键字之前,我们首先需要理解计算机内存模型的一些基本概念。在现代计算机系统中,CPU为了提高执行效率,会将频繁访问的...
3. **避免无限循环**:在程序设计中设置循环的最大次数,防止因无限循环而导致CPU占用率过高。 4. **流量控制**:通过设置合理的流量阈值(如QPS、TPS等),避免异常流量冲击系统,确保系统的稳定运行。 5. **精确...
util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...
VisualVM能够显示每个线程的CPU占用率,通过分析这些数据,开发者可以定位到可能导致CPU过载的代码段。 3. **源码解析** VisualVM的源码中包含了大量的Java API使用,如`sun.jvmstat`和`java.lang.management`包,...
- **优先级**:Java线程具有优先级,用于控制线程调度,但并不保证高优先级线程一定会先执行。 2. **创建线程** - **实现Runnable接口**:通过实现Runnable接口并创建Thread对象,将Runnable实例作为参数传递给...
在Java程序中,直接将变量拼接到SQL语句中看似方便,但实际上却导致了硬解析的频繁发生。例如,当使用如下代码: ```java String v_id = "xxxxx"; String v_sql = "SELECT name FROM table_a WHERE id=" + v_id; ``...
如果内存占用过高,可能是内存泄漏的迹象。 3. **类加载器**:查看类加载器的状态,看是否有未释放的类或者加载器导致的问题。 4. **垃圾收集**:分析垃圾回收(GC)日志,确定是否存在频繁的垃圾收集事件,这可能...
分析javacore文件通常包括检查线程状态,找出可能的阻塞点,以及查找CPU使用率高的线程。 2. **Heap Dump 文件**: Heap Dump是JVM内存的快照,包含了运行时的所有对象、类元数据、垃圾收集器信息等。当遇到内存...
util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...
如果线程计算部分不多,更多的线程只会导致频繁的切换上下文,让CPU的时间更多的花在线程调度而不是任务执行上。 3.java同步的几种方式:synchronized,volatile,显示锁,原子变量,线程及对象的基础同步方法。 ...
在Android设备上,由于硬件资源有限,使用DOM解析大文件可能会导致性能问题。 以下是如何在Android中使用DOM解析XML文件的基本步骤: 1. 引入必要的库: 在Java代码中,需要导入`javax.xml.parsers....
util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...