相关疑难解决方法(0)

"java -server"和"java -client"之间的真正区别?

"java -server"和"java -client"之间有什么实际的区别吗?我在Sun的网站上找到的只是一个模糊的" - 服务器启动较慢但应该运行得更快".有什么真正的区别?(目前使用JDK 1.6.0_07.)

java jvm jvm-hotspot

380
推荐指数
8
解决办法
23万
查看次数

为什么调用System.gc()是不好的做法?

回答了关于如何用Java强制释放对象的问题(这个人正在清除一个1.5GB的HashMap)后System.gc(),我被告知System.gc()手动调用是不好的做法,但这些评论并不完全令人信服.此外,似乎没有人敢投票,也没有人回答我的回答.

我被告知这是不好的做法,但后来我也被告知垃圾收集器运行不再系统地停止世界,并且它也可以有效地被JVM用作提示,所以我有点像茫然

我知道JVM在需要回收内存时通常比你知道的要好.我也明白,担心几千字节的数据是愚蠢的.我也明白,甚至数兆字节的数据也不是几年前的数据.但仍然,1.5千兆字节?而且你知道内存中有1.5 GB的数据; 它不像是在黑暗中拍摄.是System.gc()系统性的坏,还是有一点它变得好吗?

所以问题实际上是双重的:

  • 打电话为什么或不是不好的做法System.gc()?它是否仅仅是某些实现中JVM的提示,还是一个完整的收集周期?真的有垃圾收集器实现可以在不停止世界的情况下完成工作吗?请详细说明人们在评论中对我的回答所做的各种断言.
  • 门槛在哪里?打电话是不是一个好主意System.gc(),或者有时候可以接受?如果是这样,那些时候是什么时候?

java garbage-collection

317
推荐指数
7
解决办法
12万
查看次数

在释放对象和垃圾回收后,Java仍然使用系统内存

我正在运行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)

java garbage-collection memory-leaks memory-management

9
推荐指数
2
解决办法
9787
查看次数

G1 垃圾收集器的高内存使用问题

我们最近使用以下配置测试了 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 垃圾收集器确实倾向于消耗更多内存,但磁盘交换是一个令人担忧的问题。有人可以提供一些有关如何解决此问题的指示吗?

java memory garbage-collection g1gc

3
推荐指数
1
解决办法
8674
查看次数