在我的多核机器上,Eclipse使用100到250%的CPU功率,即使在新的普通安装和空工作空间闲置时也是如此.当实际做事时,它变得缓慢而无反应.
我已经尝试按照此处的建议设置内存设置:Eclipse随机使用100%CPU.这没有用.我还尝试了不同的Java版本,即OpenJDK和Oracle Java 7,以及Eclipse版本的Juno和Indigo.我在Ubuntu 12.04 LTS上.
作为另一个可能不相关的问题,当我关闭Eclipse时,Java进程仍然保持开放状态,CPU使用率超过200%,需要手动终止.
小智 20
我今天遇到了同样的问题,结果是一个占用CPU的索引线程.我最近在项目中添加了相当多的文件而忘记了它.我意识到其他人不太可能有这个问题,但发布我的调查方式可能会有用.
我正在使用基于eclipse Juno的STS运行Ubuntu 12.10.
让它稍微解决一下,然后得到每个线程的cpu使用情况列表:ps -mo'pid lwp stime time pcpu'-java.这是一个输出的示例,它标识了我的cpu饥饿线程:
PID LWP STIME TIME%CPU
6974 - 07:42 00:15:51 133
7067 07:42 00:09:49 86.1
将线程id(在我的情况下为7067)转换为十六进制0x1b9b(例如在命令行中使用:printf"0x%x \n"7067)
使用kill -3:kill -3 6974执行java进程的线程转储.当你启动eclipse时,输出保存在你重定向stdout的文件中
打开文件并查找线程的十六进制ID:
"Link Indexer Delayed Write-10"prio = 10 tid = 0x00007f66b801a800 nid = 0x1b9b runnable [0x00007f66a9e46000]
java.lang.Thread.State:RUNNABLE
在com.ibm.etools.references.internal.bplustree.db.ExtentManager $ WriteBack.r
Ban*_*zen 11
我只是在垃圾收集器疯狂时才看到这种行为,因为分配的内存确实达到了VM配置的最大内存限制.如果你有一个大的Eclipse安装,你的第一步应该始终是增加eclipse.ini中的内存设置.
还请激活窗口 - >首选项 - >常规 - >显示堆状态.它将向您显示Eclipse当前使用的内存量(在状态行中).如果它达到允许的最大值并且不再下降(即垃圾收集器无法清除未使用的对象),那么这正是我上面描述的指示.
编辑:了解您使用的Eclipse包也很好,因为默认情况下包含不同的插件.经典,建模,Java EE开发人员,......?
Gar*_*all 10
我有插件这个问题,但从来没有使用Eclipse本身.
您可以尝试通过逐个访问Help > About Eclipse > Installation details和禁用插件来调试它.
卸载mylyn插件为我解决了这个问题,性能提升非常明显,以至于我将其发布为一个6岁问题的答案。
去Help->About Eclipse->Installation Details->Installed Software
和卸载所有插件,你知道你不使用。我只卸载了mylyn插件,这为我带来了奇迹。
编辑:
在Eclipse版本:2018-09(4.9.0)中,可以通过关闭Package&Project Explorer来解决Eclipse冻结/无响应的问题。
我知道这听起来像是一个愚蠢的解决方案,但是我已经在大约5台对等计算机上对此进行了多次测试,并且当我说这个简单的解决方案消除了它们各自的冻结问题时,请相信我。只要没有重新打开包/项目浏览器,他们都没有抱怨月食无响应。
在 Linux Ubuntu 18.04 上的 Eclipse IDE for C/C++ Developers 版本:2022-09 (4.25.0) 中进行了测试。
\n解决方案:减少 Eclipse 可以使用的最大线程数,减少到计算机的 1/2。因此,如果您的计算机有 8 个物理“核心”(实际上:超线程),则将 Eclipse 可以使用的最大线程数减少到 4,或<=系统核心数的一半,如下所示:
\n在$HOME/eclipse/cpp-2022-09/eclipse/eclipse.iniLinux Ubuntu 或您的操作系统的同等版本上,进行此更改(在我的例子中,从最多 10 个线程减少到 4 个):
更改自:
\n-Declipse.p2.max.threads=10\nRun Code Online (Sandbox Code Playgroud)\n到:
\n-Declipse.p2.max.threads=4\nRun Code Online (Sandbox Code Playgroud)\n重新启动 Eclipse。
\n现在,Eclipse 最多只能占用我 8 个超线程中的 4 个,而且我的系统运行得好多了!
\n如果在 Linux 上,您还应该减少“swappiness”设置以提高系统性能。见下文。
\n当我进行此更改后,我注意到当 Eclipse 为项目建立索引时,我使用计算机的能力有了巨大的提高。以前,Eclipse 常常使我的计算机一次几小时或几天几乎完全无法使用,因为它索引了我巨大的存储库(许多 GiB)。
\n如果需要,您还应该为 Eclipse 提供更多 RAM。在上面提到的同一eclipse.ini文件中,该-Xms设置设置为 Eclipse 的 Java 运行时环境提供的起始 RAM-Xmx ,并且该设置设置为其提供的最大 RAM 。对于大型项目的索引,请确保它具有足够大的最大 RAM 来成功索引项目。如果我没记错的话,默认值是:
-Xms256m\n-Xmx2048m\nRun Code Online (Sandbox Code Playgroud)\n...这意味着:给予 Eclipse Java 运行时环境的起始 RAM 为 256 MiB,如果需要,允许增长到的最大 RAM 为 2048 MiB。
\n我有 32 GiB 的 RAM 和 64 GiB 的交换空间,如果我给 Eclipse < 12 GiB 的最大 RAM,我的索引器就会停止运行,因此我按如下方式设置设置以使用 1 GiB (1024 MiB) 的 RAM 启动 Eclipse,并且允许高达 12 GiB (12288 MiB) 的 RAM:
\n-Xms1024m\n-Xmx12288m\nRun Code Online (Sandbox Code Playgroud)\n所以,我的总变化来自:
\n-Declipse.p2.max.threads=10\n-Xms256m\n-Xmx2048m\nRun Code Online (Sandbox Code Playgroud)\n...到:
\n-Declipse.p2.max.threads=4\n-Xms1024m\n-Xmx12288m\nRun Code Online (Sandbox Code Playgroud)\n这是我的最终/home/gabriel/eclipse/cpp-2022-09/eclipse/eclipse.ini文件,其中进行了适当的更改:
-startup\nplugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar\n--launcher.library\n/home/gabriel/.p2/pool/plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.2.600.v20220720-1916\n-product\norg.eclipse.epp.package.cpp.product\n-showsplash\n/home/gabriel/.p2/pool/plugins/org.eclipse.epp.package.common_4.25.0.20220908-1200\n--launcher.defaultAction\nopenFile\n--launcher.appendVmargs\n-vm\n/home/gabriel/.p2/pool/plugins/org.eclipse.justj.openjdk.hotspot.jre.full.linux.x86_64_19.0.1.v20221102-1007/jre/bin\n-vmargs\n--add-opens=java.base/java.io=ALL-UNNAMED\n--add-opens=java.base/sun.nio.ch=ALL-UNNAMED\n--add-opens=java.base/java.net=ALL-UNNAMED\n--add-opens=java.base/sun.security.ssl=ALL-UNNAMED\n-Dosgi.requiredJavaVersion=17\n-Dosgi.instance.area.default=@user.home/eclipse-workspace\n-Dsun.java.command=Eclipse\n-XX:+UseG1GC\n-XX:+UseStringDeduplication\n--add-modules=ALL-SYSTEM\n-Dosgi.requiredJavaVersion=11\n-Dosgi.dataAreaRequiresExplicitInit=true\n-Dorg.eclipse.swt.graphics.Resource.reportNonDisposed=true\n-Xms1024m\n-Xmx12288m\n--add-modules=ALL-SYSTEM\n-Declipse.p2.max.threads=4\n-Doomph.update.url=https://download.eclipse.org/oomph/updates/milestone/latest\n-Doomph.redirection.index.redirection=index:/->http://git.eclipse.org/c/oomph/org.eclipse.oomph.git/plain/setups/\n--add-opens=java.base/java.lang=ALL-UNNAMED\n-Djava.security.manager=allow\nRun Code Online (Sandbox Code Playgroud)\n在 Linux Ubuntu 上,只需打开“系统监视器”应用程序即可。数一下核心数。你可以在这里看到我有 8 个:
\n\n一个好的起点是给 Eclipse一半的核心,以防止它在索引和刷新大型项目时始终使您的系统陷入困境。-Declipse.p2.max.threads=4所以,我有 8 个核心(超线程),所以我应该通过在 .ini 文件中设置来为 Eclipse 提供 4 个核心。
这听起来可能有悖常理,但是您的项目越大,计算机越弱,您应该为 Eclipse 提供的线程越少!这是因为你的项目越大,你的计算机越弱,你的计算机在使用 Chrome 网络浏览器等东西时就越会陷入困境。因此,为了防止 Eclipse 耗尽您的所有资源并冻结您的计算机,请限制它可以拥有的线程数量。如果我发现 Eclipse 再次使我的计算机陷入困境,我会将其线程减少到最多 2 或 3 个,而不是 4 个。我之前给了它 8 个线程中的 7 个,这太可怕了!我的电脑运行速度非常慢,我永远无法正确使用 Chrome 或 Slack 之类的东西!
\n-Xmx我应该给 Eclipse多少最大 RAM ( )?-Xmx2048m适合大多数用户。它可以处理您将遇到的大多数正常项目。-Xmx512m(512 MiB,或 0.5 GiB)左右就可以索引整个 Arduino AVR(8 位 MCU)源代码了-Xmx12288m(12288 MiB 或 12 GiB)。-Xmx32768m到-Xmx65536m) 来索引整个 C++ Boost 库,这简直太疯狂了。因此,在大多数情况下,请从索引器中排除 Boost 库。我在下面链接的 Google 文档中提到了这一点。经验法则是,-Xmx每当您看到索引器陷入困境或停滞不前,并且 Eclipse 对可用 RAM 的使用不断达到最大时,请稍微增加您的设置。下面是 Eclipse 窗口底部的屏幕截图,显示 Eclipse 当前正在使用当前在堆上分配的可用12288 MiB中的8456 MiB :
如果它经常快速增加到最大值并经常停留在那里,我需要-Xmx进一步增加我的设置,让 Eclipse 进一步增加堆。
要打开在 Eclipse 窗口底部显示堆状态(如果默认情况下已打开\xe2\x80\x99t):\nWindow \xe2\x86\x92 Preferences \xe2\x86\x92 General \xe2\x86 \x92 选中“显示堆状态”框 \xe2\x86\x92 单击“应用并关闭”。
\n注意:当 Eclipse 首次启动时,内存使用指示器将显示上述堆使用情况中的右侧数字,该数字等于您的起始堆分配(由该-Xms数字定义)。当 Eclipse 需要更多内存时,它将分配更多内存,将正确的数字增加到-Xmx您定义的值。同样,如果您的索引器由于 RAM 不足而停止或冻结,请增加该-Xmx数字以允许 Eclipse 的索引器使用更多堆内存 (RAM)。
Eclipse 的文章常见问题解答如何增加 Eclipse 可用的堆大小?,指出(强调):
\n\n\n一些 JVM 对堆上可用的内存总量进行了限制。如果您在运行 Eclipse 时收到s,则可以通过将命令传递给 Eclipse 启动器
\nOutOfMemoryError来告诉 VM 让堆增长到更大的数量。-vmargs例如,以下命令将以 2048MB 的堆大小运行 Eclipse:Run Code Online (Sandbox Code Playgroud)\n-startup\nplugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar\n--launcher.library\n/home/gabriel/.p2/pool/plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.2.600.v20220720-1916\n-product\norg.eclipse.epp.package.cpp.product\n-showsplash\n/home/gabriel/.p2/pool/plugins/org.eclipse.epp.package.common_4.25.0.20220908-1200\n--launcher.defaultAction\nopenFile\n--launcher.appendVmargs\n-vm\n/home/gabriel/.p2/pool/plugins/org.eclipse.justj.openjdk.hotspot.jre.full.linux.x86_64_19.0.1.v20221102-1007/jre/bin\n-vmargs\n--add-opens=java.base/java.io=ALL-UNNAMED\n--add-opens=java.base/sun.nio.ch=ALL-UNNAMED\n--add-opens=java.base/java.net=ALL-UNNAMED\n--add-opens=java.base/sun.security.ssl=ALL-UNNAMED\n-Dosgi.requiredJavaVersion=17\n-Dosgi.instance.area.default=@user.home/eclipse-workspace\n-Dsun.java.command=Eclipse\n-XX:+UseG1GC\n-XX:+UseStringDeduplication\n--add-modules=ALL-SYSTEM\n-Dosgi.requiredJavaVersion=11\n-Dosgi.dataAreaRequiresExplicitInit=true\n-Dorg.eclipse.swt.graphics.Resource.reportNonDisposed=true\n-Xms1024m\n-Xmx12288m\n--add-modules=ALL-SYSTEM\n-Declipse.p2.max.threads=4\n-Doomph.update.url=https://download.eclipse.org/oomph/updates/milestone/latest\n-Doomph.redirection.index.redirection=index:/->http://git.eclipse.org/c/oomph/org.eclipse.oomph.git/plain/setups/\n--add-opens=java.base/java.lang=ALL-UNNAMED\n-Djava.security.manager=allow\n之后的参数
\n-vmargs直接传递给VM。运行java -X以获取您的虚拟机接受的选项列表。以 开头的选项-X是特定于实现的,可能不适用于所有 VM。您还可以将额外的选项放入
\neclipse.ini.
因此,正如它所说,运行这个:
\neclipse [normal arguments] -vmargs -Xmx2048m [more VM args]\nRun Code Online (Sandbox Code Playgroud)\n...获取可以传递给底层 Java 虚拟机 (JVM) 的所有可能参数的列表。-Xms以下是和的输出的描述-Xmx:
\n\nRun Code Online (Sandbox Code Playgroud)\n-Xms<size> set initial Java heap size\n-Xmx<size> set maximum Java heap size\n
如果在 Linux 上,您还应该将“swappiness”设置从默认值 60 减少到 0 到 10 的范围(我更喜欢 0),以提高系统性能,并在超过 75 时减少滞后和冻结内存使用率百分比。
\n“交换性”描述了系统将 RAM 的内容移动到硬盘驱动器 (HDD) 或固态驱动器 (SSD) 上的“交换空间”或虚拟内存的可能性。Swappiness 设置值的范围从 0 到 200(请参阅我在此处引用 Linux 内核源代码的答案),其中 0 表示它会在必要时尝试不使用您的交换空间,而 200 表示它会优先使用您的交换空间。
\n虚拟内存或交换空间的好处是,它实际上可以免费扩展计算机的“类似 RAM”内存,使您可以运行程序或执行繁重的任务,例如编译大型应用程序。即使您只有 8 GiB RAM,如此繁重的进程也可能需要 64 GiB RAM。通常情况下,你的计算机会崩溃并且无法做到这一点,但是有了交换空间,它就可以做到这一点,因为它将你的交换文件或分区视为额外的 RAM。这真是太神奇了。然而,交换内存的缺点是它比 RAM 慢得多,即使它在高速 m.2 SSD 上运行也是如此。
\n因此,要限制交换并提高性能,只需将 swappiness 减少到 0。请按照此处的说明进行操作:如何配置 swappiness?。
\n我提到并描述了如何将系统的交换性从 60 降低到 0,从而真正提高了我的性能并减少了这两个地方的周期性冻结:
\n作为替代方案,如果您有 >= 64 GB 的 RAM(因为这个数量足够大,我可以合理地考虑这样做),您可以考虑完全禁用所有交换空间,而只在 RAM 上运行。在我拥有那么多内存的大型机器上,这就是我所做的。
\n| 归档时间: |
|
| 查看次数: |
51742 次 |
| 最近记录: |