2014-10-07 31 views
1

我正在使用最新的Java Runtime 8,并且已经在JavaFX中创建了一个应用程序以在画布中加载图像。 如果数据大小低于2GB,则应用程序运行良好,但如果超过2GB甚至是1 MB,则会记录以下错误。如果我加载的数据超过2 GB,则获得EXCEPTION_ACCESS_VIOLATION与Java 8

A fatal error has been detected by the Java Runtime Environment: 

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000053def51c, pid=5716, tid=10968 

JRE version: Java(TM) SE Runtime Environment (8.0_20-b26) (build 1.8.0_20-b26) 
Java VM: Java HotSpot(TM) 64-Bit Server VM (25.20-b23 mixed mode windows-amd64 compressed oops) 
Problematic frame: V [jvm.dll+0x21f51c] 

Failed to write core dump. Minidumps are not enabled by default on client versions of Windows 

An error report file with more information is saved as: 
C:\Users\105064864\Documents\NetBeansProjects\JavaFX3DApplication\hs_err_pid5716.log 

Compiled method (nm) 51180 1220  n 0  sun.misc.Unsafe::copyMemory (native) 
total in heap [0x0000000002f4fb10,0x0000000002f4fe90] = 896 
relocation  [0x0000000002f4fc30,0x0000000002f4fc78] = 72 
main code  [0x0000000002f4fc80,0x0000000002f4fe90] = 528 

If you would like to submit a bug report, please visit: 
    http://bugreport.sun.com/bugreport/crash.jsp 

我试过了几个选项,没有任何工作。

我使用Windows 7和JRE是8.0

我的Java和OS都是64位。

我在8GB和16GB RAM上试过这个。

我已经将虚拟机选项(-Xmx4g)设置为分配4GB及以上,但没有任何效果。

机器的图形卡对数据有限制吗? 或者除了-Xmx4g还有其他一些设置,我们可以设置显式允许超过2 GB的数据加载?

回答

0

随着幻数为2GB,首先想到的是某处有一个阵列正在启动以保存整个数据。由于在Java中数组索引必须是int类型(参考:http://docs.oracle.com/javase/specs/jls/se8/html/jls-10.html#jls-10.4),所以最大数组长度可以是Integer.MAX_VALUE(2147483647)。因此,假设数据作为单字节数组加载,我们得到2147483647字节〜2GB作为最大容量。因此,通过尝试分配更大的数组可能会导致上述异常。

这种情况通常是通过将数据加载到块中而不是将所有内容存储在单字节数组中来处理的。但是,据我所知,不是你的代码能够从存储器中进行实际的物理读取。也许如果你提到应用程序的用例,那么提出更高级别的解决方案会更容易