Skip to content

Instantly share code, notes, and snippets.

@buzztaiki
Created October 11, 2012 19:50
Show Gist options
  • Select an option

  • Save buzztaiki/3875057 to your computer and use it in GitHub Desktop.

Select an option

Save buzztaiki/3875057 to your computer and use it in GitHub Desktop.
コンカレントGCのときのヒープサイズ
require 'open3'
require 'terminal-table'
def run_java(*args, &block)
o, e, s = Open3.capture3('java', *args)
o.each_line(&block)
end
def totals(*args)
java_args = ['-server', '-XX:+PrintGCDetails', args, '-version'].flatten
run_java(*java_args)
.select {|line| /\btotal\b/ =~ line}
.map {|line| line.chomp.sub(/,.*/, '').sub('total', ',').split(/,/).map(&:strip)}
end
def heaps(totals)
new, old = totals.map {|(n, v)| v[0..-2].to_i}
ratio = old.to_f/new
[new, old, ratio]
end
def show_heaps(*data)
table = Terminal::Table.new(
:headings => ['Options', 'New', 'Old', 'New/Old'],
:rows => data.map {|d| [d.join(' ')] + heaps(totals(d))})
puts table
end
show_heaps(
%w[-Xms1000M -Xmx1000M],
%w[-Xms1000M -Xmx1000M -XX:+UseConcMarkSweepGC],
%w[-Xms4000M -Xmx4000M],
%w[-Xms4000M -Xmx4000M -XX:+UseConcMarkSweepGC],
%w[-Xms4000M -Xmx4000M -XX:NewRatio=2],
%w[-Xms4000M -Xmx4000M -XX:NewRatio=2 -XX:+UseConcMarkSweepGC],
)
show_heaps(
*(10..40).step(5).map{|n|
%W[-Xms#{n}00M -Xmx#{n}00M -XX:+UseConcMarkSweepGC]
})
@buzztaiki
Copy link
Copy Markdown
Author

コンカレントGCだとNew領域に制限があるっぽく見える:

% ruby java_heap_size.rb  
+------------------------------------------------------------+---------+---------+--------------------+
| Options                                                    | New     | Old     | New/Old            |
+------------------------------------------------------------+---------+---------+--------------------+
| -Xms1000M -Xmx1000M                                        | 298688  | 682688  | 2.28562245553889   |
| -Xms1000M -Xmx1000M -XX:+UseConcMarkSweepGC                | 307200  | 682688  | 2.2222916666666666 |
| -Xms4000M -Xmx4000M                                        | 1194688 | 2730688 | 2.2856913269405905 |
| -Xms4000M -Xmx4000M -XX:+UseConcMarkSweepGC                | 613440  | 3414464 | 5.566092853416797  |
| -Xms4000M -Xmx4000M -XX:NewRatio=2                         | 1194688 | 2730688 | 2.2856913269405905 |
| -Xms4000M -Xmx4000M -XX:NewRatio=2 -XX:+UseConcMarkSweepGC | 1228800 | 2730688 | 2.2222395833333333 |
+------------------------------------------------------------+---------+---------+--------------------+
+---------------------------------------------+--------+---------+--------------------+
| Options                                     | New    | Old     | New/Old            |
+---------------------------------------------+--------+---------+--------------------+
| -Xms1000M -Xmx1000M -XX:+UseConcMarkSweepGC | 307200 | 682688  | 2.2222916666666666 |
| -Xms1500M -Xmx1500M -XX:+UseConcMarkSweepGC | 460800 | 1024000 | 2.2222222222222223 |
| -Xms2000M -Xmx2000M -XX:+UseConcMarkSweepGC | 613440 | 1366464 | 2.2275430359937403 |
| -Xms2500M -Xmx2500M -XX:+UseConcMarkSweepGC | 613440 | 1878464 | 3.0621804903495042 |
| -Xms3000M -Xmx3000M -XX:+UseConcMarkSweepGC | 613440 | 2390464 | 3.8968179447052687 |
| -Xms3500M -Xmx3500M -XX:+UseConcMarkSweepGC | 613440 | 2902464 | 4.731455399061033  |
| -Xms4000M -Xmx4000M -XX:+UseConcMarkSweepGC | 613440 | 3414464 | 5.566092853416797  |
+---------------------------------------------+--------+---------+--------------------+

@buzztaiki
Copy link
Copy Markdown
Author

コンカレントGCで、NewRatioを指定しない場合、MaxNewSizeが暗黙で設定される。これのせいでNew領域に制限がついてる。NewRatioを明示するとMaxNewSizeの暗黙の指定がなくなる。これは仕様なのかバグなのか。どっちなんだろう。

コンカレントGC指定なし、NewRatio指定なし:

% java -server -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -Xms4000M -Xmx4000M -version 2> /dev/null | head -n 1 
-XX:InitialHeapSize=4194304000 -XX:MaxHeapSize=4194304000 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:+UseParallelGC 

コンカレントGC指定あり、NewRatio指定なし:

% java -server -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -Xms4000M -Xmx4000M -XX:+UseConcMarkSweepGC -version 2> /dev/null | head -n 1
-XX:InitialHeapSize=4194304000 -XX:MaxHeapSize=4194304000 -XX:MaxNewSize=697933824 -XX:MaxTenuringThreshold=6 -XX:NewSize=697933824 -XX:OldPLABSize=16 -XX:OldSize=1395867648 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:+UseParNewGC 

コンカレントGC指定あり、NewRatio指定あり:

% java -server -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -Xms4000M -Xmx4000M -XX:+UseConcMarkSweepGC -XX:NewRatio=2 -version 2> /dev/null | head -n 1
-XX:InitialHeapSize=4194304000 -XX:MaxHeapSize=4194304000 -XX:MaxTenuringThreshold=6 -XX:NewRatio=2 -XX:OldPLABSize=16 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:+UseParNewGC 

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment