"java -server"和"java -client"之间有什么实际的区别吗?我在Sun的网站上找到的只是一个模糊的" - 服务器启动较慢但应该运行得更快".有什么真正的区别?(目前使用JDK 1.6.0_07.)
在回答了关于如何用Java强制释放对象的问题(这个人正在清除一个1.5GB的HashMap)后System.gc(),我被告知System.gc()手动调用是不好的做法,但这些评论并不完全令人信服.此外,似乎没有人敢投票,也没有人回答我的回答.
我被告知这是不好的做法,但后来我也被告知垃圾收集器运行不再系统地停止世界,并且它也可以有效地被JVM用作提示,所以我有点像茫然
我知道JVM在需要回收内存时通常比你知道的要好.我也明白,担心几千字节的数据是愚蠢的.我也明白,甚至数兆字节的数据也不是几年前的数据.但仍然,1.5千兆字节?而且你知道内存中有1.5 GB的数据; 它不像是在黑暗中拍摄.是System.gc()系统性的坏,还是有一点它变得好吗?
所以问题实际上是双重的:
System.gc()?它是否仅仅是某些实现中JVM的提示,还是一个完整的收集周期?真的有垃圾收集器实现可以在不停止世界的情况下完成工作吗?请详细说明人们在评论中对我的回答所做的各种断言.System.gc(),或者有时候可以接受?如果是这样,那些时候是什么时候?我正在运行JVM 1.5.0(Mac OS X Default),我在Activity Monitor中监视我的Java程序.我有以下内容:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Date;
public class MemoryTest {
public static void memoryUsage() {
System.out.println(
Runtime.getRuntime().totalMemory() -
Runtime.getRuntime().freeMemory()
);
}
public static void main( String[] args ) throws IOException {
/* create a list */
ArrayList<Date> list = new ArrayList<Date>();
/* fill it with lots of data */
for ( int i = 0; i < 5000000; i++ ) {
list.add( new Date() );
} // systems shows ~164 …Run Code Online (Sandbox Code Playgroud) 我们最近使用以下配置测试了 G1 垃圾收集器:
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseG1GC -XX:MaxGCPauseMillis=1250 -XX:+PrintTenuringDistribution -Xloggc:${logdir}/gc-$(date +%Y_%m_%d -%H_%M).log -XX:+UseStringDeduplication -XX:+PrintStringDeduplicationStatistics -XX:+PrintPromotionFailure -XX:+PrintAdaptiveSizePolicy -XX:+PrintHeapAtGC -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -XX:+UnlockExperimentalVMOptions -XX:G1NewSizePercent=15 -XX:ParallelGCThreads=8 -XX:+ParallelRefProcEnabled -XX:G1HeapRegionSize=8M JAVA_OPTS_HEAP: -Xms16g -Xmx16g
我们最近遇到一个问题,两个 java 进程在具有 48 GB RAM 的机器上以上述配置运行,并且两个进程各自消耗大约 20 - 22 GB RAM(少数小进程消耗剩余内存) ,从而填满整个 RAM,然后触发磁盘交换,最终导致 OOM 和进程被杀死。
这似乎令人担忧,因为 NMT 都没有以有意义的方式报告内存使用情况,我们也没有从 GC 日志中获得任何有关此使用情况的线索。在 NMT 统计中,应用程序内存低于 16G,元空间使用量低于 1G。
我们尝试将 maxMetaSpaceSize 设置为 2G,但这也没有帮助。当进程运行数天时,RAM 使用量似乎会无限增长。
从其他问题来看,G1 垃圾收集器确实倾向于消耗更多内存,但磁盘交换是一个令人担忧的问题。有人可以提供一些有关如何解决此问题的指示吗?