Skip to content

Commit 7339cf8

Browse files
author
Jean Christophe Beyler
committed
8247615: Initialize the bytes left for the heap sampler
Initialize the heap sampler correctly before usage Reviewed-by: sspitsyn, martin, manc
1 parent 2f6afe5 commit 7339cf8

3 files changed

Lines changed: 79 additions & 2 deletions

File tree

src/hotspot/share/gc/shared/threadLocalAllocBuffer.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,8 @@ class ThreadLocalAllocBuffer: public CHeapObj<mtThread> {
111111
int slow_allocations() const { return _slow_allocations; }
112112

113113
public:
114-
ThreadLocalAllocBuffer() : _allocated_before_last_gc(0), _allocation_fraction(TLABAllocationWeight) {
114+
ThreadLocalAllocBuffer() : _allocated_before_last_gc(0), _bytes_since_last_sample_point(0),
115+
_allocation_fraction(TLABAllocationWeight) {
115116
// do nothing. tlabs must be inited by initialize() calls
116117
}
117118

src/hotspot/share/runtime/threadHeapSampler.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,14 @@ class ThreadHeapSampler {
5050
uint64_t next_random(uint64_t rnd);
5151

5252
public:
53-
ThreadHeapSampler() : _bytes_until_sample(0) {
53+
ThreadHeapSampler() {
5454
_rnd = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(this));
5555
if (_rnd == 0) {
5656
_rnd = 1;
5757
}
58+
59+
// Call this after _rnd is initialized to initialize _bytes_until_sample.
60+
pick_next_sample();
5861
}
5962

6063
size_t bytes_until_sample() { return _bytes_until_sample; }
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
/*
2+
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
3+
* Copyright (c) 2020, Google and/or its affiliates. All rights reserved.
4+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5+
*
6+
* This code is free software; you can redistribute it and/or modify it
7+
* under the terms of the GNU General Public License version 2 only, as
8+
* published by the Free Software Foundation.
9+
*
10+
* This code is distributed in the hope that it will be useful, but WITHOUT
11+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13+
* version 2 for more details (a copy is included in the LICENSE file that
14+
* accompanied this code).
15+
*
16+
* You should have received a copy of the GNU General Public License version
17+
* 2 along with this work; if not, write to the Free Software Foundation,
18+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19+
*
20+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21+
* or visit www.oracle.com if you need additional information or have any
22+
* questions.
23+
*/
24+
25+
package MyPackage;
26+
27+
/**
28+
* @test
29+
* @summary Verifies the JVMTI Heap Monitor does not always sample the first object.
30+
* @build Frame HeapMonitor
31+
* @compile HeapMonitorInitialAllocationTest.java
32+
* @run main/othervm/native -agentlib:HeapMonitorTest MyPackage.HeapMonitorInitialAllocationTest
33+
*/
34+
public class HeapMonitorInitialAllocationTest {
35+
public static void main(String[] args) throws Exception {
36+
final int numThreads = 500;
37+
38+
// Allocate the threads first to not risk sampling.
39+
Thread threads[] = new Thread[numThreads];
40+
for (int i = 0; i < numThreads ; i++) {
41+
threads[i] = new Thread(new Task(), "Task " + i);
42+
}
43+
44+
HeapMonitor.setSamplingInterval(1024 * 1024);
45+
HeapMonitor.enableSamplingEvents();
46+
47+
for (int i = 0; i < numThreads ; i++) {
48+
threads[i].start();
49+
}
50+
51+
for (int i = 0; i < numThreads ; i++) {
52+
threads[i].join();
53+
}
54+
55+
HeapMonitor.disableSamplingEvents();
56+
57+
int sampledEvents = HeapMonitor.sampledEvents();
58+
if (sampledEvents > numThreads / 2) {
59+
throw new RuntimeException(
60+
"Sampling the initial allocation too many times: " + sampledEvents);
61+
}
62+
}
63+
64+
private static class Task implements Runnable {
65+
@Override
66+
public void run() {
67+
new EmptyObject();
68+
}
69+
}
70+
71+
private static class EmptyObject {
72+
}
73+
}

0 commit comments

Comments
 (0)