Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 64位版本比32位版本使用更多内存_Java_Performance_Memory_32bit 64bit - Fatal编程技术网

Java 64位版本比32位版本使用更多内存

Java 64位版本比32位版本使用更多内存,java,performance,memory,32bit-64bit,Java,Performance,Memory,32bit 64bit,我正在测试我的java应用程序,我注意到java 64位版本比在java 32位版本中执行应用程序要多得多 我测试的服务器是Windows7-64位和Solaris-64位,但在这两种情况下都发生了相同的行为。顺便说一下,应用程序使用默认VM参数运行,使用的Java版本是8u65s 因为我的服务器是64位的,所以正确的选择应该是Java 64位,但这有什么原因吗?在什么情况下,32位版本优于64位版本 在以下两种情况下分配的内存: 32-bit : 74mb 64-bit: 249mb 这是J

我正在测试我的java应用程序,我注意到java 64位版本比在java 32位版本中执行应用程序要多得多

我测试的服务器是Windows7-64位和Solaris-64位,但在这两种情况下都发生了相同的行为。顺便说一下,应用程序使用默认VM参数运行,使用的Java版本是8u65s

因为我的服务器是64位的,所以正确的选择应该是Java 64位,但这有什么原因吗?在什么情况下,32位版本优于64位版本

在以下两种情况下分配的内存:

32-bit : 74mb
64-bit: 249mb

这是Java(以及Microsoft.NET)的正常行为,主要是因为它们的指针模型和垃圾收集模型

对象变量实际上是指向堆上对象的指针。在64位版本中,此指针需要两倍的空间。因此,存储在容器中的指针需要更多内存,垃圾收集器持有的允许收集的指针也需要更多内存。由于对象大多由指向其他对象的指针组成,32位和64位之间的差异加起来非常快

此外,垃圾收集器必须高效地跟踪所有这些对象,并且在64位版本中,收集器倾向于使用更大的最小分配大小,因此它不必跟踪尽可能多的内存片。这是有道理的,因为不管怎样,对象都更大。我相信在32位模式下,最小大小通常为16字节,在64位模式下为32字节,但这些大小完全取决于您使用的特定虚拟机,因此它们会有所不同

例如,如果您有一个只需要12字节堆内存的对象,并且您在一个最小分配大小为32字节的虚拟机上运行,那么它将使用32字节,其中20字节被浪费。如果在最小大小为16字节的计算机上分配相同的对象,它将使用16字节,其中4个字节被浪费。另一种方法是在跟踪这些块时浪费大量内存,因此这实际上是最好的方法,并将保持应用程序的性能和资源利用率的平衡

要记住的另一件事是Java运行时从操作系统为其堆分配内存块,然后程序可以从这些块中分配内存。运行时试图保持在程序内存需求的前面,因此它将分配比所需更多的内存,并让您的程序扩展到内存中。使用更高的最小分配大小,64位运行时将为其堆分配更大的块,因此与32位运行时相比,您将拥有更多未使用的内存


如果内存消耗对特定应用程序是一个严重的约束,那么您可以考虑本地编译的C++(使用实际的C++标准,而不是用指针指向对象的遗留C!)。本地C++通常需要1/5的java内存来完成同样的事情,这就是本地代码在移动设备(C++和Objic C)上更受欢迎的原因。当然,C++有其自身的问题,所以除非你有一个迫切需要减少内存消耗的情况,否则最好是接受这个行为作为正常行为,并使用64位java java。< /P> < P>这是Java(以及微软.NET)的正常行为,主要是因为它们的指针模型,还有他们的垃圾收集模型。 对象变量实际上是指向堆上对象的指针。在64位版本中,此指针需要两倍的空间。因此,存储在容器中的指针需要更多内存,垃圾收集器持有的允许收集的指针也需要更多内存。由于对象大多由指向其他对象的指针组成,32位和64位之间的差异加起来非常快

此外,垃圾收集器必须高效地跟踪所有这些对象,并且在64位版本中,收集器倾向于使用更大的最小分配大小,因此它不必跟踪尽可能多的内存片。这是有道理的,因为不管怎样,对象都更大。我相信在32位模式下,最小大小通常为16字节,在64位模式下为32字节,但这些大小完全取决于您使用的特定虚拟机,因此它们会有所不同

例如,如果您有一个只需要12字节堆内存的对象,并且您在一个最小分配大小为32字节的虚拟机上运行,那么它将使用32字节,其中20字节被浪费。如果在最小大小为16字节的计算机上分配相同的对象,它将使用16字节,其中4个字节被浪费。另一种方法是在跟踪这些块时浪费大量内存,因此这实际上是最好的方法,并将保持应用程序的性能和资源利用率的平衡

要记住的另一件事是Java运行时从操作系统为其堆分配内存块,然后程序可以从这些块中分配内存。运行时试图保持在程序内存需求的前面,因此它将分配比所需更多的内存,并让您的程序扩展到内存中。使用更高的最小分配大小,64位运行时将为其堆分配更大的块,因此与32位运行时相比,您将拥有更多未使用的内存


如果内存消耗对特定应用程序是一个严重的约束,那么您可以考虑本地编译的C++(使用实际的C++标准,而不是用指针指向对象的遗留C!)。本地C++通常需要1/5的java内存来完成同样的事情,这就是本地代码在移动设备(C++和Objic C)上更受欢迎的原因。当然,C++有其自身的问题,所以除非你有一个迫切需要减少内存消耗,它最好是接受这一正常行为,并保持使用64位java。< /P> < P> 64个内存模型占用更多内存是正确的。 除此之外,我