├── Contributing ├── LICENSE └── README.md ├── Java Arguments ├── Benchmarks │ └── README.md ├── LICENSE ├── README.md └── Sources_Credits.md ├── LICENSE ├── Large Page files ├── LICENSE └── README.md ├── Launchers ├── LICENSE └── README.md ├── Mods ├── LICENSE └── README.md ├── RAM ├── LICENSE └── README.md ├── README.md ├── Spark & Observable ├── LICENSE └── README.md └── assets ├── Minecraft Performance Guide - Banner.png └── Minecraft Performance Guide - Logo.png /Contributing/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 DataDalton 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Contributing/README.md: -------------------------------------------------------------------------------- 1 | ![Minecraft Performance Guide Banner][Banner] 2 | 3 | ###### This is the Contributions guide for the Github 4 | 5 |
6 | 7 | Contributing 8 | ====== 9 | 10 | TODO 11 | 12 |
13 | 14 | [Logo]: ../assets/Minecraft%20Performance%20Guide%20-%20Logo.png 15 | [Banner]: ../assets/Minecraft%20Performance%20Guide%20-%20Banner.png -------------------------------------------------------------------------------- /Java Arguments/Benchmarks/README.md: -------------------------------------------------------------------------------- 1 | ![Minecraft Performance Guide Banner][Banner] 2 | 3 | ###### This is a part of the detailed Minecraft Java Arguments guide which is a part of the overarching Minecraft Performance Guide 4 | 5 |
6 | 7 | Benchmark Information 8 | ====== 9 | 10 | New benchmarking is in-progress 11 | 12 |
13 | 14 | [Logo]: ../../assets/Minecraft%20Performance%20Guide%20-%20Logo.png 15 | [Banner]: ../../assets/Minecraft%20Performance%20Guide%20-%20Banner.png -------------------------------------------------------------------------------- /Java Arguments/LICENSE: -------------------------------------------------------------------------------- 1 | New 2 | ---------------------------------------------------------------------------------- 3 | MIT License 4 | 5 | Copyright (c) 2023 DataDalton 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so, subject to the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be included in all 15 | copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 | SOFTWARE. 24 | ---------------------------------------------------------------------------------- 25 | 26 | 27 | Original 28 | ---------------------------------------------------------------------------------- 29 | MIT License 30 | 31 | Copyright (c) 2022 brucethemoose 32 | 33 | Permission is hereby granted, free of charge, to any person obtaining a copy 34 | of this software and associated documentation files (the "Software"), to deal 35 | in the Software without restriction, including without limitation the rights 36 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 37 | copies of the Software, and to permit persons to whom the Software is 38 | furnished to do so, subject to the following conditions: 39 | 40 | The above copyright notice and this permission notice shall be included in all 41 | copies or substantial portions of the Software. 42 | 43 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 44 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 45 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 46 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 47 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 48 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 49 | SOFTWARE. 50 | ---------------------------------------------------------------------------------- 51 | -------------------------------------------------------------------------------- /Java Arguments/README.md: -------------------------------------------------------------------------------- 1 | ![Minecraft Performance Guide Banner][Banner] 2 | 3 | ###### This is the detailed Minecraft Java Arguments guide and is a part of the overarching Minecraft Performance Guide 4 | 5 |
6 | 7 | Minecraft Java Arguments 8 | ====== 9 | 10 | This repository serves the purpose of having an updated list of Java Arguments for Minecraft. Testing has been conducted for both Modded Minecraft and Vanilla Minecraft. 11 | 12 | This guide will be a more in-depth version of the general guide in the Minecraft Performance Guide. 13 | 14 | This guide contains information about different types of Java Runtime Environments's (JREs) and the Java Virtual Machine (JVM) arguments for each of them. 15 | 16 |
17 | 18 | Disclaimer 19 | ====== 20 | 21 | It is possible depending on the system for these arguments to only minimally provide Ticks Per Second (TPS) and Frames Per Second (FPS) gains. 22 | 23 | The purpose of these tweaks are to reduce stutters on the client as a result of garbage collection and other JVM issues which can be fixed through JVM arguments, however, significant server stutters will also be reduced as a result of these arguments if they are in-use on the server. 24 | 25 | It is also possible as a result of the usage of these arguments to increase Random Access Memory (RAM) and Central Processing Unit (CPU) usage, which is not necessarily a negative aspect. 26 | 27 |
28 | 29 | Second Disclaimer: 30 | 31 | This guide mentions NeoForge, NeoForge is intended to fully replace Forge. The full development team of Forge, minus 1 person forked Forge and created NeoForge. For future developmental purposes, NeoForge will be the new modloader. 32 | 33 |
34 | 35 | Mod lag 36 | ====== 37 | 38 | Since the purpose of this is not to necessarily fix TPS or FPS issues caused by mods I would recommend looking at these two mods in order to help diagnose your lag issues: 39 | 40 | [Spark - Curseforge](https://www.curseforge.com/minecraft/mc-mods/spark) >=1.12.2 41 | 42 | [Spark - Modrinth](https://modrinth.com/mod/spark?hl=en-US) >=1.12.2 43 | 44 | or 45 | 46 | (Observable is an updated version of LagGoggles) 47 | 48 | [Observable - Curseforge](https://www.curseforge.com/minecraft/mc-mods/observable) >=1.16.5 49 | 50 | [Observable - Modrinth](https://modrinth.com/mod/observable) >=1.16.5 51 | 52 | or 53 | 54 | [LagGoggles - Curseforge](https://www.curseforge.com/minecraft/mc-mods/laggoggles) 1.10.2, 1.12.2 55 | 56 |
57 | 58 | ### World Pregen 59 | 60 | I also highly recommend pregenerating your world as this will greatly help with memory usage. 61 | 62 | [Chunk-Pregenerator - Curseforge](https://www.curseforge.com/minecraft/mc-mods/chunkpregenerator) >=1.4.6 63 | 64 | or 65 | 66 | [Chunky - Curseforge](https://www.curseforge.com/minecraft/mc-mods/chunky-pregenerator-forge) >=1.16.5 67 | 68 | [Chunky - Modrinth](https://modrinth.com/plugin/chunky) >=1.16.5 69 | 70 |
71 | 72 | ***Note: All mods above have Forge/Fabric versions, most have versions for NeoForge now*** 73 | 74 |
75 | 76 | Minecraft Version and Java Version 77 | ====== 78 | 79 | | **Minecraft Version** | **Java Version** | 80 | |---|---| 81 | | >= 1.20.5 |21| 82 | | >= 1.19.2 | 17, 19, 21. Depending on the modpack it may be beneficial to use Java 17 over Java 19 or 21. Java 21 has significant improvements over 20 is why 20 is not recommended and should be able to be dropped in place in any instance Java 20 can be used. | 83 | | > 1.16.5 | 17 | 84 | | = 1.16.5 | It is recommended to use Java 17 for Minecraft 1.16.5, however, in certain cases this may break some things, if you notice it is unplayable I recommend switching to Java 8. Although, some people may recommend going with Java 11/15/16 which should work with 1.16.5 it should have a better performance boost defaulting to Java 8. | 85 | | < 1.16.5 | 8. In some instances you may be able to use Java 17 such as GTNH. | 86 | | < 1.7.10 | You may need to use Java 7, for example 1.6.4 | 87 | 88 | > Depending on your launcher you may be asked to use a different Java version. Curseforge and Prism will ask you to use Java 8 when you are on Minecraft 1.16.X, however, most 1.16.5 mods are compatible with Java 17. 89 | 90 |
91 | 92 | Java Runtime Differences 93 | ====== 94 | 95 | There are many different Java Runtime's and people who own these Runtimes. There are quite a few which are almost identical, as a result of this quite a few different ones have been skipped as they do not provide any substantial differences between them which would result in a meaningful difference. 96 | 97 | The most popular companies/people behind the different Runtimes are: Adoptium, Amazon, Azul, IBM, Intel, Microsoft, Oracle, and Red Hat. 98 | 99 | The most notable differences between these different Java Runtimes are as follows: 100 | 101 | 102 | - **Oracle GraalVM** - Comes with a more aggressive Java compiler and ZGC - This is currently the most recommended JVE for performance 103 | 104 | - **Intel's Clear Linux OpenJDK** - Uses the same code as many other OpenJDKs which makes it highly compatible, making it highly compatible. The build process itself and the dependencies are [optimized for newer CPUs](https://www.phoronix.com/review/zen4-clear-linux/2). You can get it from Clear Linux's repositories via `swupd`, from [Distrobox](https://github.com/89luca89/distrobox), or from [Docker](https://hub.docker.com/r/clearlinux/openjdk). It is important to note that in order to use this you must currently use the Java 17 release, and that Java 18 [reverts some of the performance enhancements](https://github.com/clearlinux-pkgs/openjdk/commit/14202e83f919643031cfb7a6318b067310be90f1). 105 | 106 | - **Azul's Prime OpenJDK** - *Very* fast since it hooks into [LLVM](https://llvm.org/), but its currently incompatible with most mods and is linux-only. You can get it from [Azul Prime's docs](https://docs.azul.com/prime/prime-quick-start-tar) 107 | 108 | - **Red Hat Java 8** - Has the Shenandoah garbage collector. It's gated behind a free email signup at [Redhat](https://developers.redhat.com/products/openjdk/download) 109 | 110 | - **IBM's OpenJ9** - *Substantially* slower in Minecraft, and uses totally different flags than any other Java build, but it does consume less memory than OpenJDK-based runtimes. See [Frequently Asked Questions](#frequently-asked-questions), and [this Gist for low memory consumption flags](https://gist.github.com/FluffyFoxUwU/69f8f156feefae3d826ad0d15c694002). 111 | 112 |
113 | 114 | 115 | If you dont know what to pick, I recommend GraalVM for the newest version of Minecraft using Java 17, or GraalVM EE using Java 8 (see below) or the latest [Adoptium Java 17 JRE](https://adoptium.net/) 116 | 117 | Couleur maintains a good running list of [JREs](https://rentry.co/JREs) (Note: This may be a little outdated now) 118 | 119 |
120 | 121 | Launchers 122 | ====== 123 | It is important to note that the launcher you use may influence the behavior of how you input your java arguments/flags. 124 | 125 | > It is recommended to not use Curseforge's Modded Minecraft launcher, if you choose to do so, know you need to set your Java `/bin/javaw.exe` path at every startup of Minecraft, not Curseforge. The option for changing the Java version in Curseforge is for installing the Forge modloader and not the actual Java version Minecraft will run with (yes, Curseforge made it sound confusing). 126 | 127 | [Prism Launcher](https://prismlauncher.org/wiki/help-pages/java-settings/) 128 | 129 | [Modrinth Launcher](https://modrinth.com/app) 130 | 131 | > I do not currently recommend Modrinth's launcher, however, I have included it anyways (they do not have a direct link on how to input your java arguments/flags) 132 | 133 | [ATLauncher](https://atlauncher.com/help/extra-arguments) 134 | 135 | Depending on your launcher, you may also have to edit the available copy-paste ready flags. Typically, the only thing you need to modify is removing the `-Xmx8G -Xms8G` at the start. This is because the launcher already has a way to set the memory allocation and you should use that instead. 136 | 137 |
138 | 139 | Memory Allocation 140 | ====== 141 | Minimum and maximum (`-Xms` and `-Xmx`) memory should be set to the same value, as [explained](https://dzone.com/articles/benefits-of-setting-initial-and-maximum-memory-siz) 142 | 143 | **One exception:** if you are on a low-memory system, and Minecraft takes up almost all your RAM, set your minimum memory below your maximum memory to conserve as much as possible. 144 | 145 | Sizes are set in megabytes (`-Xms4096M`) or gigabytes (`-Xmx8G`) 146 | 147 | Allocating too much memory can break garbage collection or just slow Minecraft down, even if you have plenty to spare. 148 | 149 | Allocating too little can also slow down or break the game. 150 | 151 | Keep a close eye on the Window's Task manager (or your DE's system monitor) as Minecraft is running, and allocate only as much as it needs (which is usually less than 8GB but can be more for larger modpacks! As a client I recommend <16GB in most situations). [`/sparkc gcmonitor`](https://spark.lucko.me/docs/Command-Usage#spark-gcmonitor) will tell you if your allocation is too high (the pauses will be too long) or too low (frequent garbage collection with a low memory warning in the notification). 152 | 153 | *You should also only ever allocate >=32GB of ram when you are on a server. Once you enable 32GB of memory you disable [compressed OOPs](https://www.baeldung.com/jvm-compressed-oops) which will impact performance. It is possible to enable OOPs when using >=32GB, however, it will still negatively impact performance* 154 | 155 | *Many people are still under the belief that you should only use 4-8GB of memory, this is not true and has not been true for a very long time. Most modded packs perform best when using 6-16GB of memory client-side. It is also possible, depending on the version and if there are mods, and how many mods, that you need less or even more than this 6-16GB range. I highly recommend testing this yourself and seeing what performs best as there is a large amount of variables to consider.* 156 | 157 | > Note: I highly recommend hosting both vanilla and modded on a server. Hosting on a server will reduce client stress and will increase overall performance. If you are looking for a free option, Oracle offers a permanent always free-tier (which should not be confused with the free trial) you can find a good guide how to setup an Oracle server with this [Youtube video](https://www.youtube.com/watch?v=RyC-m725uTs) 158 | 159 |
160 | 161 | Base Java (>8) Flags 162 | ====== 163 | 164 | These flags run with any Java 11+ Environment. They work on both servers and clients: 165 | 166 | (**You *must* add garbage collection flags to these java arguments. These arguments only act as a base to append further flags to.**) 167 | 168 | 169 | ```-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseVectorCmov -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:ThreadPriorityPolicy=1 -XX:AllocatePrefetchStyle=3``` 170 | 171 |
172 | 173 | Base Java 8 Flags 174 | ====== 175 | 176 | These flags run with any Java 8 Environment, they work on both servers and clients: 177 | 178 | These flags will work with OpenJDK8, along with Shenandoh GC, or G1GC: 179 | 180 | ```-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+ParallelRefProcEnabled -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:+PerfDisableSharedMem -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:MaxInlineLevel=15 -XX:MaxVectorSize=32 -XX:+UseCompressedOops -XX:ThreadPriorityPolicy=1 -XX:+UseNUMA -XX:+UseDynamicNumberOfGCThreads -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=350M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseFPUForSpilling -Dgraal.CompilerConfiguration=community``` 181 | 182 | x86 Java 8 users (aka most Java 8 users) can add these additional arguments: 183 | 184 | ```-XX:+UseXMMForArrayCopy``` 185 | 186 |
187 | 188 | Garbage Collection 189 | ====== 190 | 191 | **Garbage collection flags must be added to Minecraft servers and clients**, as the default pauses/stutters to stop and collect garbage manifest on the client and lag on servers. Use the `/sparkc gcmonitor` command with the [Spark](https://www.curseforge.com/minecraft/mc-mods/spark) mod to observe stutters in-game. *Any* old generation pauses are bad, and young generation G1GC collections should be infrequent, but short enough to be not noticeable. 192 | 193 | Pick one set of flags. ~~I recommend **Shenandoah on clients**, **ZGC on powerful Java 17 servers**, and **G1GC on Graal** or on servers/clients with less RAM and fewer cores:~~ 194 | 195 |
196 | 197 | ### ZGC 198 | 199 | ZGC is great for high memory and high core count servers. It has no server throughput hit which can be significantly measured, and does not stutter. However, it requires more RAM and more cores than most other garbage collectors. 200 | 201 | ZGC may cause a significant client FPS hit. See the "ZGC" benchmarks in the benchmarks folder. It's not available in Java 8, and much less performant in Java 11 than in Java 17. 202 | 203 | `-XX:+UseZGC -XX:AllocatePrefetchStyle=1 -XX:-ZProactive` enables it, but allocate more RAM and more `ConcGCThreads` than you normally would for other garbage collectors. 204 | 205 | > Note: ZGC does not like AllocatePrefetchStyle=3, hence setting it to 1 overrides the previous entry which has already been done in these flags for you. 206 | 207 |
208 | If we were to use Java >8 with only ZGC it would look like this 209 | 210 | ```-Xmx8G -Xms8G -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseVectorCmov -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:ThreadPriorityPolicy=1 -XX:AllocatePrefetchStyle=3 -XX:+UseZGC -XX:AllocatePrefetchStyle=1 -XX:-ZProactive``` 211 | 212 |
213 | 214 |
215 | 216 | ### Shenandoah 217 | 218 | Shenandoah performs well on clients, but may kill server throughput. 219 | 220 | Enable it with `-XX:+UseShenandoahGC -XX:ShenandoahGCMode=iu -XX:ShenandoahGuaranteedGCInterval=1000000 -XX:AllocatePrefetchStyle=1` 221 | 222 | See more tuning options [here](https://wiki.openjdk.org/display/shenandoah/Main). The "herustic" and "mode" options don't change much for me (except for "compact," which you should not use). Like ZGC, Shenandoah does not like AllocatePrefetchStyle=3. 223 | 224 | > Note: Shenandoah is not in Java 8. It's also not currently in any Oracle Java builds. If you are a Java 8 user, you must use Red Hat OpenJDK to use [Shenandoah](https://developers.redhat.com/products/openjdk/download) 225 | 226 |
227 | Download sources 228 | 229 | - Adoptium Temurin: https://adoptium.net/temurin/releases/?version=17&os=any 230 | 231 | - Oracle OpenJDK: https://wiki.openjdk.org/display/shenandoah/Main 232 | 233 |
234 | 235 |
236 | 237 |
238 | If we were to use Java >8 with only Shenandoah it would look like this 239 | 240 | ```-Xmx8G -Xms8G -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseVectorCmov -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:ThreadPriorityPolicy=1 -XX:AllocatePrefetchStyle=3 -XX:+UseShenandoahGC -XX:ShenandoahGCMode=iu -XX:ShenandoahGuaranteedGCInterval=1000000 -XX:AllocatePrefetchStyle=1``` 241 | 242 |
243 | 244 |
245 | 246 | ### Client G1GC 247 | 248 | G1GC is the default garbage collector for all JREs, (and was previously the only available garbage collector for GraalVM). ~~and is the only available garbage collector for [GraalVM users](https://github.com/oracle/graal/issues/2149).~~ 249 | 250 | Aikar's [famous Minecraft server G1GC arguments](https://aikar.co/2018/07/02/tuning-the-jvm-g1gc-garbage-collector-flags-for-minecraft/) run great on clients 251 | 252 | There are two caveats: they effectively [clamp](https://www.oracle.com/technical-resources/articles/java/g1gc.html) the `MaxGCPauseMillis` parameter by setting `G1NewSizePercent` so high, producing long stutters on some clients, and they collect oldgen garbage too aggressively (as the client produces *far* less than a populated server). 253 | 254 | These flags are similar to the aikar flags, but with shorter, more frequent pauses, less aggressive G1 mixed collection and more aggressive background collection: `-XX:+UseG1GC -XX:MaxGCPauseMillis=37 -XX:+PerfDisableSharedMem -XX:G1HeapRegionSize=16M -XX:G1NewSizePercent=23 -XX:G1ReservePercent=20 -XX:SurvivorRatio=32 -XX:G1MixedGCCountTarget=3 -XX:G1HeapWastePercent=20 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5.0 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150 -XX:GCTimeRatio=99` 255 | 256 | > Note: If you are using Java 20, it does not need the `-XX:G1ConcRefinementServiceIntervalMillis=150` flag and will only print a warning with the flag 257 | 258 | `G1NewSizePercent` and `MaxGCPauseMillis` can be used to tune the frequency and duration of your young generation collections. `G1HeapWastePercent=18` should be removed if you are getting any old generation pauses on your setup. Alternatively, you can raise it and set `G1MixedGCCountTarget` to 2 or 1 to make mixed garbage collection even lazier, but will cost higher memory usage. 259 | 260 |
261 | If we were to use Java >8 with only G1GC, client, it would look like this 262 | 263 | ```-Xmx8G -Xms8G -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseVectorCmov -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:ThreadPriorityPolicy=1 -XX:AllocatePrefetchStyle=3 -XX:+UseG1GC -XX:MaxGCPauseMillis=37 -XX:+PerfDisableSharedMem -XX:G1HeapRegionSize=16M -XX:G1NewSizePercent=23 -XX:G1ReservePercent=20 -XX:SurvivorRatio=32 -XX:G1MixedGCCountTarget=3 -XX:G1HeapWastePercent=20 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5.0 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150 -XX:GCTimeRatio=99``` 264 | 265 |
266 | 267 |
268 | If we were to use Java 8 with only G1GC, client, it would look like this 269 | 270 | ```-Xmx8G -Xms8G -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+ParallelRefProcEnabled -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:+PerfDisableSharedMem -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:MaxInlineLevel=15 -XX:MaxVectorSize=32 -XX:+UseCompressedOops -XX:ThreadPriorityPolicy=1 -XX:+UseNUMA -XX:+UseDynamicNumberOfGCThreads -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=350M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseFPUForSpilling -Dgraal.CompilerConfiguration=community -XX:+UseG1GC -XX:MaxGCPauseMillis=37 -XX:+PerfDisableSharedMem -XX:G1HeapRegionSize=16M -XX:G1NewSizePercent=23 -XX:G1ReservePercent=20 -XX:SurvivorRatio=32 -XX:G1MixedGCCountTarget=3 -XX:G1HeapWastePercent=20 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5.0 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150 -XX:GCTimeRatio=99``` 271 | 272 |
273 | 274 |
275 | 276 | ### Server G1GC 277 | 278 | Longer pauses of garbage collection are more acceptable on servers. These flags are very close to the aikar defaults: 279 | 280 | `-XX:+UseG1GC -XX:MaxGCPauseMillis=130 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=28 -XX:G1HeapRegionSize=16M -XX:G1ReservePercent=20 -XX:G1MixedGCCountTarget=3 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:SurvivorRatio=32 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150` 281 | 282 | > Note: If you are using Java 20, it does not need the `-XX:G1ConcRefinementServiceIntervalMillis=150` flag and will only print a warning with the flag 283 | 284 |
285 | If we were to use Java >8 with only G1GC, server, it would look like this 286 | 287 | ```-Xmx8G -Xms8G -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseVectorCmov -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:ThreadPriorityPolicy=1 -XX:AllocatePrefetchStyle=3 -XX:+UseG1GC -XX:MaxGCPauseMillis=130 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=28 -XX:G1HeapRegionSize=16M -XX:G1ReservePercent=20 -XX:G1MixedGCCountTarget=3 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:SurvivorRatio=32 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150``` 288 | 289 |
290 | 291 |
292 | If we were to use Java 8 with only G1GC, server, it would look like this 293 | 294 | ```-Xmx8G -Xms8G -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+ParallelRefProcEnabled -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:+PerfDisableSharedMem -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:MaxInlineLevel=15 -XX:MaxVectorSize=32 -XX:+UseCompressedOops -XX:ThreadPriorityPolicy=1 -XX:+UseNUMA -XX:+UseDynamicNumberOfGCThreads -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=350M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseFPUForSpilling -Dgraal.CompilerConfiguration=community -XX:+UseG1GC -XX:MaxGCPauseMillis=130 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=28 -XX:G1HeapRegionSize=16M -XX:G1ReservePercent=20 -XX:G1MixedGCCountTarget=3 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:SurvivorRatio=32 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150``` 295 | 296 |
297 | 298 |
299 | 300 | ### More aggressive G1GC 301 | 302 | **Warning: In order to use these flags you will need a larger amount of memory as well as a better CPU.** 303 | 304 | `-XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:+PerfDisableSharedMem -XX:G1HeapRegionSize=16M -XX:G1NewSizePercent=23 -XX:G1ReservePercent=20 -XX:SurvivorRatio=32 -XX:G1MixedGCCountTarget=1 -XX:G1HeapWastePercent=30 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5.0 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150 -XX:GCTimeRatio=99` 305 | 306 |
307 | If we were to use Java >8 with only aggressive G1GC, client, it would look like this 308 | 309 | ```-Xmx8G -Xms8G -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseVectorCmov -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:ThreadPriorityPolicy=1 -XX:AllocatePrefetchStyle=3 -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:+PerfDisableSharedMem -XX:G1HeapRegionSize=16M -XX:G1NewSizePercent=23 -XX:G1ReservePercent=20 -XX:SurvivorRatio=32 -XX:G1MixedGCCountTarget=1 -XX:G1HeapWastePercent=30 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5.0 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150 -XX:GCTimeRatio=99``` 310 | 311 |
312 | 313 |
314 | If we were to use Java 8 with only aggressive G1GC, client, it would look like this 315 | 316 | ```-Xmx8G -Xms8G -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+ParallelRefProcEnabled -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:+PerfDisableSharedMem -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:MaxInlineLevel=15 -XX:MaxVectorSize=32 -XX:+UseCompressedOops -XX:ThreadPriorityPolicy=1 -XX:+UseNUMA -XX:+UseDynamicNumberOfGCThreads -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=350M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseFPUForSpilling -Dgraal.CompilerConfiguration=community -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:+PerfDisableSharedMem -XX:G1HeapRegionSize=16M -XX:G1NewSizePercent=23 -XX:G1ReservePercent=20 -XX:SurvivorRatio=32 -XX:G1MixedGCCountTarget=1 -XX:G1HeapWastePercent=30 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5.0 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150 -XX:GCTimeRatio=99``` 317 | 318 |
319 | 320 |
321 | If we were to use Java >8 with only aggressive G1GC, server, it would look like this 322 | 323 | ```-Xmx8G -Xms8G -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseVectorCmov -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:ThreadPriorityPolicy=1 -XX:AllocatePrefetchStyle=3 -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:+PerfDisableSharedMem -XX:G1HeapRegionSize=16M -XX:G1NewSizePercent=23 -XX:G1ReservePercent=20 -XX:SurvivorRatio=32 -XX:G1MixedGCCountTarget=1 -XX:G1HeapWastePercent=30 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5.0 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150 -XX:GCTimeRatio=99``` 324 | 325 |
326 | 327 |
328 | If we were to use Java 8 with only aggressive G1GC, server, it would look like this 329 | 330 | ```-Xmx8G -Xms8G -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+ParallelRefProcEnabled -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:+PerfDisableSharedMem -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:MaxInlineLevel=15 -XX:MaxVectorSize=32 -XX:+UseCompressedOops -XX:ThreadPriorityPolicy=1 -XX:+UseNUMA -XX:+UseDynamicNumberOfGCThreads -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=350M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseFPUForSpilling -Dgraal.CompilerConfiguration=community -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:+PerfDisableSharedMem -XX:G1HeapRegionSize=16M -XX:G1NewSizePercent=23 -XX:G1ReservePercent=20 -XX:SurvivorRatio=32 -XX:G1MixedGCCountTarget=1 -XX:G1HeapWastePercent=30 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5.0 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150 -XX:GCTimeRatio=99``` 331 | 332 |
333 | 334 | > Note: If you are using Java 20, it does not need the `-XX:G1ConcRefinementServiceIntervalMillis=150` flag and will only print a warning with the flag 335 | 336 |
337 | 338 | ### Garbage Collection Threading 339 | 340 | `-XX:ConcGCThreads=[Some Number]` controls the [*maximum number*](https://github.com/openjdk/jdk/blob/dd34a4c28da73c798e021c7473ac57ead56c9903/src/hotspot/share/gc/z/zHeuristics.cpp#L96-L104) of background threads the garbage collector is allowed to use, and defaults to the calculation `logical (hyperthreaded) cores / 4`. Recent versions of Java will [reduce the number of garbage collection threads, if needed](https://wiki.openjdk.org/display/zgc/Main#Main-SettingConcurrentGCThreads). 341 | 342 | In some cases (especially with ZGC or Shenandoh garbage collection) you want to increase this thread cap past the default. I recommend "2" on CPUs with 4 threads, and `[number of real cores - 2]` on most other CPUs, but you may need to change and test around with this parameter. If it's too low, garbage collection will not keep up with Minecraft, and the game will stutter and/or start eating large amounts of RAM and crash. If it's too high, it might slow the game down, especially if you are running Java 8. 343 | 344 | No other "threading" flags like `ParallelGCThreads` or `JVMCIThreads` are necessary, as they are enabled by default with good automatic settings in Java 8+. 345 | 346 |
347 | 348 | GraalVM 349 | ====== 350 | 351 | > The terms Enterprise Edition (EE) and Community Edition (CE) are now deprecated from GraalVM with a rebranding from Oracle. In the past, you had to be a Oracle subscriber to use the Enterprise Edition which had the features we want or use the Community Edition, now the public version which is just GraalVM have these features for free to the public, the new versions also include ZGC which is recommended to use with GraalVM over using its G1GC collector 352 | 353 |
354 | 355 | GraalVM is a new Java VM from Oracle that can improve the performance of (modded and vanilla) Minecraft. While client FPS gains are modest, server-side workloads like chunk generation can get a 20%+ boost. 356 | 357 |
358 | 359 | Download it from these direct links from Oracle: 360 | 361 | Select GraalVM versions are also available on the AUR and on Oracle Linux's repositories 362 | 363 | *Most up-to-date downloads, no account needed* 364 | 365 | > Note: If you are using Java >20, it does not need the `-XX:G1ConcRefinementServiceIntervalMillis=150` flag and will only print a warning with the flag 366 | 367 | > I highly recommend using GraalVM Java 21 with generational ZGC where possible as of 1.20.5. In older versions if the modpack is not explicitly compatible with Java 21 then fallback to previous recommendations. GraalVM Java 21 uses generational ZGC and does have a large performance boost. GraalVM Java 21 with generational ZGC in-use is the current best recommendation as of 1.20.5 for both server and client. 368 | 369 |
370 | Java 21 371 | 372 | - Windows AMD64 (64-bit): https://download.oracle.com/graalvm/21/latest/graalvm-jdk-21_windows-x64_bin.zip 373 | 374 | - Linux AMD64 (64-bit): https://download.oracle.com/graalvm/21/latest/graalvm-jdk-21_linux-x64_bin.tar.gz 375 | 376 | - Linux AARCH64 (ARM 64-bit): https://download.oracle.com/graalvm/21/latest/graalvm-jdk-21_linux-aarch64_bin.tar.gz 377 | 378 | - Mac AMD64 (64-bit): https://download.oracle.com/graalvm/21/latest/graalvm-jdk-21_macos-x64_bin.tar.gz 379 | 380 | - Mac AARCH64 (ARM 64-bit): https://download.oracle.com/graalvm/21/latest/graalvm-jdk-21_macos-aarch64_bin.tar.gz 381 | 382 |
383 | 384 |
385 | Java 20 386 | 387 | - Windows AMD64 (64-bit): https://download.oracle.com/graalvm/20/latest/graalvm-jdk-20_windows-x64_bin.zip 388 | 389 | - Linux AMD64 (64-bit): https://download.oracle.com/graalvm/20/latest/graalvm-jdk-20_linux-x64_bin.tar.gz 390 | 391 | - Linux AARCH64 (ARM 64-bit): https://download.oracle.com/graalvm/20/latest/graalvm-jdk-20_linux-aarch64_bin.tar.gz 392 | 393 | - Mac AMD64 (64-bit): https://download.oracle.com/graalvm/20/latest/graalvm-jdk-20_macos-x64_bin.tar.gz 394 | 395 | - Mac AARCH64 (ARM 64-bit): https://download.oracle.com/graalvm/20/latest/graalvm-jdk-20_macos-aarch64_bin.tar.gz 396 | 397 |
398 | 399 |
400 | Java 17 401 | 402 | - Windows AMD64 (64-bit): https://download.oracle.com/graalvm/17/latest/graalvm-jdk-17_windows-x64_bin.zip 403 | 404 | - Linux AMD64 (64-bit): https://download.oracle.com/graalvm/17/latest/graalvm-jdk-17_linux-x64_bin.tar.gz 405 | 406 | - Linux AARCH64 (ARM 64-bit): https://download.oracle.com/graalvm/17/latest/graalvm-jdk-17_linux-aarch64_bin.tar.gz 407 | 408 | - Mac AMD64 (64-bit): https://download.oracle.com/graalvm/17/latest/graalvm-jdk-17_macos-x64_bin.tar.gz 409 | 410 | - Mac AARCH64 (ARM 64-bit): https://download.oracle.com/graalvm/17/latest/graalvm-jdk-17_macos-aarch64_bin.tar.gz 411 | 412 |
413 | 414 |
415 | 416 | Unfortunately, I am no longer able to supply public free to download Java 11 and 8 links, however, you can look for current and archived versions of GraalVM on the current listing of [Oracle's website](https://www.oracle.com/downloads/graalvm-downloads.html) and on their [Java download page](https://www.oracle.com/java/technologies/downloads/#graalvmjava20). 417 | 418 | If you do have an Oracle account, you can use these links: 419 | 420 | *Most up-to-date Enterprise Edition downloads, account needed, these do not have ZGC* 421 | 422 |
423 | Java 11 424 | 425 | - Windows AMD64 (64-bit): https://download.oracle.com/otn/utilities_drivers/oracle-labs/graalvm-ee-java11-windows-amd64-22.3.3.zip 426 | 427 | - Linux AMD64 (64-bit): https://download.oracle.com/otn/utilities_drivers/oracle-labs/graalvm-ee-java11-linux-amd64-22.3.3.tar.gz 428 | 429 | - Linux AARCH64 (ARM 64-bit): https://download.oracle.com/otn/utilities_drivers/oracle-labs/graalvm-ee-java11-linux-aarch64-22.3.3.tar.gz 430 | 431 | - Mac AMD64 (64-bit): https://download.oracle.com/otn/utilities_drivers/oracle-labs/graalvm-ee-java11-darwin-amd64-22.3.3.tar.gz 432 | 433 |
434 | 435 |
436 | Java 8 437 | 438 | - Windows AMD64 (64-bit): https://download.oracle.com/otn/utilities_drivers/oracle-labs/graalvm-ee-java8-windows-amd64-21.3.7.zip 439 | 440 | - Linux AMD64 (64-bit): https://download.oracle.com/otn/utilities_drivers/oracle-labs/graalvm-ee-java8-linux-amd64-21.3.7.tar.gz 441 | 442 | - Mac AMD64 (64-bit): https://download.oracle.com/otn/utilities_drivers/oracle-labs/graalvm-ee-java8-darwin-amd64-21.3.7.tar.gz 443 | 444 |
445 | 446 | 447 |
448 | 449 | These releases are not Java installers. You need to manually replace your launcher's version of Java, or use a Minecraft launcher that supports specifying your Java path. I recommend ATLauncher, Prism Launcher or GDLauncher. When specifying a java path, navigate to the "bin" folder in the GraalVM download and use `javaw.exe` or `java.exe` (`javaw.exe` is typically the most recommended as it will not have an additional console window/command prompt while `java.exe` will). 450 | 451 | Alternatively, you can install it system-wide by following [Oracle's guide](https://www.graalvm.org/latest/docs/getting-started/) 452 | 453 |
454 | 455 | For servers, you need to replace the "java" command in your server start sh/bat file with the full path to Graalvm java, in quotes. 456 | 457 |
458 | 459 | ## GraalVM Java Arguments 460 | 461 | Be sure to set `-Dgraal.VectorizeSIMD` to `false` if you run shaders. 462 | Arguments for GraalVM 11, 17, & 20: 463 | 464 | ```-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:AllocatePrefetchStyle=3 -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:+EagerJVMCI -Dgraal.TuneInlinerExploration=1 -Dgraal.CompilerConfiguration=enterprise``` 465 | 466 | **You must use G1GC or ZGC with these arguments.** GraalVM currently doesn't work with Shenandoah's garbage collector. 467 | 468 |
469 | 470 |
471 | If we were to use Java >21 with GraalVM Java Arguments and Generational ZGC, it would look like this 472 | 473 | ```-Xmx8G -Xms8G -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseVectorCmov -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:ThreadPriorityPolicy=1 -XX:AllocatePrefetchStyle=3 -XX:+UseZGC -XX:AllocatePrefetchStyle=1 -XX:-ZProactive -XX:+UseZGC -XX:AllocatePrefetchStyle=1 -XX:-ZUncommit -XX:+ZGenerational``` 474 | 475 |
476 | 477 |
478 | 479 |
480 | If we were to use Java >8 with GraalVM Java Arguments and ZGC, it would look like this 481 | 482 | ```-Xmx8G -Xms8G -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseVectorCmov -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:ThreadPriorityPolicy=1 -XX:AllocatePrefetchStyle=3 -XX:+UseZGC -XX:AllocatePrefetchStyle=1 -XX:-ZProactive -XX:+UseZGC -XX:AllocatePrefetchStyle=1 -XX:-ZProactive``` 483 | 484 |
485 | 486 |
487 | 488 |
489 | If we were to use Java >8 with GraalVM Java Arguments and G1GC, it would look like this (Client) 490 | 491 | ```-Xmx8G -Xms8G -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseVectorCmov -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:ThreadPriorityPolicy=1 -XX:AllocatePrefetchStyle=3 -XX:+UseG1GC -XX:MaxGCPauseMillis=37 -XX:+PerfDisableSharedMem -XX:G1HeapRegionSize=16M -XX:G1NewSizePercent=23 -XX:G1ReservePercent=20 -XX:SurvivorRatio=32 -XX:G1MixedGCCountTarget=3 -XX:G1HeapWastePercent=20 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5.0 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150 -XX:GCTimeRatio=99 -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:AllocatePrefetchStyle=3 -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:+EagerJVMCI -Dgraal.TuneInlinerExploration=1 -Dgraal.CompilerConfiguration=enterprise``` 492 | 493 |
494 | 495 |
496 | If we were to use Java >8 with GraalVM Java Arguments and G1GC, it would look like this (Server) 497 | 498 | ```-Xmx8G -Xms8G -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseVectorCmov -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:ThreadPriorityPolicy=1 -XX:AllocatePrefetchStyle=3 -XX:+UseG1GC -XX:MaxGCPauseMillis=130 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=28 -XX:G1HeapRegionSize=16M -XX:G1ReservePercent=20 -XX:G1MixedGCCountTarget=3 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:SurvivorRatio=32 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150 -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:AllocatePrefetchStyle=3 -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:+EagerJVMCI -Dgraal.TuneInlinerExploration=1 -Dgraal.CompilerConfiguration=enterprise``` 499 | 500 |
501 | 502 |
503 | 504 | It is also possible to get Java 8 versions of GraalVM (EE) from the [21.X section on the Oracle site](https://www.oracle.com/downloads/graalvm-downloads.html), and use these arguments: 505 |
506 | If we were to use Java <=8 with GraalVM (EE's) Java Arguments, it would look like this 507 | 508 | ```-Xmx8G -Xms8G -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+ParallelRefProcEnabled -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:AllocatePrefetchStyle=1 -XX:ThreadPriorityPolicy=1 -XX:+UseNUMA -XX:+UseDynamicNumberOfGCThreads -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=350M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseFPUForSpilling -XX:+EnableJVMCI -XX:+UseJVMCICompiler -XX:+EagerJVMCI -Dgraal.TuneInlinerExploration=1 -Dgraal.CompilerConfiguration=enterprise -Dgraal.UsePriorityInlining=true -Dgraal.Vectorization=true -Dgraal.OptDuplication=true -Dgraal.DetectInvertedLoopsAsCounted=true -Dgraal.LoopInversion=true -Dgraal.VectorizeHashes=true -Dgraal.EnterprisePartialUnroll=true -Dgraal.VectorizeSIMD=true -Dgraal.StripMineNonCountedLoops=true -Dgraal.SpeculativeGuardMovement=true -Dgraal.InfeasiblePathCorrelation=true``` 509 | 510 |
511 | 512 |
513 | 514 | ## GraalVM Mod Compatibility 515 | 516 | > GraalVM 22.3.0 fixes all known Minecraft compatibility bugs 517 | 518 | If you run an older, Java 8-based version of GraalVM, there are some potential issues: 519 | 520 | - `VectorizeSIMD` turns entities invisible with shader mods like Optifine, Iris or Occulus, but only under certain conditions. This will be fixed in GraalVM EE 22.3.0. See: https://github.com/oracle/graal/issues/4849 521 | - Be sure to set `-Dgraal.VectorizeSIMD` to `false` if you run shaders. 522 | 523 | - GraalVM CE and EE both break constellation rendering in 1.16.5 Astral Sorcery. This is possibly related to the shader bug. See: https://github.com/HellFirePvP/AstralSorcery/issues/1963 524 | 525 | I have not observed any server-side bugs yet. 526 | 527 | If you run into any other mod issues you can trace back to GraalVM, please create a Github issue. Generally, you can work around them by disabling major `dgraal` optimization flags, or by finding the right function with `Dgraal.PrintCompilation=true`, and working around it with `-Dgraal.GraalCompileOnly=~...` once you find the miscompiled function. 528 | 529 |
530 | 531 | Performance Mods 532 | ====== 533 | 534 | This is a **fantastic** repo for finding performance mods: https://github.com/NordicGamerFE/usefulmods 535 | 536 | There is no longer any use for Optifine, even in 1.7.10. 537 | 538 | For Forge/NeoForge use: [Embeddium](https://www.curseforge.com/minecraft/mc-mods/embeddium) + [Oculus](https://www.curseforge.com/minecraft/mc-mods/oculus) (shaders) 539 | 540 | For Fabric use: [Sodium](https://www.curseforge.com/minecraft/mc-mods/sodium) + [Iris](https://www.curseforge.com/minecraft/mc-mods/irisshaders) (shaders) 541 | 542 |
543 | 544 | Linux 545 | ====== 546 | ### Kernel 547 | When using Linux, other kernels may outperform the original/base kernels. 548 | 549 | An example of this is using the [linux-tkg](https://github.com/Frogging-Family/linux-tkg) build system which allows you to select certain optimization patches. However, it should be noted, the actual performance gain is not tested and in reality may not show any real gains. 550 | 551 |
552 | 553 | NUMA 554 | ====== 555 | 556 | The flag `-XX:+UseNUMA` forces the enabling of NUMA. 557 | 558 | `-XX:+UseNUMA` can be safely removed from AMD Ryzen MCM and Threadripper CPUs. The NUMA flag ensures that CPUs are able to access RAM uniformly, however, with AMD Ryzen MCM and Threadripper CPUs the cores already perform memory access uniformly. Typically, this flag may not even be needed as the Java Virtual Machine should now automatically detect if NUMA is actually needed. AMD Ryzen MCM and Threadripper CPUs should automatically disable this flag, however, you may want to manually remove it. 559 | 560 | There may be slight increases or decreases in performance based upon the usage of this flag, however, with modern CPUs there should not be too much of a difference, as well as based upon RAM. 561 | 562 |
563 | 564 | Other Performance Tips 565 | ====== 566 | 567 | - Run your Minecraft servers on the Clear Linux OS - It's by far the most optimized linux distribution out-of-the-box, and it has some other nice features (like a stateless config system). It also runs clients on AMD/Intel GPUs [quite well](https://web.archive.org/web/20220916090057/https://docs.01.org/clearlinux/latest/tutorials/multi-boot/dual-boot-win.html). 568 | 569 | - [Oracle Linux](https://www.oracle.com/linux/) is also a good choice for servers, since its reasonably well optimized out-of-the-box and has Graalvm available via the package manager. 570 | 571 | - For Linux clients, Arch-based distros like CachyOS or EndeavorOS are excellent, as they have wide support for most hardware. 572 | 573 | - Make sure the Minecraft client is using your dedicated GPU if you have one! Check the F3 tab, and force Minecraft to use it in the "**Windows Graphics Settings**", *not* the AMD/Nvidia control panel (as they don't seem to work well). 574 | 575 | - Minecraft client linux users should check out [Minecraft Wayland](https://github.com/Admicos/minecraft-wayland). 576 | 577 | - If you are running on an older system or have a low amount of memory, close everything in the background, including Discord, game launchers and your browser. Minecraft is resource intensive, and does not like other apps generating CPU interrupts or eating disk I/O, and memory. 578 | 579 |
580 | 581 | Frequently Asked Questions 582 | ====== 583 | 584 | - Java arguments have the goal of improving server performance and client stuttering as a result of garbage collection, they do not have the intention of boosting client FPS. For that, running correct/up-to-date graphics drivers and performance mods is far more [important](https://github.com/NordicGamerFE/usefulmods) 585 | 586 | - This guide assumes you have a decent amount of spare RAM when running Minecraft. If your setup is RAM constrained, try removing the following arguments in particular: `-XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M`, and try the server G1GC arguments. 587 | 588 | - IBM's OpenJ9 does save RAM, as its reputation would suggest, but is over 30% slower at server chunkgen in my tests. If there are any flags that make it competitive with OpenJDK, please open a discussion on Github or contact my [Discord](https://discord.gg/nptv2TwaD5) 589 | 590 | - EXCEPTION_ACCESS_VIOLATION - This may be caused by a few different things 591 | - Ensure Minecraft is using your dedicated graphics card if you have one 592 | - Try updating graphics drivers and other drivers 593 | - Try restarting your computer and only running Minecraft and see if it works 594 | - Reinstall your Java Runtime Environment 595 | - Try reinstalling Minecraft 596 | - (Weird-edge case) If you are using only vanilla try installing Forge/NeoForge with or without mods and test 597 | 598 |
599 | 600 | Flag Explanations 601 | ====== 602 | - Aikar G1GC flag [explanation](https://aikar.co/2018/07/02/tuning-the-jvm-g1gc-garbage-collector-flags-for-minecraft/) 603 | - `-XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions` simply unlock more flags to be used. These can be listed with the `-XX:+PrintFlagsFinal` and `-XX:+JVMCIPrintProperties` flags, see [Flag Dumps](Flag_Dumps) 604 | - `-XX:G1MixedGCCountTarget=3`: This is how many oldgen gc blocks to target in "mixed" gc. These mixed collections are much slower, and the Minecraft client doesn't generate oldgen very quickly, so we can lower this value to 3, 2, or even 1 for shorter GC pauses. 605 | - `-XX:+UseNUMA` enables optimizations for multisocket systems, if applicable. Not sure if this applies to MCM CPUs like Ryzen or Epyc, but its auto disabled if not applicable. 606 | - `-XX:-DontCompileHugeMethods` *Allows* huge methods to be compiled. Modded Minecraft has some of these, and we don't care about higher background compiler CPU usage. 607 | - `-XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000` Enable optimization of larger methods. See [here](https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8058148) 608 | - `-XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M` reserves more space for compiled code. All sections must "add up" to `ReservedCodeCacheSize`. I have observed modded Minecraft run into the default 250 megabyte limit with `XX:+PrintCodeCache`, but even if its not filled, the larger size makes eviction of compiled code less aggressive. 609 | - `-XX:NmethodSweepActivity=1` (default 10) keeps "cold" code in the cache for a longer time. There is no risk of "filling up" the code cache either, as cold code is more aggressively removed as it fills up. 610 | - ~~`-XX:+UseStringDeduplication`~~ This is a popular option, but not used here, as it's benching slower. Maybe its useful on low memory systems? 611 | - `-XX:+UseFastUnorderedTimeStamps` Avoid system calls for getting the time. The impact of this will vary per system, but we aren't really concerned with logging timestamp accuracy. 612 | - `-XX:+UseCriticalJavaThreadPriority` *Nothing* should preempt the Minecraft threads. GC and Compiler threads can wait. 613 | - `-XX:ThreadPriorityPolicy=1` Use a wider range of thread priorities. Requires sudo on linux to work. Some JDKs (like Graal) enable this by default, but some don't. 614 | - `-XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150`: Optimizes G1GC's concurrent collection threads, still being [tested](https://research.spec.org/icpe_proceedings/2014/p111.pdf) 615 | - `-XX:G1RSetUpdatingPauseTimePercent=0`: We want *all* this work to be done in the G1GC concurrent threads, not the pauses. 616 | - `-XX:G1HeapWastePercent=18` Don't bother collecting from old gen until its above this percent. This avoids triggering slower "mixed" young generation GCs, which is fine since Minecraft (with sufficient memory) doesn't fill the old gen that fast. Idea from [here](https://www.reddit.com/r/Minecraft/comments/k9zb7m/tuning_jvm_gc_for_singleplayer/) 617 | - `-XX:GCTimeRatio=99` As a goal, 1% of CPU time should be spent on garbage collection. Default is 12, which seems way too low. The default for Java 8 was 99. 618 | - `-XX:AllocatePrefetchStyle=3` Generate one prefetch instruction per cache line. More aggressive prefetching is generally useful on newer CPUs with large caches. It seems to break ZGC. See [Github](https://github.com/openjdk/jdk/blob/bd90c4cfa63ba2de26f7482ed5d1704f9be9629f/src/hotspot/share/opto/macro.cpp#L1806) 619 | - `-Dgraal.LoopRotation=true` A non default optimization, will probably be default soon. 620 | - `-Dgraal.TuneInlinerExploration=1` Spend more time making inlining decisions. For Minecraft, we want the C2 compiler to be as slow and aggressive as possible. 621 | - Most other `-Dgraal` arguments are enabled by default, and are either there as a sanity check, for debugging or as a failsafe (if, for instance, someone unknowingly disables JVCMI with some other flag). 622 | - Many Java 8 flags (such as `-XX:MaxInlineLevel=15 -XX:MaxVectorSize=32`) are just copied from the Java 17 defaults. Others (like `+AggressiveOpts`) are only non-default in some older Java 8 builds. 623 | 624 | Flags Under Consideration: 625 | ====== 626 | - More aggressive inlining, via `-Dgraal.BaseTargetSpending=160` (default 120) in Graal and some other flags in OpenJDK. CPUs with larger caches might benefit from this. 627 | - OpenJDK flags which are disabled by default: `-XX:+AlignVector -XX:+OptoBundling -XX:+OptimizeFill -XX:+AlwaysCompileLoopMethods -XX:+EnableVectorAggressiveReboxing -XX:+EnableVectorSupport -XX:+OptoScheduling -XX:+UseCharacterCompareIntrinsics -XX:+UseCopySignIntrinsic -XX:+UseVectorStubs` 628 | - ~~`-Dgraal.LSRAOptimization=true`~~ seems to hurt performance 629 | - `-Dgraal.OptWriteMotion=true` and `graal.WriteableCodeCache=true`, which *do not* seem stable, but may be more stable in GraalVM 22.3.0 630 | - Extreme `G1HeapWastePercent` values. 631 | 632 |
633 | 634 | Benchmarks 635 | ====== 636 | 637 | A modernized overhaul of benchmarking is in-progress 638 | 639 |
640 | 641 | Too Long Didn't Read (TLDR)/Summary 642 | ====== 643 | 644 | Minecraft Version >= 1.20.5 = Java 21 645 | Minecraft Version <= 1.20.4 and >= 1.16.5 = Java 17 646 | Minecraft Version < 1.16.5 = Java 8 647 | 648 | Exceptions for Minecraft versions can be made, for example in the modpack GTNH you want to use Java 21 649 | 650 | If you do not know what Java version you are using, you are likely using a version of Java which only has the G1GC, in this case copy and paste the following into your JVM arguments for your client: 651 | 652 |
653 | >=Java 17 654 | 655 | ```-Xmx8G -Xms8G -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+UseNUMA -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=400M -XX:NonNMethodCodeHeapSize=12M -XX:ProfiledCodeHeapSize=194M -XX:NonProfiledCodeHeapSize=194M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseVectorCmov -XX:+PerfDisableSharedMem -XX:+UseFastUnorderedTimeStamps -XX:+UseCriticalJavaThreadPriority -XX:ThreadPriorityPolicy=1 -XX:AllocatePrefetchStyle=3 -XX:+UseG1GC -XX:MaxGCPauseMillis=37 -XX:+PerfDisableSharedMem -XX:G1HeapRegionSize=16M -XX:G1NewSizePercent=23 -XX:G1ReservePercent=20 -XX:SurvivorRatio=32 -XX:G1MixedGCCountTarget=3 -XX:G1HeapWastePercent=20 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5.0 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150 -XX:GCTimeRatio=99``` 656 | 657 |
658 | 659 |
660 | Java 8 661 | 662 | ```-Xmx8G -Xms8G -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+AlwaysActAsServerClassMachine -XX:+ParallelRefProcEnabled -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:+PerfDisableSharedMem -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -XX:MaxInlineLevel=15 -XX:MaxVectorSize=32 -XX:+UseCompressedOops -XX:ThreadPriorityPolicy=1 -XX:+UseNUMA -XX:+UseDynamicNumberOfGCThreads -XX:NmethodSweepActivity=1 -XX:ReservedCodeCacheSize=350M -XX:-DontCompileHugeMethods -XX:MaxNodeLimit=240000 -XX:NodeLimitFudgeFactor=8000 -XX:+UseFPUForSpilling -Dgraal.CompilerConfiguration=community -XX:+UseG1GC -XX:MaxGCPauseMillis=37 -XX:+PerfDisableSharedMem -XX:G1HeapRegionSize=16M -XX:G1NewSizePercent=23 -XX:G1ReservePercent=20 -XX:SurvivorRatio=32 -XX:G1MixedGCCountTarget=3 -XX:G1HeapWastePercent=20 -XX:InitiatingHeapOccupancyPercent=10 -XX:G1RSetUpdatingPauseTimePercent=0 -XX:MaxTenuringThreshold=1 -XX:G1SATBBufferEnqueueingThresholdPercent=30 -XX:G1ConcMarkStepDurationMillis=5.0 -XX:G1ConcRSHotCardLimit=16 -XX:G1ConcRefinementServiceIntervalMillis=150 -XX:GCTimeRatio=99``` 663 | 664 |
665 | 666 | If you do know if you are using a version of Java with ZGC, Shenandoah, or GraalVM support then you should check [ZGC](#zgc), [Shenandoah](#Shenandoah), or [GraalVM](#graalvm-enterprise-edition), chances are, however, you are likely not if you previously didn't know about it. 667 | 668 | 669 | > Note: See [Launchers](#launchers) and [Memory Allocation](#memory-allocation) for important information 670 | 671 |
672 | 673 | --- 674 | 675 | ### [Credits](./Sources_Credits.md) 676 | 677 |
678 | 679 | [Logo]: ../assets/Minecraft%20Performance%20Guide%20-%20Logo.png 680 | [Banner]: ../assets/Minecraft%20Performance%20Guide%20-%20Banner.png 681 | -------------------------------------------------------------------------------- /Java Arguments/Sources_Credits.md: -------------------------------------------------------------------------------- 1 | ![Minecraft Performance Guide Banner][Banner] 2 | 3 | ###### This is the Sources and Credits for the detailed Minecraft Java Arguments guide and is a part of the overarching Minecraft Performance Guide 4 | 5 |
6 | 7 | Credits 8 | ====== 9 | 10 | The original information for the Java arguments guide came from [brucethemoose/Minecraft-Performance-Flags-Benchmarks](https://github.com/brucethemoose/Minecraft-Performance-Flags-Benchmarks). Unfortunately, it seems the guide became stale and hasn't been updated in 7 months leading me to believe it has been abandoned. I have tried to contact the repository owner and had no luck in doing so, which is why I took the lead and made this entire guide originally. The original repository also has an [MIT license](https://github.com/brucethemoose/Minecraft-Performance-Flags-Benchmarks/blob/main/License.txt) which allows for this. 11 | 12 | All credits for the original information goes to brucethemoose and the contributors of the above repository: 13 | 14 | brucethemoose, 15 | 16 | Godeps2891, 17 | 18 | Radplay, 19 | 20 | he3als 21 | 22 |
23 | 24 | I have overhauled the entire look of the guide and brought it to a much more up-to-date standpoint and plan on maintaining it for quite a while moving forward. 25 | 26 | I have also performed my own independent, extensive testing to ensure that accurate results and benchmarking have taken place. 27 | 28 |
29 | 30 | Original Sources 31 | ====== 32 | 33 | These sources are the sources from the original repository which I felt like should be maintained here. 34 | 35 | - Updated Aikar flags from this repo: https://github.com/etil2jz/etil-minecraft-flags 36 | - Reddit post from a Forge dev: https://www.reddit.com/r/feedthebeast/comments/5jhuk9/modded_mc_and_memory_usage_a_history_with_a/ 37 | - Red Hat's optimization guide: https://www.redhat.com/en/blog/optimizing-rhel-8-run-java-implementation-minecraft-server 38 | - GraalVM release notes: https://www.graalvm.org/release-notes/ 39 | - Oracle's Java 17 Documentation: https://docs.oracle.com/en/java/javase/17/docs/specs/man/java.html 40 | - VM Options explorer: https://chriswhocodes.com/ 41 | - Java itself, via the `-XX:+PrintFlagsFinal` and the `-XX:+JVMCIPrintProperties` flags to dump flag descriptions/defaults. 42 | - OpenJDK source: https://github.com/openjdk/jdk/ 43 | - Testing from @keyboard.tn in Discord. 44 | - https://research.spec.org/icpe_proceedings/2014/p111.pdf 45 | - https://www.diva-portal.org/smash/get/diva2:1466940/FULLTEXT01.pdf 46 | - https://malloc.se/blog/zgc-jdk17 47 | - https://docs.oracle.com/javase/8/embedded/develop-apps-platforms/codecache.htm 48 | 49 | 50 | [Logo]: ../assets/Minecraft%20Performance%20Guide%20-%20Logo.png 51 | [Banner]: ../assets/Minecraft%20Performance%20Guide%20-%20Banner.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 DataDalton 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Large Page files/LICENSE: -------------------------------------------------------------------------------- 1 | New 2 | ---------------------------------------------------------------------------------- 3 | MIT License 4 | 5 | Copyright (c) 2023 DataDalton 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so, subject to the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be included in all 15 | copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 | SOFTWARE. 24 | ---------------------------------------------------------------------------------- 25 | 26 | 27 | Original 28 | ---------------------------------------------------------------------------------- 29 | MIT License 30 | 31 | Copyright (c) 2022 brucethemoose 32 | 33 | Permission is hereby granted, free of charge, to any person obtaining a copy 34 | of this software and associated documentation files (the "Software"), to deal 35 | in the Software without restriction, including without limitation the rights 36 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 37 | copies of the Software, and to permit persons to whom the Software is 38 | furnished to do so, subject to the following conditions: 39 | 40 | The above copyright notice and this permission notice shall be included in all 41 | copies or substantial portions of the Software. 42 | 43 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 44 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 45 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 46 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 47 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 48 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 49 | SOFTWARE. 50 | ---------------------------------------------------------------------------------- 51 | -------------------------------------------------------------------------------- /Large Page files/README.md: -------------------------------------------------------------------------------- 1 | ![Minecraft Performance Guide Banner][Banner] 2 | 3 | ###### This is the Large Page files guide and is a part of the overarching Minecraft Performance Guide 4 | 5 |
6 | 7 | Large Page Files 8 | ====== 9 | 10 | **NOTE: Large Pages requires admin privledges on Windows. This is a security risk, and you should skip this section if you aren't comfortable with that.** 11 | 12 | Enabling large pages improves the performance of both Minecraft servers and clients. Here are some great tutorials for enabling it: 13 | 14 | - [Windows 10 Pro](https://www.chaoticafractals.com/manual/getting-started/enabling-large-page-support-windows) 15 | - [Windows 10 Home](https://awesomeprojectsxyz.blogspot.com/2017/11/windows-10-home-how-to-enable-lock.html?m=1) 16 | - [Tool mirrors for the Windows 10 Home tutorial](https://gist.github.com/eyecatchup/0107bab3d92473cb8a3d3547848fc442) 17 | - [Windows 11 Youtube](https://www.youtube.com/watch?v=v6A2clXcC9Y) 18 | 19 | - [Linux](https://kstefanj.github.io/2021/05/19/large-pages-and-java.html) 20 | 21 | On Windows, you **must** run Java, and your launcher, as an administrator. 22 | 23 | That means checking the ["run as administrator" compatibility checkbox](https://support.sega.com/hc/en-us/articles/201556551-Compatibility-Mode-and-Running-as-Administrator-for-PC-Games) for `javaw.exe`, `java.exe` and `your launcher.exe`, otherwise Large Pages will silently fail. Add `-XX:+UseLargePages -XX:LargePageSizeInBytes=2m` to your JVM arguments. 24 | 25 | On linux, you generally want to use `-XX:+UseTransparentHugePages`. To manually allocate memory instead (for a bigger performance boost), Red Hat has a good tutorial for RHEL-like linux distros, [like Fedora, CentOS, or Oracle Linux](https://www.redhat.com/en/blog/optimizing-rhel-8-run-java-implementation-minecraft-server) 26 | 27 | Check and see if large pages is working with the `-Xlog:gc+init` java argument in Java 17. 28 | 29 | In any Java version/platform, if large pages isn't working, you will get a warning in the log similar to this: 30 | `Java HotSpot(TM) 64-Bit Server VM warning: JVM cannot use large page memory because it does not have enough privilege to lock pages in memory.` 31 | 32 | > Note: With modern computers it is more beneficial to allocate more memory than to increase page file size 33 | 34 |
35 | 36 | --- 37 | 38 | ### [Credits](../Java%20Arguments/Sources_Credits.md) 39 | 40 |
41 | 42 | [Logo]: ../assets/Minecraft%20Performance%20Guide%20-%20Logo.png 43 | [Banner]: ../assets/Minecraft%20Performance%20Guide%20-%20Banner.png -------------------------------------------------------------------------------- /Launchers/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 DataDalton 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Launchers/README.md: -------------------------------------------------------------------------------- 1 | ![Minecraft Performance Guide Banner][Banner] 2 | 3 | ###### This is the Launchers guide and is a part of the overarching Minecraft Performance Guide 4 | 5 |
6 | 7 | Launchers 8 | ====== 9 | 10 | TODO 11 | 12 |
13 | 14 | [Logo]: ../assets/Minecraft%20Performance%20Guide%20-%20Logo.png 15 | [Banner]: ../assets/Minecraft%20Performance%20Guide%20-%20Banner.png -------------------------------------------------------------------------------- /Mods/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 DataDalton 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Mods/README.md: -------------------------------------------------------------------------------- 1 | ![Minecraft Performance Guide Banner][Banner] 2 | 3 | ###### This is the Mods guide and is a part of the overarching Minecraft Performance Guide 4 | 5 |
6 | 7 | Mods 8 | ====== 9 | 10 | TODO 11 | 12 |
13 | 14 | [Logo]: ../assets/Minecraft%20Performance%20Guide%20-%20Logo.png 15 | [Banner]: ../assets/Minecraft%20Performance%20Guide%20-%20Banner.png 16 | -------------------------------------------------------------------------------- /RAM/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 DataDalton 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /RAM/README.md: -------------------------------------------------------------------------------- 1 | ![Minecraft Performance Guide Banner][Banner] 2 | 3 | ###### This is the RAM guide and is a part of the overarching Minecraft Performance Guide 4 | 5 |
6 | 7 | RAM 8 | ====== 9 | 10 | TODO 11 | 12 |
13 | 14 | RAM Size 15 | ====== 16 | 17 | TODO 18 | 19 |
20 | 21 | RAM MT/S 22 | ====== 23 | 24 | TODO 25 | 26 |
27 | 28 | RAM Timings 29 | ====== 30 | 31 | TODO 32 | 33 |
34 | 35 | RAM Overclocking 36 | ====== 37 | 38 | TODO 39 | 40 |
41 | 42 | [Logo]: ../assets/Minecraft%20Performance%20Guide%20-%20Logo.png 43 | [Banner]: ../assets/Minecraft%20Performance%20Guide%20-%20Banner.png 44 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Minecraft Performance Guide Banner][Banner] 2 | 3 | ###### Currently, this main page serves as a directory for all of the specific guides, but will eventually have a general summary of everything and will act as a hub for connecting lots of useful resources 4 | 5 |
6 | 7 | Minecraft Performance Guide 8 | ====== 9 | Experiencing crashes, having TPS, FPS, or memory issues, have questions, or just want to talk and showcase builds? Join our Discord! 10 | 11 | [![Discord](https://img.shields.io/discord/1142866287983349760.svg?color=%237289da&label=Discord&logo=discord&logoColor=%237289da)][Discord] 12 | 13 |
14 | 15 | | **Directory** | 16 | |---| 17 | | [Java Arguments][Java Arguments] | 18 | | [Large Page Files][Large Page Files] | 19 | | [Launchers][Launchers] | 20 | | [Mods][Mods] | 21 | | [RAM][RAM] | 22 | | [Spark & Observable][Spark & Observable] | 23 | 24 | [Logo]: ./assets/Minecraft%20Performance%20Guide%20-%20Logo.png 25 | [Banner]: ./assets/Minecraft%20Performance%20Guide%20-%20Banner.png 26 | 27 | [Discord]: https://discord.gg/nptv2TwaD5 28 | 29 | [Java Arguments]: ./Java%20Arguments/README.md 30 | [Large Page Files]: ./Large%20Page%20Files/README.md 31 | [Launchers]: ./Launchers/README.md 32 | [Mods]: ./Mods/README.md 33 | [RAM]: ./RAM/README.md 34 | [Spark & Observable]: ./Spark%20&%20Observable/README.md -------------------------------------------------------------------------------- /Spark & Observable/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 DataDalton 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Spark & Observable/README.md: -------------------------------------------------------------------------------- 1 | ![Minecraft Performance Guide Banner][Banner] 2 | 3 | ###### This is the RAM guide and is a part of the overarching Minecraft Performance Guide 4 | 5 |
6 | 7 | Spark 8 | ====== 9 | 10 | TODO 11 | 12 |
13 | 14 | Observable 15 | ====== 16 | 17 | TODO 18 | 19 |
20 | 21 | [Logo]: ../assets/Minecraft%20Performance%20Guide%20-%20Logo.png 22 | [Banner]: ../assets/Minecraft%20Performance%20Guide%20-%20Banner.png 23 | -------------------------------------------------------------------------------- /assets/Minecraft Performance Guide - Banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDalton/Minecraft-Performance-Guide/fe8d8fbfebe129a38a67c56d5452e871e48580bc/assets/Minecraft Performance Guide - Banner.png -------------------------------------------------------------------------------- /assets/Minecraft Performance Guide - Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataDalton/Minecraft-Performance-Guide/fe8d8fbfebe129a38a67c56d5452e871e48580bc/assets/Minecraft Performance Guide - Logo.png --------------------------------------------------------------------------------