Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.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 当只分配1个数组时,如何计算JVM的最小MaxHeapSize?_Java_Jvm_Heap Memory - Fatal编程技术网

Java 当只分配1个数组时,如何计算JVM的最小MaxHeapSize?

Java 当只分配1个数组时,如何计算JVM的最小MaxHeapSize?,java,jvm,heap-memory,Java,Jvm,Heap Memory,鉴于: 2M*4(整数的字节数)=8Mb(+元空间可能为4mb,否?) 运行堆大小为12Mb的JVM-Xmx12m-XX:+PrintFlagsFinal 我变得很好 线程“main”java.lang.OutOfMemoryError中出现异常:java堆空间 但是当我将堆增加到13Mb时,它运行得很好 查看-XX:+PrintFlagsFinal的值,如何计算允许无错误运行该代码段的确切最小最大堆阈值?(概率为99%,至少在几秒钟内无任何错误) 请尝试了解运行时对象,请参见以下内容: $ j

鉴于:

2M*4(整数的字节数)=8Mb(+元空间可能为4mb,否?)

运行堆大小为12Mb的JVM
-Xmx12m-XX:+PrintFlagsFinal
我变得很好
线程“main”java.lang.OutOfMemoryError中出现异常:java堆空间
但是当我将堆增加到13Mb时,它运行得很好

查看
-XX:+PrintFlagsFinal
的值,如何计算允许无错误运行该代码段的确切最小最大堆阈值?(概率为99%,至少在几秒钟内无任何错误)


请尝试了解运行时对象,请参见以下内容:

$ java -version
java version "1.8.0_51"
Java(TM) SE Runtime Environment (build 1.8.0_51-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)

请尝试了解运行时对象,请参见以下内容:

$ java -version
java version "1.8.0_51"
Java(TM) SE Runtime Environment (build 1.8.0_51-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)

JVM使用复制、分代收集器。一个较大的对象(相对于堆大小较大)将直接分配给老一代,这意味着您仍然需要一些额外的空间给年轻一代(eden+survivor 1和2)。它们的大小取决于所用的收集器和各种调谐旋钮

此外,数组将不是唯一被分配的对象。简单地创建一个类并运行
main()
将引入一组最小的JRE类,例如
class
Classloader
String
Thread
等等。您必须对空程序进行堆转储,以评估到底加载了什么


实际上,如果在计算中对JVM行为有任何微小的预测失误,那么试图计算绝对最小值只是自找麻烦。一种更安全的方法是在给定各种输入大小的情况下测量内存行为,然后添加一些安全裕度,并检查算法是否存在内存消耗比平均情况更严重的潜在病理行为。

JVM使用复制、分代收集器。一个较大的对象(相对于堆大小较大)将直接分配给老一代,这意味着您仍然需要一些额外的空间给年轻一代(eden+survivor 1和2)。它们的大小取决于所用的收集器和各种调谐旋钮

此外,数组将不是唯一被分配的对象。简单地创建一个类并运行
main()
将引入一组最小的JRE类,例如
class
Classloader
String
Thread
等等。您必须对空程序进行堆转储,以评估到底加载了什么


实际上,如果在计算中对JVM行为有任何微小的预测失误,那么试图计算绝对最小值只是自找麻烦。一种更安全的方法是,在给定各种输入大小的情况下测量内存行为,然后添加一些安全裕度,并检查算法是否存在内存消耗比平均情况更严重的潜在病理行为。

如果您要分配一大块这样的原语,我会使用直接内存<代码>ByteBuffer.allocateDirect(大小*4).asIntBuffer()这几乎不使用堆,不管大小如何

在查看所需的堆时,我会忽略任何小于100MB的开销,除非您知道这是一个问题。100MB相当于你2分钟的时间,担心它可能不会有效地利用你的时间


但是,通常情况下,数组中的int元素需要4个字节,这会带来一些开销。

如果要分配一大块这样的原语,我会使用直接内存<代码>ByteBuffer.allocateDirect(大小*4).asIntBuffer()这几乎不使用堆,不管大小如何

在查看所需的堆时,我会忽略任何小于100MB的开销,除非您知道这是一个问题。100MB相当于你2分钟的时间,担心它可能不会有效地利用你的时间


但是,通常情况下,数组中的int元素需要4个字节,这会带来一些开销。

我不认为这是实际可预测的。JVM开销将因版本而异,这是不可预测的。MB=MB,MB=MB,MB=milli-bits。另一个计算是您的时间价值(以MB为单位)。如果你在英国领取最低工资,你一分钟的时间价值4800万英镑。如果您花费超过一分钟的时间思考48MB,那么您可能在这方面花费的时间太长了。你可能会让你的公司付出代价,或者你的时间比最低工资更值钱。我不认为这是现实的预测。JVM开销将因版本而异,这是不可预测的。MB=MB,MB=MB,MB=milli-bits。另一个计算是您的时间价值(以MB为单位)。如果你在英国领取最低工资,你一分钟的时间价值4800万英镑。如果您花费超过一分钟的时间思考48MB,那么您可能在这方面花费的时间太长了。你也可能会让你的公司付出代价,或者你的时间比最低工资更有价值。
Runtime.getRuntime().totalMemory();
Runtime.getRuntime().maxMemory();
Runtime.getRuntime().freeMemory();