Java 将堆大小增加到6GB
我正在看以下文章: 现在我有一个需要5GB内存的程序,在执行文章中告诉我的操作(即通过在arguments字段中使用-Xmx5g来增加堆大小)的同时,我仍然得到了Java 将堆大小增加到6GB,java,heap-memory,Java,Heap Memory,我正在看以下文章: 现在我有一个需要5GB内存的程序,在执行文章中告诉我的操作(即通过在arguments字段中使用-Xmx5g来增加堆大小)的同时,我仍然得到了 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 我的系统是Windows 7(64位),带有8GB RAM。我做错什么了吗?如果是,我应该如何获得5GB的堆内存,或者我的系统无法处理 注:我必须使用25K*25K大小的2D矩阵进行计算,该
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
我的系统是Windows 7(64位),带有8GB RAM。我做错什么了吗?如果是,我应该如何获得5GB的堆内存,或者我的系统无法处理
注:我必须使用25K*25K大小的2D矩阵进行计算,该矩阵具有所有非零值。因此,我也不能使用稀疏矩阵。当JVM没有足够的内存来分配对象时,会抛出OutOfMemoryError。如果您定义了heap of
5G
,这几乎肯定意味着您存在某种内存泄漏。例如,我可以编写在任何环境下都会导致OutOfMemoryError
的非常简单的代码:
List<String> list = new LinkedList<>();
while(true) {
list.add("a");
}
List List=newlinkedlist();
while(true){
列表。添加(“a”);
}
运行此代码并等待几秒钟<将抛出代码>OutOfMemoryError。这是因为我将字符串添加到列表中,但从不清理它
我相信您的应用程序也会发生类似的情况
我明白,这并不像我的示例那么简单,所以您可能必须使用profiler来调试它,并了解内存泄漏的原因
编辑:
我刚刚看到你和25K*25K martrix一起工作。这意味着你有6.25亿个电池。您没有提到矩阵的类型,但如果它是占用4个字节的int
,则需要625*4=2500M=2.5G内存,因此5G就足够了
请试着分析你的程序中还发生了什么,以及你的内存在哪里使用 当JVM没有足够的内存来分配对象时,将抛出OutOfMemoryError。如果您定义了heap of
5G
,这几乎肯定意味着您存在某种内存泄漏。例如,我可以编写在任何环境下都会导致OutOfMemoryError
的非常简单的代码:
List<String> list = new LinkedList<>();
while(true) {
list.add("a");
}
List List=newlinkedlist();
while(true){
列表。添加(“a”);
}
运行此代码并等待几秒钟<将抛出代码>OutOfMemoryError。这是因为我将字符串添加到列表中,但从不清理它
我相信您的应用程序也会发生类似的情况
我明白,这并不像我的示例那么简单,所以您可能必须使用profiler来调试它,并了解内存泄漏的原因
编辑:
我刚刚看到你和25K*25K martrix一起工作。这意味着你有6.25亿个电池。您没有提到矩阵的类型,但如果它是占用4个字节的int
,则需要625*4=2500M=2.5G内存,因此5G就足够了
请试着分析你的程序中还发生了什么,以及你的内存在哪里使用 当JVM没有足够的内存来分配对象时,将抛出OutOfMemoryError。如果您定义了heap of
5G
,这几乎肯定意味着您存在某种内存泄漏。例如,我可以编写在任何环境下都会导致OutOfMemoryError
的非常简单的代码:
List<String> list = new LinkedList<>();
while(true) {
list.add("a");
}
List List=newlinkedlist();
while(true){
列表。添加(“a”);
}
运行此代码并等待几秒钟<将抛出代码>OutOfMemoryError。这是因为我将字符串添加到列表中,但从不清理它
我相信您的应用程序也会发生类似的情况
我明白,这并不像我的示例那么简单,所以您可能必须使用profiler来调试它,并了解内存泄漏的原因
编辑:
我刚刚看到你和25K*25K martrix一起工作。这意味着你有6.25亿个电池。您没有提到矩阵的类型,但如果它是占用4个字节的int
,则需要625*4=2500M=2.5G内存,因此5G就足够了
请试着分析你的程序中还发生了什么,以及你的内存在哪里使用 当JVM没有足够的内存来分配对象时,将抛出OutOfMemoryError。如果您定义了heap of
5G
,这几乎肯定意味着您存在某种内存泄漏。例如,我可以编写在任何环境下都会导致OutOfMemoryError
的非常简单的代码:
List<String> list = new LinkedList<>();
while(true) {
list.add("a");
}
List List=newlinkedlist();
while(true){
列表。添加(“a”);
}
运行此代码并等待几秒钟<将抛出代码>OutOfMemoryError。这是因为我将字符串添加到列表中,但从不清理它
我相信您的应用程序也会发生类似的情况
我明白,这并不像我的示例那么简单,所以您可能必须使用profiler来调试它,并了解内存泄漏的原因
编辑:
我刚刚看到你和25K*25K martrix一起工作。这意味着你有6.25亿个电池。您没有提到矩阵的类型,但如果它是占用4个字节的int
,则需要625*4=2500M=2.5G内存,因此5G就足够了
请试着分析你的程序中还发生了什么,以及你的内存在哪里使用 5G/(25K*25K)~8字节
慷慨地假设您的程序除了那个矩阵之外不使用内存,每个矩阵元素必须不超过8字节
您应该至少计算大约的内存需求,以检查是否有可能在您的硬件上处理这种大小的问题。例如,如果需要MxN大小为double
值的2D数组,则至少需要8*M*N字节的内存。5G/(25K*25K)~8字节
慷慨地假设您的程序除了那个矩阵之外不使用内存,每个矩阵元素必须不超过8字节
您应该至少计算大约的内存需求,以检查是否有可能在您的硬件上处理这种大小的问题。例如,如果您需要