intellij jvm options explained
Intellij在Java虚拟机(VM)上运行。 VM有许多选项/标志,可用于调整其性能,从而扩展是Intellij的性能。本指南可以帮助您从Jetbrains IDE中获得更多性能,或者由于VMS默认配置而帮助您解决发生的问题。我从一个人对所有这些选项的含义感到好奇,但不知道他们做什么的角度写了本指南。
tl; dr
不在乎小小的坚韧不拔吗?只想复制并粘贴很多选择?别再看!
这应该是最低的公共分母集,以帮助提高Intellij的性能。
用值替换括号:
-Xmx[memoryValue]
变成
-Xmx512m
-server
-ea
-Xmx[memoryValue, If total memory < 2GB then at least 1/4 total memory. If > 2GB then 1-4 GB. (See note below)]
-Xms[memoryValue, at least 1/2 Xmx. Can be = to Xmx]
-XX:+UseG1GC
-XX:ReservedCodeCacheSize=[between 128m and 256m, depending on how much free physical memory you have available]
-XX:+OmitStackTraceInFastThrow
-Dsun.io.useCanonCaches=false
-XX:SoftRefLRUPolicyMSPerMB=50
注意:要调整-XMX for您的项目,请注意内存指示器。
- 如果您有自由内存增加-XMX ,直到内存指示器使用<85%。
- 如果您受到内存的约束,无法达到目标-XMX至少应为1/2至3/4的物理内存。
如何编辑VM选项
为Jetbrains IDE编辑这些选项的最简单方法是使用本文中描述的方法:
最新产品版本中更改JVM选项的推荐方法来自帮助|编辑自定义VM选项菜单。此操作将在IDE配置目录中创建.vMoptions文件的副本,并打开一个可以更改它们的编辑器。
如果该方法是不可行的,则文章将列出编辑这些文件的手动方法。仔细阅读!
VM选项,解释了!
堆在VM上
Intellij在Java虚拟机(VM)上运行。堆是分配给Java虚拟机的内存(在RAM中)。因此,堆大小是Intellij可以使用的总内存量。
–xmx [memoryVal] – 指定VM堆的最大内存分配。这是可使用的最大内存量。
- 如果您经常从Intellij收到
OutOfMemoryError错误,则应增加此值。 - 增加此值还应加快进程,例如大型文件的检查时间,因为Intellij将不得不进行更少的内存交换才能保持在限制内(?)(?)
-xms [memoryVal] – 指定VM堆的初始内存分配。这将是内存Intellij开始的数量。
- 增加此值应该使Intellij启动更快,因为它最初将具有较大的池,因此不必等待在旋转时分配更多内存。
垃圾收集
垃圾收集器(GC)是VM中的一个程序,可删除未使用的对象/资源并释放堆上的空间。
从垃圾收集者的角度来看,堆内有两个主要部分,称为世代:
- 年轻一代 – 新一代创建新物体。
- 旧一代 – “现场”的物体在几个GC(垃圾收集)中幸存下来,转移到了旧一代,以及对于年轻一代来说太大的任何物体。
垃圾收集都是在两代人中都完成的,但每个都有不同的后果。
- 年轻一代的GC是“小”。大多数物体在年轻一代中“死亡”,再也不会被使用。因此,在对VM的影响方面,这一代人的收集被认为是较小的。
- 旧一代的GC被认为是“完整的GC”,并且对VM的影响更大,因为它在整个堆中收集。 GC仅在堆上没有足够的内存来分配新对象时才发生。
控制年轻一代的大小是一个重要的调整工具:
如果年轻一代太小,那么短暂的物体将很快移至旧一代,在那里他们很难收集。相反,如果年轻一代太大,我们将有很多不必要的复制对长寿命的对象,无论如何,这些物体将无论如何都会转移到老一代。
因此,选择合适的尺寸取决于您使用Intellij的方式。如果您不断打开新的文件并在项目周围跳跃,则可能需要更大的年轻一代,以免对象很快将其转移到旧一代。如果您的使用中大部分是静态的(呆在项目的一个区域或从事小型范围的工作),那么较小的年轻一代对您来说可能会更好,因为您不会经常将新物体推入堆中。
管理年轻一代有两种方法:
-xx:newratio = [比率] – 指定与旧一代大小相关的年轻一代大小。
- 这种方法的潜在优势在于,当JVM在运行时动态调整总堆大小时,年轻一代将自动增长和收缩。
- 如果您与之合作的项目在内存使用方面差异很大,请使用此功能。
- 我建议以2到4之间的比率。这意味着年轻一代将是旧一代的1/3或1/4。
-xmn [memoryVal] – 指定分配给年轻一代的内存。
- 此标志等于-xx:newsize和-xx:maxNewSize,为两者设置相同的值。
- 与newratio相比,唯一的优势是它可以对年轻一代大小进行更颗粒状的控制。
GC算法
(IMO)可以使用两种主要的GC方法。
注意:如果您的堆大于4GB,建议使用G1
CMS
- -xx:+useconcmarkSweepGC
此选项使用mutliple线程尝试在后台进行GC,以避免应用程序停止。如果您在大量使用过程中遇到Intellij变得生涩/无反应,则可能会减轻这些问题。
G1
- -XX:+USEG1GC
在JDK 7 Update 4 G1中引入的内容类似于CMS,但构建以支持大量堆(4GB和更大)。它将几代人分为较小的地区,并保持产生更多垃圾的区域的轨道。这应该防止大量大量发生的大型“阻止世界” GC事件。
其他GC标志
-xx:ParallelGCThreads = [value] – 指定用于并行GC(PARNEWGC)的GC线程数
- 如果未明确设置此标志,JVM将使用基于可用(虚拟)处理器数量计算的默认值。这是您通常想要做的(不设置)。
- 如果您运行多个JVM并且要减少资源使用情况,则有用。
-xx:survivorratio = [比率] – 指定年轻一代中幸存者世代的大小。
- 幸存者一代人在年轻一代的GC之后,仍将所有仍然“活”的物体“生存”,但尚未传递给旧一代。
- 通常不是性能的重要因素。
- 我看到的大多数值在8到6之间。
-xx:softreflrupolicymsspermb = [value] – 指定堆中每个自由MB的毫秒数,应该保持软引用。
- 默认值为1000 。 Jetbrains建议将此值设置为50 。
- 老实说,我不知道这有什么帮助。我的猜测是,Intellij中的许多对象都属于“使用一次”用例,因此减少此值意味着它们的清理速度更快。
其他一切
-xss = [memoryValue] – 指定分配给新堆栈的内存
- VM中创建的每个线程都有自己的堆栈空间。这是用于存储本地变量和参考的空间。
- 通常不需要修改。但是,较小的堆栈尺寸将使用更少的内存。
-xx:permsize = [memoryValue]和-xx:maxpermsize = [memoryValue]
- 这些是指VM用于应用程序外的数据的内存,仅用于VM 。
- 通常不需要调整,但是如果您看到
Java.lang.OutOfMemoryError: PermGen space事件经常可以增加此值。推荐512m ,并从它们增加直到错误消失。
– 服务器– 简而言之,它告诉JVM在优化最常使用的代码片段(热点)上的优化。它以启动时较高的开销价格提供了更好的性能。
-xx:保留codecachesize = [memoryValue] – 用于存储用于编译方法的本机代码。
- Jetbrains为此值推荐240m 。
-XX:+OmitstackTraceinFastthrow-这是Jetbrain推荐的标志。可以在此处找到该标志所做的内容的描述。
- 本质上,Intellij可能会检查VM中抛出的某些内置异常 – 或者可能会通过行为不良的插件抛出 – 并生成堆栈痕迹以使异常需要大量开销。使用此选项可防止堆栈跟踪为这些例外产生,因此可能会在例外情况无关紧要时降低由用于此目的的资源引起的抖动。
- 与使用此选项相关联的间接费用无关紧要,因此建议使用它,除非您要调试Intellij本身或行为不良的插件。
-xx:+heapDumponOutofMemoryError-当发生OutOfMemoryError误差时会导致堆的转储(如下所述)。
- 没有用于使用此选项的开销,因此默认情况下可以使用它,但是除非您经常遇到
OutOfMemoryError错误,否则不需要使用。
-XX:MaxJavastAckTraceDepth = [Integer] – 指定在抛出StackOverflowError之前,可以有多少个堆栈跟踪的条目。
- JVM在投掷
StackOverflowError之前的默认条目为1024个条目。 - 如果您要处理巨大的堆栈跟踪,则可以使用此选项在溢出之前增加允许的进入者。
-ea-此选项启用断言。
- 如果您要调试Intellij或插件,则需要使用此选项,以使任何断言throw
AssertionError。如果您不使用断言(或在Java中编码),则没有此选项的性能开销。
-dsun.io.io.usecanoncaches = [boolean] – 指定规范文件路径是否被缓存。
- 默认情况下,Java Caches文件名30秒。
- JetBrains建议将此选项的值设置为false 。我猜这是因为Intellij经常处理文件路径/名称,并且频繁的更改可能会在这些属性更改并且文件名仍然缓存时会导致性能。
-xx:+AggressiveOpts-打开一些预期在即将发布的版本中默认情况下的同性构优化。
- 这些是较小的更改,不会影响您的其余配置。这不是必要的标志,但可能会看到一些性能的改进。
- 请记住,更改此标志为每个Java版本打开更改,因此请确保/if Intellij更改Intellij打包的Java版本时,请确保重新评估。
-djava.net.preferipv4stack = [boolean] – 指定Intellij是否应该使用IPv4连接。
- 如果您在Java下运行Intellij时遇到连接问题,则建议将此标志设置为true 。
- 另外,如果您的环境仅接受IPv6连接,请使用flag
-Djava.net.preferIPv6Addresses=true
贡献
请随时添加/修改任何选项。我自己还在学习这些东西
