升级到 Ubuntu 14 后,我遇到所有 JVM 崩溃的问题。
我重新安装了 Java(oracle 和 openjdk 版本)。我花了一些时间调整 JVM 堆参数,现在终于可以运行 Java 应用程序了。
现在的问题是,每次我启动 SQLDeveloper 时,我的 Eclipse JVM 都会给我:“无法为卡标记阵列保留足够的空间”。
如果我理解正确的话,这与 JVM 内存块分配有关。
我必须遵守什么规则来防止这种情况发生?
机器信息:
Ubuntu 14.04 LTS;64 位;CPU Intel Core2 Duo;8GB 内存
Eclipse:java-7-oracle;-d64;-XX:MaxPermSize=256M;-Xms512m-Xmx512m;
Eclipse 运行/调试:java-6-openjdk-amd64;-Xms1024m;-Xmx1024m;-XX:+UseSerialGC;
SQL开发器:java-7-oracle;-XX:MaxPermSize=256M;
答案1
JVM 正在尝试分配一块连续的内存。由于系统上有足够的内存,因此内存必须是碎片化的。
为了解决这个问题,我将初始堆大小设置得很低(默认 128 不起作用),并允许 JVM 处理它。
我将 JVM 执行参数从:
java-6-openjdk-amd64; -Xms1024m; -Xmx1024m;
到:
java-6-openjdk-amd64; -Xms64m; -Xmx1024m;
更新:
我还将 overcommit_ratio 从 100(默认值)降低到了 50。
$ cat /proc/sys/vm/overcommit_ratio
我知道建议将其保留为 100,但是自从我进行了更改后,当我并行运行 Chromium/Eclipse/SQLDeveloper 时,就不会出现 jvm 错误。