Java 当只分配1个数组时,如何计算JVM的最小MaxHeapSize?
鉴于: 2M*4(整数的字节数)=8Mb(+元空间可能为4mb,否?) 运行堆大小为12Mb的JVMJava 当只分配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
-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();