Speed tradeoff of Java's -Xms and -Xmx options
给出这两个命令
A:
1 | $ java -Xms10G -Xmx10G myjavacode input.txt |
B:
1 | $ java -Xms5G -Xmx5G myjavacode input.txt |
我有两个问题:
总而言之,这是一个折衷方案,您只能根据程序的内存行为来决定。
这取决于您的Java使用的GC。并行GC在较大的内存设置上可能会更好地工作-尽管我不是专家。
通常,如果您拥有更大的内存,则需要进行GC存取的频率就更少了-存在大量的垃圾空间。但是,当涉及到GC时,GC必须在更多的内存上工作-这反过来可能会更慢。
我发现在某些情况下,过多的内存可能会使程序变慢。
例如,我有一个基于hibernate的转换引擎,随着负载的增加,该引擎开始缓慢运行。事实证明,每次我们从数据库中获取一个对象时,hibernate都会检查内存中是否存在不再使用的对象。
解决方案是从会话中逐出旧对象。
斯图尔特
-Xms和-Xmx的各种设置之间的速度折衷取决于运行Java应用程序的应用程序和系统。它还取决于您的JVM和使用的其他垃圾回收参数。
这个问题已有11年历史了,从那时起,JVM参数对性能的影响就变得更加难以预先预测。因此,您可以尝试使用不同的值并查看对性能的影响,或者使用免费的工具(如Optimizer Studio)自动找到最佳的JVM参数值。
很难说内存分配将如何影响您的速度。这取决于JVM使用的垃圾回收算法。例如,如果您的垃圾收集器需要暂停以进行完整的收集,那么如果您的内存比实际需要多10个,则垃圾收集器还有10个要清理的垃圾。
如果您使用的是Java 6,则可以使用jconsole(在jdk的bin目录中)附加到您的进程,并观察收集器的行为。通常,收集器非常聪明,您不需要进行任何调整,但是如果有需要,可以使用许多选项来进一步调整收集过程。
这一直是我在一个应用程序上工作时遇到的问题,该应用程序为每个请求创建大量线程。
所以这是一个非常好的问题,它有两个方面:
1.我的Xms和Xmx值是否应该相同
-大多数网站,甚至Oracle文档都建议相同。但是,我建议在这些值之间留出10%到20%的缓冲区,以便在突然的高流量高峰或偶然的内存泄漏的情况下为应用程序调整堆大小。
2.是否应该以较小的堆大小启动我的应用程序
-这就是问题-无论您使用哪种GC算法(甚至是G1),大堆总会有一些折衷。目的是根据延迟和吞吐量来确定应用程序的行为,以确定可以允许GC暂停的堆大小。
-例如,如果您的应用程序有很多线程(每个线程在本机内存中有1 MB堆栈,在堆中没有),但不占用大量对象空间,那么我建议使用较低的Xms值。
-如果您的应用程序创建了许多对象,并且线程数量不断增加,请确定可以设置的Xms值来容忍这些STW暂停。这意味着确定可以容忍的传入请求的最大响应时间,并调整最小堆大小。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | > C:\\java -X -Xmixed mixed mode execution (default) -Xint interpreted mode execution only -Xbootclasspath:<directories and zip/jar files separated by ;> set search path for bootstrap classes and resources -Xbootclasspath/a:<directories and zip/jar files separated by ;> append to end of bootstrap class path -Xbootclasspath/p:<directories and zip/jar files separated by ;> prepend in front of bootstrap class path -Xnoclassgc disable class garbage collection -Xincgc enable incremental garbage collection -Xloggc:<file> log GC status to a file with time stamps -Xbatch disable background compilation -Xms<size> set initial Java heap size -Xmx<size> set maximum Java heap size -Xss<size> set java thread stack size -Xprof output cpu profiling data -Xfuture enable strictest checks, anticipating future default -Xrs reduce use of OS signals by Java/VM (see documentation) -Xcheck:jni perform additional checks for JNI functions -Xshare:off do not attempt to use shared class data -Xshare:auto use shared class data if possible (default) -Xshare:on require using shared class data, otherwise fail. |
(复制粘贴)