Advertisement
keybounce

2nd beta release, memory adjusting minecraft server launch

Jan 7th, 2013
400
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/bin/bash
  2. # This line is for starting from mac os icon double click
  3. cd "$( dirname "$0" )"
  4.  
  5. # Configurables:
  6. # -d32 is for heap size up to 2.5gb.
  7. # Change to "-d64 XX:+UseCompressedOops" if you use more.
  8. # ** Mention that flag specifically, do not rely on it being autoset.
  9. # ** Known and documented JVM bug -- https://forums.oracle.com/forums/thread.jspa?messageID=10017916
  10.  
  11. # CMSInitiatingOccupancyFraction: Determine how frequently to do a full CMS
  12. # sweep. Lines like:
  13. # 1308.811: [Full GC (System) ...
  14. # indicate "CMS failure". This means a full "pause the app and full GC".
  15. # Too many: Lower the percentage.
  16. # Too low a percentage: More CMS full sweeps (looks like:)
  17. # 171.808: [GC [1 CMS-initial-mark: 212329K(367040K)] ...
  18. # and usually many, many more lines after that, ending with
  19. # 173.156: [CMS-concurrent-reset: 0.003/0.003 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
  20. # Note the time stamps between those.
  21.  
  22. # -XX:+UseAdaptiveGCBoundary -- apparently, adjust the boundary between new and tenured as needed.
  23. # Nice to see; did not know about it before.
  24.  
  25. # -XX:+CMSIncrementalMode: Tells the garbage collector to break the job into many small parts.
  26. # May result in better performance. Essential on systems with few cores.
  27.  
  28. # Memory tuning:
  29. # Command line controls total heap, and "new". "Tenured" is the difference.
  30. # Bigger "new": Less frequent collections.
  31.  
  32. # These numbers are in "Megabytes", the java "m" suffix.
  33.  
  34. # The rule of memory tuning:
  35. # SurvivorSpace * (SurvivorRatio + 2) = New
  36. # ("SurvivorSpace" is twice the actual surviving threshold.)
  37. # SurvivorSpace * SurvivorRatio = Eden.
  38. # Two additional survivor spaces are used to copy surviving objects across minor collections.
  39.  
  40. # MAX: Maximum heap space used.
  41. # Does not include permanent (byte/compiled code)
  42. # Does not include JVM overhead
  43. MAX=800
  44.  
  45. # Tenured: Desired long-term storage space
  46. # Will vary based on mods, and "loaded chunks"
  47. # -- how many parties of players close to each other.
  48. #
  49. # Starting assumption: 250 for 1 person, plus 50 per group
  50. # of players near each other.
  51. #
  52. # That is a guess. Please report what numbers work for your server.
  53. Tenured=350
  54.  
  55. # Most important tuning number. Survivor.
  56. # Making this higher: Fewer full collections, but more wasted space.
  57. # During startup, expect this to overflow frequently.
  58. # Dynamic maps wants this at least 100, preferrably 125.
  59. # Actual space allocated is 2 spaces, each one twice this size.
  60. # "waste/overhead" will be two about to three times this number.
  61. # *** Maximum of 1/6rd of "new"
  62. # Pay attention to the tenuring distribution logs.
  63. # *** This should be enough for generation 3 95%+ of the time. ***
  64. # ** TOO SMALL WILL KILL YOUR GARBAGE COLLECTION **
  65. # ** TOO BIG WILL WASTE SPACE **
  66. SurvivorCopySize=12
  67.  
  68. ## Notes on "SurvivorCopySize":
  69. # Flying around in creative mode, in already generated chunks will want
  70. #   at least 30-35, preferrably 40 meg.
  71. # Standing around, single player, can be happy with less than 1.
  72. # Even in Mystcraft, with massive amounts of decay everywhere, 95% of the time 1 meg suffices.
  73. # Moving around a little, doing basic building/digging, about 3.
  74. #
  75. # The rule: You want to see "new threshold 4 (max 4)" most of the time.
  76. # The total value at age three --
  77. # - age   3:      36712 bytes,    5897520 total
  78. # should be less than this 95% of the time.
  79. # 12 meg is more than enough for one person with EBXL, Mystcraft, Twilight Forest,
  80. # and Custom Ore Gen. Even in EBXL's extreme jungle with Mystcraft's decay littering the ground.
  81. #
  82. # The single biggest factor is chunks loaded; that will depend more on parties than on players,
  83. # and the speed at which they move. Adjust to your server, and your mods.
  84. #
  85. # Single player won't need that much. Really.
  86.  
  87. # Second most important tuning. Eden.
  88. # Making this bigger means less frequent small collections.
  89. # General rule: Make this as big as your memory can handle.
  90. # Must be at least 2x SurvivorCopySize. Java requires it to be
  91. # an integer multiple of that value.
  92.  
  93. desiredEden=100
  94.  
  95. # Summary: Approximately desiredEden, plus 4 times SurvivorCopySpace,
  96. # plus 100, will be used by java to start the heap. Up to a max of MAX.
  97. # Script will attempt to ensure at least Tenured space exist;
  98. # should exit with a message if it cannot.
  99. #
  100. # In theory, Java will allocate extra space to new or tenured as needed.
  101. # In practice, I've never seen it increase "new".
  102. # ** Update! Just found a config flag conflict, and updated.
  103. # I suspect I've now gotten it to increase "new" as demand goes up.
  104. #
  105. # See the bottom of the config section for more.
  106.  
  107. # If your shell cannot do math, replace these with an appropriate constant
  108.  
  109. MaxNew=$(($MAX - $Tenured))
  110.  
  111. Survivor=$((2 * $SurvivorCopySize))
  112.  
  113. sanityTest=$((3 * $Survivor))
  114. if [ $sanityTest -gt $MaxNew ]
  115. then
  116.     echo Memory config error >& 2
  117.     exit 1
  118. fi
  119.  
  120. # We cannot use more than MaxNew.
  121.  
  122. # The idea:
  123. # 1. Find the multiple of Survivor that is bigger than S and less than MN.
  124. # 2. Determine survivor ratio from that. Subtract 2 (java.)
  125. # 3. Specify -Xmn for new, and survivor ratio, to set eden and new.
  126.  
  127. # "New" will be Eden plus 2* Survivor.
  128.  
  129. MaxRatio=$(($MaxNew / $Survivor - 2 ))
  130. desiredRatio=$(($desiredEden / $Survivor))
  131.  
  132. # SurvivorSpace * (SurvivorRatio + 2) = New
  133.  
  134. desiredNew=$(($Survivor * ($desiredRatio + 2) ))
  135. biggerNew=$(($Survivor * ($MaxRatio + 2) ))
  136.  
  137. echo Debug: Max ratio $MaxRatio, desiredRatio $desiredRatio, Max new $MaxNew
  138. echo Debug: desired eden $desiredEden, survivor $Survivor
  139. echo Debug: desiredNew: $desiredNew, bigger new: $biggerNew. Compare to eden/max.
  140.  
  141. # desiredNew: Gives an eden up to, not bigger, than desiredEden.
  142. # biggerNew: Gives an eden at least as big as desiredEden.
  143. # FIXME: DesiredNew / ratio should be smallest at least as big as desiredEden
  144. # This means, if less, then add 1 to ratio and add to new.
  145. #
  146. # "Bigger" assigns ALL non-tenured memory to new.
  147.  
  148. # Q: Desired numbers? Bigger/Max numbers?
  149.  
  150. # Choose one of these pairs
  151.  
  152. # New space is small -- specified eden.
  153. NEW=$desiredNew
  154. RATIO=$desiredRatio
  155.  
  156. # Tenured is small -- specified tenured space.
  157. ## Should Not Be Needed -- "NewSize" and "MaxNewSize" specified separately.
  158. # In theory, Java should now adjust new as neeed.
  159. #NEW=$biggerNew
  160. #RATIO=$MaxRatio
  161.  
  162. START=$(($NEW + 50))
  163.  
  164. ## TESTME: Does "MaxNewSize" matter if we have adaptive GC boundary? Does it hurt?
  165.  
  166. exec java \
  167.     -d32 -server \
  168.     -Xms${START}m -Xmx${MAX}m \
  169.     -XX:NewSize=${NEW}m -XX:MaxNewSize=${MaxNew}m \
  170.     -XX:+UseAdaptiveGCBoundary \
  171.     -XX:SurvivorRatio=$RATIO \
  172.     -XX:CompileThreshold=3000 \
  173.         -XX:CMSInitiatingOccupancyFraction=95 \
  174. \
  175.         -XX:MaxPermSize=150m \
  176.     -XX:+UseConcMarkSweepGC -XX:+UseParNewGC \
  177.     -XX:MaxHeapFreeRatio=20 \
  178.     -XX:MinHeapFreeRatio=12 \
  179.     -XX:MaxTenuringThreshold=4 \
  180.     -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution \
  181.     -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -Xloggc:GC.log \
  182.     -jar new_server.jar nogui
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement