Java内存溢出

4
我有一个名为CacheDownloader的类,用于下载并解压我的主jar文件(客户端)的更新。我遇到了一个问题,因为它无法在使用时解压新的客户端并替换旧的客户端,所以我不得不制作一个新的jar文件(称为ClientUpdater),它将解压新的客户端来替换旧的客户端,然后打开新的客户端。
ClientUpdater可以轻松打开客户端。但是,CacheDownloader无法打开ClientUpdater,它会出现内存不足错误。
CacheDownloader仍然会下载所有新文件并解压大部分文件,而ClientUpdater只需要解压包含相当小的客户端的微小zip文件。
以下是CacheDownloader如何加载ClientUpdater:
Runtime.getRuntime().exec("java -jar " + getCacheDir() + "/ClientUpdater.jar");
System.exit(0);

这是完整的错误信息 - http://gyazo.com/8105ffd4c35f5f6d4a68a770fedf8f92

希望这已经提供了足够的上下文和信息,没有过长。我的问题是,我该如何解决这个问题?错误显示我可以增加保留的代码缓存,这样做有什么负面影响吗?我该如何做到这一点,Google并没有真正展示如何操作,只是解释了它的作用。

我对Java还比较陌生,请注意这一点。


你的分析器告诉你什么,例如这个 - trashgod
我没有一个,这方面有点新。但错误确实显示了最大/已用/可用的信息,如果这是你需要的话? - VirtualJunky
您可能已经拥有jvisualvm,它通常随JDK一起提供。 - trashgod
2个回答

2
您可以尝试以下步骤来解决此问题。
  1. 增加进程的最小/最大堆大小

    Runtime.getRuntime().exec("java -Xms2048m -Xmx2048m -jar " + getCacheDir() + "/ClientUpdater.jar");

  2. 增加ReservedCodeCacheSize的大小, 如: -XX:ReservedCodeCacheSize=256m,更多细节请参考这里

您应该使用像visualvm这样的分析工具,以便获取有关运行时环境的更多详细信息,例如:内存、CPU、线程和堆的大小等。

0

我知道这是RSPS。我建议您使用反射来加载客户端,因为在环境变量未正确配置的系统上使用Runtime.exec将无法工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接