jvmargs 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/jvmargs.rb +12 -0
- data/lib/jvmargs/args.rb +117 -0
- data/lib/jvmargs/directive.rb +29 -0
- data/lib/jvmargs/heaprules.rb +32 -0
- data/lib/jvmargs/nonstandard.rb +24 -0
- data/lib/jvmargs/rules.rb +51 -0
- data/lib/jvmargs/standard.rb +22 -0
- data/lib/jvmargs/unstable.rb +30 -0
- data/lib/jvmargs/util.rb +43 -0
- data/lib/jvmargs/version.rb +4 -0
- metadata +120 -0
data/lib/jvmargs.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
|
2
|
+
require 'jvmargs/args'
|
3
|
+
require 'jvmargs/directive'
|
4
|
+
require 'jvmargs/standard'
|
5
|
+
require 'jvmargs/nonstandard'
|
6
|
+
require 'jvmargs/unstable'
|
7
|
+
require 'jvmargs/rules'
|
8
|
+
require 'jvmargs/util'
|
9
|
+
|
10
|
+
module JVMArgs
|
11
|
+
Types = [:directive, :nonstandard, :standard, :unstable ]
|
12
|
+
end
|
data/lib/jvmargs/args.rb
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
module JVMArgs
|
2
|
+
class Args
|
3
|
+
|
4
|
+
def initialize(*initial_args,&block)
|
5
|
+
@args = Hash.new
|
6
|
+
@rules = JVMArgs::Rules.new
|
7
|
+
Types.each {|type| @args[type] = Hash.new }
|
8
|
+
server_arg = JVMArgs::Standard.new("-server")
|
9
|
+
@args[:standard][server_arg.key] = server_arg
|
10
|
+
set_default_heap_size
|
11
|
+
# in case user passed in an array
|
12
|
+
initial_args.flatten!
|
13
|
+
parse_args(initial_args) unless initial_args.empty?
|
14
|
+
self.instance_exec &block if block
|
15
|
+
end
|
16
|
+
|
17
|
+
def [](key)
|
18
|
+
@args[key]
|
19
|
+
end
|
20
|
+
|
21
|
+
def add(*args)
|
22
|
+
args.flatten!
|
23
|
+
parse_args(args)
|
24
|
+
end
|
25
|
+
|
26
|
+
def process_rules
|
27
|
+
@rules.rules.each do |rule|
|
28
|
+
@rules.send(rule, @args)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def parse_args(args)
|
33
|
+
args.each do |arg|
|
34
|
+
type = nil
|
35
|
+
jvm_arg = case arg
|
36
|
+
when /^-?XX.*/
|
37
|
+
type = :unstable
|
38
|
+
JVMArgs::Unstable.new(arg)
|
39
|
+
when /^-?X.*/
|
40
|
+
type = :nonstandard
|
41
|
+
JVMArgs::NonStandard.new(arg)
|
42
|
+
when /^-?D.*/
|
43
|
+
type = :directive
|
44
|
+
JVMArgs::Directive.new(arg)
|
45
|
+
else
|
46
|
+
type = :standard
|
47
|
+
JVMArgs::Standard.new(arg)
|
48
|
+
end
|
49
|
+
@args[type][jvm_arg.key] = jvm_arg
|
50
|
+
end
|
51
|
+
process_rules
|
52
|
+
end
|
53
|
+
|
54
|
+
def set_default_heap_size
|
55
|
+
if defined? node
|
56
|
+
total_ram = node['memory']['total'].sub(/kB/, '')
|
57
|
+
else
|
58
|
+
total_ram = (JVMArgs::Util.get_system_ram_m.sub(/M/,'').to_i * 0.4).to_i
|
59
|
+
end
|
60
|
+
@args[:nonstandard]['Xmx'] = JVMArgs::NonStandard.new("Xmx#{total_ram}M")
|
61
|
+
end
|
62
|
+
|
63
|
+
def to_s
|
64
|
+
process_rules
|
65
|
+
args_str = ""
|
66
|
+
Types.each do |type|
|
67
|
+
type_str = @args[type].map {|k,v| v.to_s }
|
68
|
+
args_str << " " + type_str.join(' ') + " "
|
69
|
+
end
|
70
|
+
args_str
|
71
|
+
end
|
72
|
+
|
73
|
+
def parse_named_args(named_args)
|
74
|
+
named_args.each do |k,v|
|
75
|
+
case k.to_sym
|
76
|
+
when :jmx
|
77
|
+
add_default_jmx
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def jmx(boolean)
|
83
|
+
if boolean
|
84
|
+
[
|
85
|
+
"-Djava.rmi.server.hostname=127.0.0.1",
|
86
|
+
"-Dcom.sun.management.jmxremote",
|
87
|
+
"-Dcom.sun.management.jmxremote",
|
88
|
+
"-Dcom.sun.management.jmxremote.port=9000",
|
89
|
+
"-Dcom.sun.management.jmxremote.authenticate=false",
|
90
|
+
"-Dcom.sun.management.jmxremote.ssl=false"
|
91
|
+
].each do |arg|
|
92
|
+
directive = JVMArgs::Directive.new arg
|
93
|
+
@args[:directive][directive.key] = directive
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def heap_size(percentage)
|
99
|
+
percentage =~ /([0-9]+)%/
|
100
|
+
percent = $1.to_i * 0.01
|
101
|
+
if percent > 1
|
102
|
+
raise ArgumentError, "heap_size percentage must be less than 100%, you provided #{$1}%"
|
103
|
+
elsif percent < 0.01
|
104
|
+
raise ArgumentError, "heap_size percentage must be between 100% - 1%, you provided #{$1}%"
|
105
|
+
end
|
106
|
+
percent_int = JVMArgs::Util.get_system_ram_m.sub(/M/,'').to_i
|
107
|
+
percentage_ram = (percent_int * percent).to_i
|
108
|
+
@args[:nonstandard]["Xmx"] = JVMArgs::NonStandard.new("-Xmx#{percentage_ram}M")
|
109
|
+
@args[:nonstandard]["Xms"] = JVMArgs::NonStandard.new("-Xms#{percentage_ram}M")
|
110
|
+
end
|
111
|
+
|
112
|
+
def add_rule(rule_name, &block)
|
113
|
+
@rules.add(rule_name, block)
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module JVMArgs
|
2
|
+
|
3
|
+
class Directive
|
4
|
+
|
5
|
+
attr_accessor :key, :value
|
6
|
+
|
7
|
+
def initialize(arg)
|
8
|
+
arg.sub!(/^-?D?/, '')
|
9
|
+
|
10
|
+
if arg =~ /(.*?)=(.*)/
|
11
|
+
@key = $1
|
12
|
+
@value = $2
|
13
|
+
else
|
14
|
+
@key = arg
|
15
|
+
@value = true
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_s
|
20
|
+
if @value == true
|
21
|
+
"-D#{@key}"
|
22
|
+
else
|
23
|
+
"-D#{@key}=#{@value}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module JVMArgs
|
2
|
+
module Rules
|
3
|
+
|
4
|
+
def self.heap_too_big(key="Xmx",args)
|
5
|
+
total_ram = JVMArgs::Util.get_raw_num(JVMArgs::Util.get_system_ram_m)
|
6
|
+
new_ram = JVMArgs::Util.get_raw_num(args[:nonstandard][key].value)
|
7
|
+
if new_ram > total_ram
|
8
|
+
raise ArgumentError, "You can't set #{key} to larger than the available system RAM of #{total_ram}"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.max_smaller_than_min(key="Xmx",args)
|
13
|
+
if args[:nonstandard]["Xms"].nil?
|
14
|
+
return
|
15
|
+
else
|
16
|
+
max_heap = JVMArgs::Util.get_raw_num(args[:nonstandard]["Xmx"].value)
|
17
|
+
min_heap = JVMArgs::Util.get_raw_num(args[:nonstandard]["Xms"].value)
|
18
|
+
if max_heap < min_heap
|
19
|
+
raise ArgumentError, "Max heap size #{max_heap}M cannot be smaller than Minimum heap size #{min_heap}M"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# HeapRules = [
|
28
|
+
# method(:heap_too_big).to_proc,
|
29
|
+
# method(:max_smaller_than_min).to_proc
|
30
|
+
# ]
|
31
|
+
|
32
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module JVMArgs
|
2
|
+
class NonStandard
|
3
|
+
attr_accessor :key, :value
|
4
|
+
|
5
|
+
def initialize(arg)
|
6
|
+
arg.sub!(/^-/, '')
|
7
|
+
arg =~ /(X[a-z]+)([0-9]+[a-zA-Z])?/
|
8
|
+
@key = $1
|
9
|
+
if $2.nil?
|
10
|
+
@value = true
|
11
|
+
else
|
12
|
+
@value = JVMArgs::Util.convert_to_m($2)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
if @value == true
|
18
|
+
"-#{@key}"
|
19
|
+
else
|
20
|
+
"-#{@key}#{@value}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module JVMArgs
|
2
|
+
class Rules
|
3
|
+
|
4
|
+
def initialize(*args)
|
5
|
+
@rules = []
|
6
|
+
end
|
7
|
+
|
8
|
+
def each
|
9
|
+
@rules.each do |rule|
|
10
|
+
yield(rule)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def add(rule_name, block)
|
15
|
+
new_rule_name = "rule_#{rule_name.to_s}".to_sym
|
16
|
+
JVMArgs::Rules.define_method(new_rule_name) {|args| block.call(args) }
|
17
|
+
end
|
18
|
+
|
19
|
+
def rules
|
20
|
+
JVMArgs::Rules.public_instance_methods(false).select {|rule| rule.to_s =~ /^rule_.*/ }
|
21
|
+
end
|
22
|
+
|
23
|
+
def [](index)
|
24
|
+
@rules[index]
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
def rule_heap_too_big(key="Xmx",args)
|
29
|
+
total_ram = JVMArgs::Util.get_raw_num(JVMArgs::Util.get_system_ram_m)
|
30
|
+
new_ram = JVMArgs::Util.get_raw_num(args[:nonstandard][key].value)
|
31
|
+
if new_ram > total_ram
|
32
|
+
raise ArgumentError, "You can't set #{key} to larger than the available system RAM of #{total_ram}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def rule_max_smaller_than_min(key="Xmx",args)
|
37
|
+
if args[:nonstandard]["Xms"].nil?
|
38
|
+
return
|
39
|
+
else
|
40
|
+
max_heap = JVMArgs::Util.get_raw_num(args[:nonstandard]["Xmx"].value)
|
41
|
+
min_heap = JVMArgs::Util.get_raw_num(args[:nonstandard]["Xms"].value)
|
42
|
+
if max_heap < min_heap
|
43
|
+
raise ArgumentError, "Max heap size #{max_heap}M cannot be smaller than Minimum heap size #{min_heap}M"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module JVMArgs
|
2
|
+
class Unstable
|
3
|
+
|
4
|
+
attr_accessor :key, :value
|
5
|
+
|
6
|
+
def initialize(arg)
|
7
|
+
arg.sub!(/^-?XX:/, '')
|
8
|
+
# check it if a boolean option
|
9
|
+
arg =~ /(\+|-)(.*)/
|
10
|
+
if !$1.nil?
|
11
|
+
@key = $2
|
12
|
+
@value = $1 == '+' ? true : false
|
13
|
+
else
|
14
|
+
arg =~ /(.*)=(.*)/
|
15
|
+
@key = $1
|
16
|
+
@value = $2
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_s
|
21
|
+
if @value.class == TrueClass or @value.class == FalseClass
|
22
|
+
symbol = @value ? '+' : '-'
|
23
|
+
"-XX:#{symbol}#{@key}"
|
24
|
+
else
|
25
|
+
"-XX:#{@key}=#{@value}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
data/lib/jvmargs/util.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
module JVMArgs
|
2
|
+
module Util
|
3
|
+
|
4
|
+
|
5
|
+
def self.get_system_ram_m
|
6
|
+
if defined? node
|
7
|
+
total_ram = node['memory']['total']
|
8
|
+
else
|
9
|
+
require 'ohai'
|
10
|
+
ohai = Ohai::System.new
|
11
|
+
ohai.require_plugin "linux::memory"
|
12
|
+
total_ram = ohai["memory"]["total"]
|
13
|
+
end
|
14
|
+
self.convert_to_m(total_ram)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.get_raw_num(number)
|
18
|
+
number.sub(/M/, '').to_i
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.convert_to_m(number)
|
22
|
+
raw_num, unit = self.normalize_units(number)
|
23
|
+
case unit
|
24
|
+
when "K"
|
25
|
+
converted_num = (raw_num/1024).to_int
|
26
|
+
when "G"
|
27
|
+
converted_num = (raw_num * 1024).to_int
|
28
|
+
when "M"
|
29
|
+
converted_num = raw_num
|
30
|
+
end
|
31
|
+
"#{converted_num}M"
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.normalize_units(number)
|
35
|
+
number =~ /^([0-9]+)\s*([kKmMgG])[bB]?/
|
36
|
+
if $2.nil?
|
37
|
+
raise ArgumentError, "You must indicate whether number is KiloBytes(K), MegaBytes (M), or Gigabytes(G)"
|
38
|
+
end
|
39
|
+
[$1.to_i, $2.upcase]
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
metadata
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jvmargs
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Bryan W. Berry
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-03-25 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: chef
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '10.0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '10.0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rspec
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 2.13.0
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 2.13.0
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.9.2.2
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.9.2.2
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: pry
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
description: Sanity check command-line arguments to the JVM
|
79
|
+
email:
|
80
|
+
executables: []
|
81
|
+
extensions: []
|
82
|
+
extra_rdoc_files: []
|
83
|
+
files:
|
84
|
+
- lib/jvmargs.rb
|
85
|
+
- lib/jvmargs/args.rb
|
86
|
+
- lib/jvmargs/nonstandard.rb
|
87
|
+
- lib/jvmargs/version.rb
|
88
|
+
- lib/jvmargs/rules.rb
|
89
|
+
- lib/jvmargs/util.rb
|
90
|
+
- lib/jvmargs/heaprules.rb
|
91
|
+
- lib/jvmargs/directive.rb
|
92
|
+
- lib/jvmargs/standard.rb
|
93
|
+
- lib/jvmargs/unstable.rb
|
94
|
+
homepage: https://github.com/bryanwb/jvmargs
|
95
|
+
licenses:
|
96
|
+
- Apache2
|
97
|
+
post_install_message:
|
98
|
+
rdoc_options: []
|
99
|
+
require_paths:
|
100
|
+
- lib
|
101
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
102
|
+
none: false
|
103
|
+
requirements:
|
104
|
+
- - ! '>='
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '0'
|
107
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
|
+
none: false
|
109
|
+
requirements:
|
110
|
+
- - ! '>='
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
113
|
+
requirements: []
|
114
|
+
rubyforge_project:
|
115
|
+
rubygems_version: 1.8.24
|
116
|
+
signing_key:
|
117
|
+
specification_version: 3
|
118
|
+
summary: jvmargs-0.0.2
|
119
|
+
test_files: []
|
120
|
+
has_rdoc:
|