我正在使用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)*
你能帮忙避免这个问题吗?
西特
答案 0 :(得分:1)
我希望争用不是针对锁,而是针对随机字节。我很难确切地说出你正在使用什么设置,但我怀疑SecureRandom
类利用操作系统提供的(慢)安全随机服务,并且你正在耗尽熵池。当它耗尽时,读取随机数据的调用将阻塞,直到有更多数据可用。尝试获取随机数据的其他线程将卡在锁上,使其看起来像锁是问题。
我认为解决此问题的最简单方法是升级到最新版本的iTextPdf。在此版本中,ID已从UUID更改为从不会阻止的计数器生成的整数。
如果无法升级,另一个可能的修复方法是更改环境中使用的安全提供程序,以提供安全性较低但速度较快的SecureRandom
服务。