我使用的是iTextPDF版本5.4.2,当负载很重时,我会遇到线程争用问题。我正在使用IBM JDK 6
这就是问题所在,当有多个独立的线程试图生成不同的pdf文件时,我在SecureRandom.nextBytes上看到一个争用,因为这是同步的,所有线程都在等待锁定这个对象。下面是线程转储
*"WebContainer : 0" daemon prio=3 tid=0x007ffc00 nid=0x91 waiting for monitor entry [0xc823d000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.security.SecureRandom.nextBytes(SecureRandom.java:433)
- waiting to lock <0xdf4b7430> (a java.security.SecureRandom)
at java.util.UUID.randomUUID(UUID.java:162)
at com.itextpdf.text.pdf.PdfPCell.<init>(PdfPCell.java:123)
at com.itextpdf.text.pdf.PdfPRow.<init>(PdfPRow.java:136)
at com.itextpdf.text.pdf.PdfPTable.<init>(PdfPTable.java:260)
at com.itextpdf.text.pdf.PdfPCell.<init>(PdfPCell.java:251)
at com.itextpdf.text.pdf.PdfPRow.<init>(PdfPRow.java:136)
at com.itextpdf.text.pdf.PdfPTable.<init>(PdfPTable.java:260)
at com.itextpdf.text.pdf.PdfPCell.<init>(PdfPCell.java:251)
at com.itextpdf.text.pdf.PdfPRow.<init>(PdfPRow.java:136)
at com.itextpdf.text.pdf.PdfPTable.<init>(PdfPTable.java:260)
at com.itextpdf.text.pdf.PdfPCell.<init>(PdfPCell.java:251)
at com.itextpdf.text.pdf.PdfPRow.<init>(PdfPRow.java:136)
at com.itextpdf.text.pdf.PdfPTable.adjustCellsInRow(PdfPTable.java:1377)
at com.itextpdf.text.pdf.PdfPTable.getRows(PdfPTable.java:1364)
at com.itextpdf.text.pdf.ColumnText.goComposite(ColumnText.java:1702)
at com.itextpdf.text.pdf.ColumnText.go(ColumnText.java:881)
at com.itextpdf.text.pdf.ColumnText.go(ColumnText.java:876)
at com.itextpdf.text.pdf.ColumnText.go(ColumnText.java:865)
at com.itextpdf.text.pdf.PdfDocument.addPTable(PdfDocument.java:2566)
at com.itextpdf.text.pdf.PdfDocument.add(PdfDocument.java:723)
at com.itextpdf.text.Document.add(Document.java:278)* 你能帮我避免这个问题吗?
侧边
发布于 2014-12-11 16:14:53
我希望争用不是针对锁,而是针对随机字节。我很难确切地知道您使用的是什么设置,但我怀疑SecureRandom类使用了操作系统提供的(缓慢的)安全随机服务,而且您正在耗尽熵池。当数据耗尽时,读取随机数据的调用将被阻塞,直到有更多的数据可用为止。试图获取随机数据的其他线程将卡在锁上,使其看起来像是锁的问题。
我认为解决这个问题的最简单的方法是升级到最新版本的iTextPdf。在此版本中,ID已从UUID更改为从不阻塞的计数器生成的整数。
如果不能升级,另一个可能的解决方法是更改环境中使用的安全提供程序,以提供安全性较低但速度更快的SecureRandom服务。
https://stackoverflow.com/questions/27426344
复制相似问题