Skip to content

Commit 5d369a8

Browse files
author
Glyn Normington
committed
Plumb memory heuristics into OpenJdk
Promote TokenizedVersion to be a top-level class. Use TokenizedVersion to test the JRE version number in OpenJdk. Modify the OpenJdk class to use the appropriate memory heuristic based on the JRE version. Move the memory heuristics classes into the JavaBuildpack::Jre module. Fix up various tests to set $MEMORY_LIMIT as this is needed by the memory heuristics. Change the configured memory heuristic weightings to more reasonable values: heap = 0.75, permgen/metaspace = 0.1, stack = 0.05, native = 0.05. Add test for OpenJdk metaspace. [#49694523]
1 parent 2912b6d commit 5d369a8

22 files changed

Lines changed: 424 additions & 307 deletions

config/memory_heuristics_openjdk.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
# Each weighting is a positive decimal fraction less than 1 and is used to indicate the relative amount of memory that
1919
# should be allotted to the corresponding memory category. The sum of the weightings must not exceed 1.
2020
---
21-
heap: 0.5
22-
metaspace: 0.3
23-
stack: 0.1
21+
heap: 0.75
22+
metaspace: 0.1
23+
stack: 0.05
2424
native: 0.1

config/memory_heuristics_openjdk_pre8.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
# Each weighting is a decimal fraction between 0 and 1 and is used, except in the case of 'native', to calculate the
1919
# corresponding default memory size. The sum of the weightings must not exceed 1.
2020
---
21-
heap: 0.5
22-
permgen: 0.3
23-
stack: 0.1
21+
heap: 0.75
22+
permgen: 0.1
23+
stack: 0.05
2424
native: 0.1

lib/java_buildpack/jre/memory/memory_bucket.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
require 'java_buildpack/jre/memory/memory_size'
1717

18-
module JavaBuildpack
18+
module JavaBuildpack::Jre
1919

2020
# A MemoryBucket is used to calculate default sizes for various type of memory
2121
class MemoryBucket

lib/java_buildpack/jre/memory/memory_heuristics_openjdk.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
require 'java_buildpack/jre/memory/stack_memory_bucket'
1818
require 'java_buildpack/jre/memory/weight_balancing_memory_heuristic'
1919

20-
module JavaBuildpack
20+
module JavaBuildpack::Jre
2121

2222
# A utility for defaulting Java memory settings.
2323
class MemoryHeuristicsOpenJDK

lib/java_buildpack/jre/memory/memory_heuristics_openjdk_pre8.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
require 'java_buildpack/jre/memory/stack_memory_bucket'
1818
require 'java_buildpack/jre/memory/weight_balancing_memory_heuristic'
1919

20-
module JavaBuildpack
20+
module JavaBuildpack::Jre
2121

2222
# A utility for defaulting Java memory settings.
2323
class MemoryHeuristicsOpenJDKPre8

lib/java_buildpack/jre/memory/memory_limit.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
require 'java_buildpack/jre/memory/memory_size'
1717

18-
module JavaBuildpack
18+
module JavaBuildpack::Jre
1919

2020
# A utility for handling Java memory settings.
2121
class MemoryLimit

lib/java_buildpack/jre/memory/memory_size.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515

16-
module JavaBuildpack
16+
module JavaBuildpack::Jre
1717

1818
class MemorySize
1919
include Comparable

lib/java_buildpack/jre/memory/stack_memory_bucket.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
require 'java_buildpack/jre/memory/memory_bucket'
1717
require 'java_buildpack/jre/memory/memory_size'
1818

19-
module JavaBuildpack
19+
module JavaBuildpack::Jre
2020

2121
class StackMemoryBucket < MemoryBucket
2222

lib/java_buildpack/jre/memory/weight_balancing_memory_heuristic.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
require 'java_buildpack/jre/memory/memory_bucket'
1919
require 'java_buildpack/jre/memory/stack_memory_bucket'
2020

21-
module JavaBuildpack
21+
module JavaBuildpack::Jre
2222

2323
# A utility for defaulting Java memory settings.
2424
class WeightBalancingMemoryHeuristic

lib/java_buildpack/jre/openjdk.rb

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515

1616
require 'java_buildpack/jre'
1717
require 'java_buildpack/jre/details'
18+
require 'java_buildpack/jre/memory/memory_heuristics_openjdk_pre8'
19+
require 'java_buildpack/jre/memory/memory_heuristics_openjdk'
20+
require 'java_buildpack/jre/tokenized_version'
1821
require 'java_buildpack/util/application_cache'
1922
require 'java_buildpack/util/format_duration'
2023

@@ -41,13 +44,15 @@ def initialize(context = {})
4144
#
4245
# @return [String, nil] returns +jre-<vendor>-<version>+.
4346
def detect
47+
memory_sizes # drive out errors early
4448
id @details
4549
end
4650

4751
# Downloads and unpacks a JRE
4852
#
4953
# @return [void]
5054
def compile
55+
memory_sizes # drive out errors early
5156
application_cache = JavaBuildpack::Util::ApplicationCache.new
5257

5358
download_start_time = Time.now
@@ -63,9 +68,9 @@ def compile
6368
#
6469
# @return [void]
6570
def release
66-
@java_opts << resolve_heap_size
67-
@java_opts << resolve_permgen_size
68-
@java_opts << resolve_stack_size
71+
memory_sizes.each do |memory_size|
72+
@java_opts << memory_size
73+
end
6974
end
7075

7176
private
@@ -76,6 +81,8 @@ def release
7681

7782
PERMGEN_SIZE = 'java.permgen.size'.freeze
7883

84+
METASPACE_SIZE = 'java.metaspace.size'.freeze
85+
7986
STACK_SIZE = 'java.stack.size'.freeze
8087

8188
def expand(file)
@@ -94,22 +101,30 @@ def id(details)
94101
"jre-#{details.vendor}-#{details.version}"
95102
end
96103

97-
def resolve(key, whitespace_message_pattern, value_pattern)
98-
value = @configuration[key]
99-
raise whitespace_message_pattern % value if value =~ /\s/
100-
value.nil? ? nil : value_pattern % value
101-
end
102-
103-
def resolve_heap_size
104-
resolve HEAP_SIZE, 'Invalid heap size \'%s\': embedded whitespace', '-Xmx%s'
105-
end
106-
107-
def resolve_permgen_size
108-
resolve PERMGEN_SIZE, 'Invalid PermGen size \'%s\': embedded whitespace', '-XX:MaxPermSize=%s'
109-
end
104+
def memory_sizes
105+
java_options = []
106+
107+
if TokenizedVersion.new(@details.version) < TokenizedVersion.new("1.8")
108+
specified_memory_sizes = {}
109+
specified_memory_sizes['heap'] = @configuration[HEAP_SIZE]
110+
specified_memory_sizes['permgen'] = @configuration[PERMGEN_SIZE]
111+
specified_memory_sizes['stack'] = @configuration[STACK_SIZE]
112+
mh = MemoryHeuristicsOpenJDKPre8.new(specified_memory_sizes)
113+
java_options << "-Xmx#{mh.heap}"
114+
java_options << "-XX:MaxPermSize=#{mh.permgen}"
115+
java_options << "-Xss#{mh.stack}"
116+
else
117+
specified_memory_sizes = {}
118+
specified_memory_sizes['heap'] = @configuration[HEAP_SIZE]
119+
specified_memory_sizes['metaspace'] = @configuration[METASPACE_SIZE]
120+
specified_memory_sizes['stack'] = @configuration[STACK_SIZE]
121+
mh = MemoryHeuristicsOpenJDK.new(specified_memory_sizes)
122+
java_options << "-Xmx#{mh.heap}"
123+
java_options << "-XX:MaxMetaspaceSize=#{mh.metaspace}"
124+
java_options << "-Xss#{mh.stack}"
125+
end
110126

111-
def resolve_stack_size
112-
resolve STACK_SIZE, 'Invalid stack size \'%s\': embedded whitespace', '-Xss%s'
127+
java_options
113128
end
114129

115130
end

0 commit comments

Comments
 (0)