【问题标题】:Exception occurred while instantiating a Java object (ColdFusion)实例化 Java 对象时发生异常 (ColdFusion)
【发布时间】:2012-09-18 01:03:37
【问题描述】:

我不久前为adding a link to a pdf 找到了这个解决方案。如果偶尔使用它就像一个魅力(在每次使用之间重新启动服务器)。我发现由于某种原因(我对 java 和 iText 不是很有经验),在尝试第二次运行此脚本(无需重新启动)时,ColdFusion 返回错误:

对象实例化异常。

实例化 Java 对象时发生异常。班上 不能是接口或抽象类。错误:''。

ColdFusion 然后指示导致错误的行似乎在:

pdfReader = createObject("java","com.lowagie.text.pdf.PdfReader").init(inputPath);

谁对此了解更多、有解决方案或可以解释为什么会发生这种情况?我认为以某种方式创建的 java 对象在 java 中“存活”但当然不能在 CF 中存活。

堆栈跟踪:

java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at coldfusion.runtime.java.JavaProxy.CreateObject(JavaProxy.java:166)
    at coldfusion.runtime.java.JavaProxy.invoke(JavaProxy.java:80)
    at coldfusion.runtime.CfJspPage._invoke(CfJspPage.java:2360)
    at cfSched_PushJobs2MultiPress32ecfm1907554548._factor16(E:\Inetpub\DashBoards\MultiPress\Sched_PushJobs2MultiPress3.cfm:549)
    at cfSched_PushJobs2MultiPress32ecfm1907554548._factor17(E:\Inetpub\DashBoards\MultiPress\Sched_PushJobs2MultiPress3.cfm:547)
    at cfSched_PushJobs2MultiPress32ecfm1907554548._factor45(E:\Inetpub\DashBoards\MultiPress\Sched_PushJobs2MultiPress3.cfm:543)
    at cfSched_PushJobs2MultiPress32ecfm1907554548._factor25(E:\Inetpub\DashBoards\MultiPress\Sched_PushJobs2MultiPress3.cfm)
    at cfSched_PushJobs2MultiPress32ecfm1907554548._factor49(E:\Inetpub\DashBoards\MultiPress\Sched_PushJobs2MultiPress3.cfm:512)
    at cfSched_PushJobs2MultiPress32ecfm1907554548._factor51(E:\Inetpub\DashBoards\MultiPress\Sched_PushJobs2MultiPress3.cfm:509)
    at cfSched_PushJobs2MultiPress32ecfm1907554548._factor53(E:\Inetpub\DashBoards\MultiPress\Sched_PushJobs2MultiPress3.cfm:461)
    at cfSched_PushJobs2MultiPress32ecfm1907554548._factor58(E:\Inetpub\DashBoards\MultiPress\Sched_PushJobs2MultiPress3.cfm:213)
    at cfSched_PushJobs2MultiPress32ecfm1907554548._factor129(E:\Inetpub\DashBoards\MultiPress\Sched_PushJobs2MultiPress3.cfm:207)
    at cfSched_PushJobs2MultiPress32ecfm1907554548._factor146(E:\Inetpub\DashBoards\MultiPress\Sched_PushJobs2MultiPress3.cfm:102)
    at cfSched_PushJobs2MultiPress32ecfm1907554548.runPage(E:\Inetpub\DashBoards\MultiPress\Sched_PushJobs2MultiPress3.cfm:1)
    at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:231)
    at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:416)
    at coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65)
    at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:360)
    at coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40)
    at coldfusion.filter.PathFilter.invoke(PathFilter.java:94)
    at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:70)
    at coldfusion.filter.BrowserDebugFilter.invoke(BrowserDebugFilter.java:79)
    at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28)
    at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38)
    at coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46)
    at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38)
    at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22)
    at coldfusion.filter.CachingFilter.invoke(CachingFilter.java:62)
    at coldfusion.CfmServlet.service(CfmServlet.java:200)
    at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89)
    at jrun.servlet.FilterChain.doFilter(FilterChain.java:86)
    at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42)
    at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46)
    at jrun.servlet.FilterChain.doFilter(FilterChain.java:94)
    at jrun.servlet.FilterChain.service(FilterChain.java:101)
    at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106)
    at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42)
    at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286)
    at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543)
    at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203)
    at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320)
    at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428)
    at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266)
    at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)
Caused by: java.io.IOException: Map failed
    at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:758)
    at com.lowagie.text.pdf.MappedRandomAccessFile.init(Unknown Source)
    at com.lowagie.text.pdf.MappedRandomAccessFile.<init>(Unknown Source)
    at com.lowagie.text.pdf.RandomAccessFileOrArray.<init>(Unknown Source)
    at com.lowagie.text.pdf.RandomAccessFileOrArray.<init>(Unknown Source)
    at com.lowagie.text.pdf.PRTokeniser.<init>(Unknown Source)
    at com.lowagie.text.pdf.PdfReader.<init>(Unknown Source)
    at com.lowagie.text.pdf.PdfReader.<init>(Unknown Source)
    ... 48 more
Caused by: java.lang.OutOfMemoryError: Map failed
    at sun.nio.ch.FileChannelImpl.map0(Native Method)
    at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:755)
    ... 55 more

【问题讨论】:

  • 对于java对象,错误的实际原因包含在stack trace中。请使用堆栈跟踪更新您的问题。

标签: java coldfusion itext


【解决方案1】:

这不是一个大文件,但很大程度上取决于可用的服务器内存以及其他进程正在使用多少。您可能想尝试为阅读器使用RandomAccessFileOrArray 并缓冲编写器输出。看看是否有帮助。此外,请确保您正在关闭压模和输出流。

// use random access when reading 
raf = createObject("java", "com.lowagie.text.pdf.RandomAccessFileOrArray").init(inputPath, false, true);
pdfReader = createObject("java", "com.lowagie.text.pdf.PdfReader").init( raf, javacast("null", ""));
... 
// buffer the output
fos = createObject("java", "java.io.FileOutputStream");
outStream = createObject("java", "java.io.BufferedOutputStream").init( fos.init( outputPath ) );
pdfStamper = createObject("java", "com.lowagie.text.pdf.PdfStamper").init( pdfReader, outStream );

【讨论】:

  • 谢谢,我想会有足够的可用内存,但你的改进可能会做到这一点。马上试试这个!
  • 最终你可能仍然需要增加内存。但是首先尝试 RandomAccessFileOrArray(..plainRandomAccess) 不会有任何伤害。
  • 谢谢,您使用 RandomAccessFileOrArray 建议的解决方案工作正常!我还会检查内存问题。
  • (对于档案)显然原始错误意味着您 do not have enough contiguous memory 可用。所以后备方案是尝试plainRandomAccess,它与nio 不同,它必须不需要连续 内存。
  • 代码在 VMware 虚拟化服务器上​​运行,并与大约 7 或 8 个其他实例一起运行。虽然有大量可用的 ram 和 cpu 电源,但我会进行一些挖掘以找出这是否可能是分配的内存以任何方式碎片化并因此导致此错误的原因...
【解决方案2】:

错误给出了问题。转到第一行“Caused by”:

java.lang.OutOfMemoryError: Map failed     at sun.nio.ch.FileChannelImpl.map0(Native Method) 

根本原因是您的内存不足。尝试增加 JVM 的可用内存。

【讨论】:

  • 这是一个 600 页,未经优化的 86MB pdf 文件。由于它第一次运行良好,之后无法运行,即使在重新启动 ColdFusion 服务后,我认为我可以排除内存问题。在运行上述代码之前,我将运行一个优化,将文件大小除以 2。
  • 谢谢,我会在 CF admin 中检查 JVM 设置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
  • 2023-03-13
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多