Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
41035692
D
dragonwell8_hotspot
项目概览
openanolis
/
dragonwell8_hotspot
通知
2
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_hotspot
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
41035692
编写于
8月 05, 2013
作者:
H
hseigel
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
d58fa9c8
9806609c
变更
28
显示空白变更内容
内联
并排
Showing
28 changed file
with
734 addition
and
235 deletion
+734
-235
.hgtags
.hgtags
+4
-0
agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassDump.java
.../share/classes/sun/jvm/hotspot/tools/jcore/ClassDump.java
+17
-16
make/bsd/makefiles/minimal1.make
make/bsd/makefiles/minimal1.make
+14
-10
make/hotspot_version
make/hotspot_version
+1
-1
make/linux/makefiles/minimal1.make
make/linux/makefiles/minimal1.make
+14
-10
src/cpu/sparc/vm/c2_globals_sparc.hpp
src/cpu/sparc/vm/c2_globals_sparc.hpp
+1
-1
src/cpu/x86/vm/c2_globals_x86.hpp
src/cpu/x86/vm/c2_globals_x86.hpp
+1
-1
src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.hpp
.../gc_implementation/concurrentMarkSweep/cmsOopClosures.hpp
+16
-0
src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp
...ion/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp
+226
-49
src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp
...ion/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp
+10
-0
src/share/vm/gc_implementation/g1/g1_globals.hpp
src/share/vm/gc_implementation/g1/g1_globals.hpp
+0
-14
src/share/vm/gc_implementation/g1/heapRegion.cpp
src/share/vm/gc_implementation/g1/heapRegion.cpp
+5
-0
src/share/vm/memory/defNewGeneration.cpp
src/share/vm/memory/defNewGeneration.cpp
+10
-1
src/share/vm/memory/generation.hpp
src/share/vm/memory/generation.hpp
+1
-0
src/share/vm/memory/sharedHeap.cpp
src/share/vm/memory/sharedHeap.cpp
+2
-1
src/share/vm/runtime/arguments.cpp
src/share/vm/runtime/arguments.cpp
+4
-0
src/share/vm/runtime/globals.hpp
src/share/vm/runtime/globals.hpp
+11
-0
src/share/vm/services/gcNotifier.cpp
src/share/vm/services/gcNotifier.cpp
+4
-4
src/share/vm/services/management.cpp
src/share/vm/services/management.cpp
+5
-5
test/gc/arguments/TestG1HeapRegionSize.java
test/gc/arguments/TestG1HeapRegionSize.java
+64
-0
test/gc/g1/TestPrintRegionRememberedSetInfo.java
test/gc/g1/TestPrintRegionRememberedSetInfo.java
+1
-1
test/gc/startup_warnings/TestDefaultMaxRAMFraction.java
test/gc/startup_warnings/TestDefaultMaxRAMFraction.java
+44
-0
test/runtime/8000968/Test8000968.sh
test/runtime/8000968/Test8000968.sh
+0
-99
test/runtime/CompressedOops/CompressedKlassPointerAndOops.java
...runtime/CompressedOops/CompressedKlassPointerAndOops.java
+63
-0
test/runtime/InternalApi/ThreadCpuTimesDeadlock.java
test/runtime/InternalApi/ThreadCpuTimesDeadlock.java
+18
-4
test/testlibrary/OutputAnalyzerReportingTest.java
test/testlibrary/OutputAnalyzerReportingTest.java
+124
-0
test/testlibrary/com/oracle/java/testlibrary/OutputAnalyzer.java
...stlibrary/com/oracle/java/testlibrary/OutputAnalyzer.java
+51
-17
test/testlibrary/com/oracle/java/testlibrary/ProcessTools.java
...testlibrary/com/oracle/java/testlibrary/ProcessTools.java
+23
-1
未找到文件。
.hgtags
浏览文件 @
41035692
...
...
@@ -361,3 +361,7 @@ c9dd82da51ed34a28f7c6b3245163ee962e94572 hs25-b40
2b9946e10587f74ef75ae8145bea484df4a2738b hs25-b41
81b6cb70717c66375846b78bb174594ec3aa998e jdk8-b99
9f71e36a471ae4a668e08827d33035963ed10c08 hs25-b42
5787fac72e760c6a5fd9efa113b0c75caf554136 jdk8-b100
46487ba40ff225654d0c51787ed3839bafcbd9f3 hs25-b43
f6921c876db192bba389cec062855a66372da01c jdk8-b101
530fe88b3b2c710f42810b3580d86a0d83ad6c1c hs25-b44
agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassDump.java
浏览文件 @
41035692
/*
* Copyright (c) 2002, 201
1
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2002, 201
3
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -74,7 +74,8 @@ public class ClassDump extends Tool {
public
void
run
()
{
// Ready to go with the database...
try
{
// The name of the filter always comes from a System property.
if
(
classFilter
==
null
)
{
// If not already set, the name of the filter comes from a System property.
// If we have a pkgList, pass it, otherwise let the filter read
// its own System property for the list of classes.
String
filterClassName
=
System
.
getProperty
(
"sun.jvm.hotspot.tools.jcore.filter"
,
...
...
@@ -90,7 +91,7 @@ public class ClassDump extends Tool {
}
catch
(
Exception
exp
)
{
System
.
err
.
println
(
"Warning: Can not create class filter!"
);
}
}
String
outputDirectory
=
System
.
getProperty
(
"sun.jvm.hotspot.tools.jcore.outputDir"
,
"."
);
setOutputDirectory
(
outputDirectory
);
...
...
make/bsd/makefiles/minimal1.make
浏览文件 @
41035692
...
...
@@ -24,16 +24,20 @@
TYPE
=
MINIMAL1
INCLUDE_JVMTI
?=
false
INCLUDE_FPROF
?=
false
INCLUDE_VM_STRUCTS
?=
false
INCLUDE_JNI_CHECK
?=
false
INCLUDE_SERVICES
?=
false
INCLUDE_MANAGEMENT
?=
false
INCLUDE_ALL_GCS
?=
false
INCLUDE_NMT
?=
false
INCLUDE_TRACE
?=
false
INCLUDE_CDS
?=
false
# Force all variables to false, overriding any other
# setting that may have occurred in the makefiles. These
# can still be overridden by passing the variable as an
# argument to 'make'
INCLUDE_JVMTI
:=
false
INCLUDE_FPROF
:=
false
INCLUDE_VM_STRUCTS
:=
false
INCLUDE_JNI_CHECK
:=
false
INCLUDE_SERVICES
:=
false
INCLUDE_MANAGEMENT
:=
false
INCLUDE_ALL_GCS
:=
false
INCLUDE_NMT
:=
false
INCLUDE_TRACE
:=
false
INCLUDE_CDS
:=
false
CXXFLAGS
+=
-DMINIMAL_JVM
-DCOMPILER1
-DVMTYPE
=
\"
Minimal
\"
CFLAGS
+=
-DMINIMAL_JVM
-DCOMPILER1
-DVMTYPE
=
\"
Minimal
\"
...
...
make/hotspot_version
浏览文件 @
41035692
...
...
@@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2013
HS_MAJOR_VER=25
HS_MINOR_VER=0
HS_BUILD_NUMBER=4
3
HS_BUILD_NUMBER=4
5
JDK_MAJOR_VER=1
JDK_MINOR_VER=8
...
...
make/linux/makefiles/minimal1.make
浏览文件 @
41035692
...
...
@@ -24,16 +24,20 @@
TYPE
=
MINIMAL1
INCLUDE_JVMTI
?=
false
INCLUDE_FPROF
?=
false
INCLUDE_VM_STRUCTS
?=
false
INCLUDE_JNI_CHECK
?=
false
INCLUDE_SERVICES
?=
false
INCLUDE_MANAGEMENT
?=
false
INCLUDE_ALL_GCS
?=
false
INCLUDE_NMT
?=
false
INCLUDE_TRACE
?=
false
INCLUDE_CDS
?=
false
# Force all variables to false, overriding any other
# setting that may have occurred in the makefiles. These
# can still be overridden by passing the variable as an
# argument to 'make'
INCLUDE_JVMTI
:=
false
INCLUDE_FPROF
:=
false
INCLUDE_VM_STRUCTS
:=
false
INCLUDE_JNI_CHECK
:=
false
INCLUDE_SERVICES
:=
false
INCLUDE_MANAGEMENT
:=
false
INCLUDE_ALL_GCS
:=
false
INCLUDE_NMT
:=
false
INCLUDE_TRACE
:=
false
INCLUDE_CDS
:=
false
CXXFLAGS
+=
-DMINIMAL_JVM
-DCOMPILER1
-DVMTYPE
=
\"
Minimal
\"
CFLAGS
+=
-DMINIMAL_JVM
-DCOMPILER1
-DVMTYPE
=
\"
Minimal
\"
...
...
src/cpu/sparc/vm/c2_globals_sparc.hpp
浏览文件 @
41035692
...
...
@@ -42,7 +42,7 @@ define_pd_global(bool, ProfileInterpreter, false);
#else
define_pd_global
(
bool
,
ProfileInterpreter
,
true
);
#endif // CC_INTERP
define_pd_global
(
bool
,
TieredCompilation
,
false
);
define_pd_global
(
bool
,
TieredCompilation
,
trueInTiered
);
define_pd_global
(
intx
,
CompileThreshold
,
10000
);
define_pd_global
(
intx
,
BackEdgeThreshold
,
140000
);
...
...
src/cpu/x86/vm/c2_globals_x86.hpp
浏览文件 @
41035692
...
...
@@ -44,7 +44,7 @@ define_pd_global(bool, ProfileInterpreter, false);
#else
define_pd_global
(
bool
,
ProfileInterpreter
,
true
);
#endif // CC_INTERP
define_pd_global
(
bool
,
TieredCompilation
,
false
);
define_pd_global
(
bool
,
TieredCompilation
,
trueInTiered
);
define_pd_global
(
intx
,
CompileThreshold
,
10000
);
define_pd_global
(
intx
,
BackEdgeThreshold
,
100000
);
...
...
src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.hpp
浏览文件 @
41035692
...
...
@@ -122,6 +122,22 @@ class MarkRefsIntoClosure: public CMSOopsInGenClosure {
}
};
class
Par_MarkRefsIntoClosure
:
public
CMSOopsInGenClosure
{
private:
const
MemRegion
_span
;
CMSBitMap
*
_bitMap
;
protected:
DO_OOP_WORK_DEFN
public:
Par_MarkRefsIntoClosure
(
MemRegion
span
,
CMSBitMap
*
bitMap
);
virtual
void
do_oop
(
oop
*
p
);
virtual
void
do_oop
(
narrowOop
*
p
);
Prefetch
::
style
prefetch_style
()
{
return
Prefetch
::
do_read
;
}
};
// A variant of the above used in certain kinds of CMS
// marking verification.
class
MarkRefsIntoVerifyClosure
:
public
CMSOopsInGenClosure
{
...
...
src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp
浏览文件 @
41035692
...
...
@@ -569,6 +569,7 @@ CMSCollector::CMSCollector(ConcurrentMarkSweepGeneration* cmsGen,
_restart_addr
(
NULL
),
_overflow_list
(
NULL
),
_stats
(
cmsGen
),
_eden_chunk_lock
(
new
Mutex
(
Mutex
::
leaf
+
1
,
"CMS_eden_chunk_lock"
,
true
)),
_eden_chunk_array
(
NULL
),
// may be set in ctor body
_eden_chunk_capacity
(
0
),
// -- ditto --
_eden_chunk_index
(
0
),
// -- ditto --
...
...
@@ -732,7 +733,7 @@ CMSCollector::CMSCollector(ConcurrentMarkSweepGeneration* cmsGen,
assert
(
_eden_chunk_array
!=
NULL
||
_eden_chunk_capacity
==
0
,
"Error"
);
// Support for parallelizing survivor space rescan
if
(
CMSParallelRemarkEnabled
&&
CMSParallelSurvivorRem
arkEnabled
)
{
if
(
(
CMSParallelRemarkEnabled
&&
CMSParallelSurvivorRemarkEnabled
)
||
CMSParallelInitialM
arkEnabled
)
{
const
size_t
max_plab_samples
=
((
DefNewGeneration
*
)
_young_gen
)
->
max_survivor_size
()
/
MinTLABSize
;
...
...
@@ -2137,6 +2138,39 @@ void CMSCollector::do_mark_sweep_work(bool clear_all_soft_refs,
}
void
CMSCollector
::
print_eden_and_survivor_chunk_arrays
()
{
DefNewGeneration
*
dng
=
_young_gen
->
as_DefNewGeneration
();
EdenSpace
*
eden_space
=
dng
->
eden
();
ContiguousSpace
*
from_space
=
dng
->
from
();
ContiguousSpace
*
to_space
=
dng
->
to
();
// Eden
if
(
_eden_chunk_array
!=
NULL
)
{
gclog_or_tty
->
print_cr
(
"eden "
PTR_FORMAT
"-"
PTR_FORMAT
"-"
PTR_FORMAT
"("
SIZE_FORMAT
")"
,
eden_space
->
bottom
(),
eden_space
->
top
(),
eden_space
->
end
(),
eden_space
->
capacity
());
gclog_or_tty
->
print_cr
(
"_eden_chunk_index="
SIZE_FORMAT
", "
"_eden_chunk_capacity="
SIZE_FORMAT
,
_eden_chunk_index
,
_eden_chunk_capacity
);
for
(
size_t
i
=
0
;
i
<
_eden_chunk_index
;
i
++
)
{
gclog_or_tty
->
print_cr
(
"_eden_chunk_array["
SIZE_FORMAT
"]="
PTR_FORMAT
,
i
,
_eden_chunk_array
[
i
]);
}
}
// Survivor
if
(
_survivor_chunk_array
!=
NULL
)
{
gclog_or_tty
->
print_cr
(
"survivor "
PTR_FORMAT
"-"
PTR_FORMAT
"-"
PTR_FORMAT
"("
SIZE_FORMAT
")"
,
from_space
->
bottom
(),
from_space
->
top
(),
from_space
->
end
(),
from_space
->
capacity
());
gclog_or_tty
->
print_cr
(
"_survivor_chunk_index="
SIZE_FORMAT
", "
"_survivor_chunk_capacity="
SIZE_FORMAT
,
_survivor_chunk_index
,
_survivor_chunk_capacity
);
for
(
size_t
i
=
0
;
i
<
_survivor_chunk_index
;
i
++
)
{
gclog_or_tty
->
print_cr
(
"_survivor_chunk_array["
SIZE_FORMAT
"]="
PTR_FORMAT
,
i
,
_survivor_chunk_array
[
i
]);
}
}
}
void
CMSCollector
::
getFreelistLocks
()
const
{
// Get locks for all free lists in all generations that this
// collector is responsible for
...
...
@@ -3549,6 +3583,31 @@ CMSPhaseAccounting::~CMSPhaseAccounting() {
// CMS work
// The common parts of CMSParInitialMarkTask and CMSParRemarkTask.
class
CMSParMarkTask
:
public
AbstractGangTask
{
protected:
CMSCollector
*
_collector
;
int
_n_workers
;
CMSParMarkTask
(
const
char
*
name
,
CMSCollector
*
collector
,
int
n_workers
)
:
AbstractGangTask
(
name
),
_collector
(
collector
),
_n_workers
(
n_workers
)
{}
// Work method in support of parallel rescan ... of young gen spaces
void
do_young_space_rescan
(
uint
worker_id
,
OopsInGenClosure
*
cl
,
ContiguousSpace
*
space
,
HeapWord
**
chunk_array
,
size_t
chunk_top
);
void
work_on_young_gen_roots
(
uint
worker_id
,
OopsInGenClosure
*
cl
);
};
// Parallel initial mark task
class
CMSParInitialMarkTask
:
public
CMSParMarkTask
{
public:
CMSParInitialMarkTask
(
CMSCollector
*
collector
,
int
n_workers
)
:
CMSParMarkTask
(
"Scan roots and young gen for initial mark in parallel"
,
collector
,
n_workers
)
{}
void
work
(
uint
worker_id
);
};
// Checkpoint the roots into this generation from outside
// this generation. [Note this initial checkpoint need only
// be approximate -- we'll do a catch up phase subsequently.]
...
...
@@ -3646,9 +3705,31 @@ void CMSCollector::checkpointRootsInitialWork(bool asynch) {
// the klasses. The claimed marks need to be cleared before marking starts.
ClassLoaderDataGraph
::
clear_claimed_marks
();
CMKlassClosure
klass_closure
(
&
notOlder
);
if
(
CMSPrintEdenSurvivorChunks
)
{
print_eden_and_survivor_chunk_arrays
();
}
{
COMPILER2_PRESENT
(
DerivedPointerTableDeactivate
dpt_deact
;)
if
(
CMSParallelInitialMarkEnabled
&&
CollectedHeap
::
use_parallel_gc_threads
())
{
// The parallel version.
FlexibleWorkGang
*
workers
=
gch
->
workers
();
assert
(
workers
!=
NULL
,
"Need parallel worker threads."
);
int
n_workers
=
workers
->
active_workers
();
CMSParInitialMarkTask
tsk
(
this
,
n_workers
);
gch
->
set_par_threads
(
n_workers
);
initialize_sequential_subtasks_for_young_gen_rescan
(
n_workers
);
if
(
n_workers
>
1
)
{
GenCollectedHeap
::
StrongRootsScope
srs
(
gch
);
workers
->
run_task
(
&
tsk
);
}
else
{
GenCollectedHeap
::
StrongRootsScope
srs
(
gch
);
tsk
.
work
(
0
);
}
gch
->
set_par_threads
(
0
);
}
else
{
// The serial version.
CMKlassClosure
klass_closure
(
&
notOlder
);
gch
->
rem_set
()
->
prepare_for_younger_refs_iterate
(
false
);
// Not parallel.
gch
->
gen_process_strong_roots
(
_cmsGen
->
level
(),
true
,
// younger gens are roots
...
...
@@ -3660,6 +3741,7 @@ void CMSCollector::checkpointRootsInitialWork(bool asynch) {
NULL
,
&
klass_closure
);
}
}
// Clear mod-union table; it will be dirtied in the prologue of
// CMS generation per each younger generation collection.
...
...
@@ -4417,7 +4499,9 @@ void CMSCollector::preclean() {
verify_overflow_empty
();
_abort_preclean
=
false
;
if
(
CMSPrecleaningEnabled
)
{
if
(
!
CMSEdenChunksRecordAlways
)
{
_eden_chunk_index
=
0
;
}
size_t
used
=
get_eden_used
();
size_t
capacity
=
get_eden_capacity
();
// Don't start sampling unless we will get sufficiently
...
...
@@ -4526,7 +4610,9 @@ void CMSCollector::sample_eden() {
if
(
!
_start_sampling
)
{
return
;
}
if
(
_eden_chunk_array
)
{
// When CMSEdenChunksRecordAlways is true, the eden chunk array
// is populated by the young generation.
if
(
_eden_chunk_array
!=
NULL
&&
!
CMSEdenChunksRecordAlways
)
{
if
(
_eden_chunk_index
<
_eden_chunk_capacity
)
{
_eden_chunk_array
[
_eden_chunk_index
]
=
*
_top_addr
;
// take sample
assert
(
_eden_chunk_array
[
_eden_chunk_index
]
<=
*
_end_addr
,
...
...
@@ -5010,6 +5096,10 @@ void CMSCollector::checkpointRootsFinalWork(bool asynch,
// Update the saved marks which may affect the root scans.
gch
->
save_marks
();
if
(
CMSPrintEdenSurvivorChunks
)
{
print_eden_and_survivor_chunk_arrays
();
}
{
COMPILER2_PRESENT
(
DerivedPointerTableDeactivate
dpt_deact
;)
...
...
@@ -5116,10 +5206,53 @@ void CMSCollector::checkpointRootsFinalWork(bool asynch,
}
}
void
CMSParInitialMarkTask
::
work
(
uint
worker_id
)
{
elapsedTimer
_timer
;
ResourceMark
rm
;
HandleMark
hm
;
// ---------- scan from roots --------------
_timer
.
start
();
GenCollectedHeap
*
gch
=
GenCollectedHeap
::
heap
();
Par_MarkRefsIntoClosure
par_mri_cl
(
_collector
->
_span
,
&
(
_collector
->
_markBitMap
));
CMKlassClosure
klass_closure
(
&
par_mri_cl
);
// ---------- young gen roots --------------
{
work_on_young_gen_roots
(
worker_id
,
&
par_mri_cl
);
_timer
.
stop
();
if
(
PrintCMSStatistics
!=
0
)
{
gclog_or_tty
->
print_cr
(
"Finished young gen initial mark scan work in %dth thread: %3.3f sec"
,
worker_id
,
_timer
.
seconds
());
}
}
// ---------- remaining roots --------------
_timer
.
reset
();
_timer
.
start
();
gch
->
gen_process_strong_roots
(
_collector
->
_cmsGen
->
level
(),
false
,
// yg was scanned above
false
,
// this is parallel code
false
,
// not scavenging
SharedHeap
::
ScanningOption
(
_collector
->
CMSCollector
::
roots_scanning_options
()),
&
par_mri_cl
,
true
,
// walk all of code cache if (so & SO_CodeCache)
NULL
,
&
klass_closure
);
assert
(
_collector
->
should_unload_classes
()
||
(
_collector
->
CMSCollector
::
roots_scanning_options
()
&
SharedHeap
::
SO_CodeCache
),
"if we didn't scan the code cache, we have to be ready to drop nmethods with expired weak oops"
);
_timer
.
stop
();
if
(
PrintCMSStatistics
!=
0
)
{
gclog_or_tty
->
print_cr
(
"Finished remaining root initial mark scan work in %dth thread: %3.3f sec"
,
worker_id
,
_timer
.
seconds
());
}
}
// Parallel remark task
class
CMSParRemarkTask
:
public
AbstractGangTask
{
CMSCollector
*
_collector
;
int
_n_workers
;
class
CMSParRemarkTask
:
public
CMSParMarkTask
{
CompactibleFreeListSpace
*
_cms_space
;
// The per-thread work queues, available here for stealing.
...
...
@@ -5133,10 +5266,9 @@ class CMSParRemarkTask: public AbstractGangTask {
CompactibleFreeListSpace
*
cms_space
,
int
n_workers
,
FlexibleWorkGang
*
workers
,
OopTaskQueueSet
*
task_queues
)
:
AbstractGangTask
(
"Rescan roots and grey objects in parallel"
)
,
_collector
(
collector
),
CMSParMarkTask
(
"Rescan roots and grey objects in parallel"
,
collector
,
n_workers
),
_cms_space
(
cms_space
),
_n_workers
(
n_workers
),
_task_queues
(
task_queues
),
_term
(
n_workers
,
task_queues
)
{
}
...
...
@@ -5150,11 +5282,6 @@ class CMSParRemarkTask: public AbstractGangTask {
void
work
(
uint
worker_id
);
private:
// Work method in support of parallel rescan ... of young gen spaces
void
do_young_space_rescan
(
int
i
,
Par_MarkRefsIntoAndScanClosure
*
cl
,
ContiguousSpace
*
space
,
HeapWord
**
chunk_array
,
size_t
chunk_top
);
// ... of dirty cards in old space
void
do_dirty_card_rescan_tasks
(
CompactibleFreeListSpace
*
sp
,
int
i
,
Par_MarkRefsIntoAndScanClosure
*
cl
);
...
...
@@ -5186,6 +5313,25 @@ class RemarkKlassClosure : public KlassClosure {
}
};
void
CMSParMarkTask
::
work_on_young_gen_roots
(
uint
worker_id
,
OopsInGenClosure
*
cl
)
{
DefNewGeneration
*
dng
=
_collector
->
_young_gen
->
as_DefNewGeneration
();
EdenSpace
*
eden_space
=
dng
->
eden
();
ContiguousSpace
*
from_space
=
dng
->
from
();
ContiguousSpace
*
to_space
=
dng
->
to
();
HeapWord
**
eca
=
_collector
->
_eden_chunk_array
;
size_t
ect
=
_collector
->
_eden_chunk_index
;
HeapWord
**
sca
=
_collector
->
_survivor_chunk_array
;
size_t
sct
=
_collector
->
_survivor_chunk_index
;
assert
(
ect
<=
_collector
->
_eden_chunk_capacity
,
"out of bounds"
);
assert
(
sct
<=
_collector
->
_survivor_chunk_capacity
,
"out of bounds"
);
do_young_space_rescan
(
worker_id
,
cl
,
to_space
,
NULL
,
0
);
do_young_space_rescan
(
worker_id
,
cl
,
from_space
,
sca
,
sct
);
do_young_space_rescan
(
worker_id
,
cl
,
eden_space
,
eca
,
ect
);
}
// work_queue(i) is passed to the closure
// Par_MarkRefsIntoAndScanClosure. The "i" parameter
// also is passed to do_dirty_card_rescan_tasks() and to
...
...
@@ -5210,23 +5356,7 @@ void CMSParRemarkTask::work(uint worker_id) {
// work first.
// ---------- young gen roots --------------
{
DefNewGeneration
*
dng
=
_collector
->
_young_gen
->
as_DefNewGeneration
();
EdenSpace
*
eden_space
=
dng
->
eden
();
ContiguousSpace
*
from_space
=
dng
->
from
();
ContiguousSpace
*
to_space
=
dng
->
to
();
HeapWord
**
eca
=
_collector
->
_eden_chunk_array
;
size_t
ect
=
_collector
->
_eden_chunk_index
;
HeapWord
**
sca
=
_collector
->
_survivor_chunk_array
;
size_t
sct
=
_collector
->
_survivor_chunk_index
;
assert
(
ect
<=
_collector
->
_eden_chunk_capacity
,
"out of bounds"
);
assert
(
sct
<=
_collector
->
_survivor_chunk_capacity
,
"out of bounds"
);
do_young_space_rescan
(
worker_id
,
&
par_mrias_cl
,
to_space
,
NULL
,
0
);
do_young_space_rescan
(
worker_id
,
&
par_mrias_cl
,
from_space
,
sca
,
sct
);
do_young_space_rescan
(
worker_id
,
&
par_mrias_cl
,
eden_space
,
eca
,
ect
);
work_on_young_gen_roots
(
worker_id
,
&
par_mrias_cl
);
_timer
.
stop
();
if
(
PrintCMSStatistics
!=
0
)
{
gclog_or_tty
->
print_cr
(
...
...
@@ -5334,8 +5464,8 @@ void CMSParRemarkTask::work(uint worker_id) {
// Note that parameter "i" is not used.
void
CMSPar
RemarkTask
::
do_young_space_rescan
(
int
i
,
Par_MarkRefsIntoAndSca
nClosure
*
cl
,
ContiguousSpace
*
space
,
CMSPar
MarkTask
::
do_young_space_rescan
(
uint
worker_id
,
OopsInGe
nClosure
*
cl
,
ContiguousSpace
*
space
,
HeapWord
**
chunk_array
,
size_t
chunk_top
)
{
// Until all tasks completed:
// . claim an unclaimed task
...
...
@@ -5530,6 +5660,32 @@ CMSParRemarkTask::do_work_steal(int i, Par_MarkRefsIntoAndScanClosure* cl,
"Else our work is not yet done"
);
}
// Record object boundaries in _eden_chunk_array by sampling the eden
// top in the slow-path eden object allocation code path and record
// the boundaries, if CMSEdenChunksRecordAlways is true. If
// CMSEdenChunksRecordAlways is false, we use the other asynchronous
// sampling in sample_eden() that activates during the part of the
// preclean phase.
void
CMSCollector
::
sample_eden_chunk
()
{
if
(
CMSEdenChunksRecordAlways
&&
_eden_chunk_array
!=
NULL
)
{
if
(
_eden_chunk_lock
->
try_lock
())
{
// Record a sample. This is the critical section. The contents
// of the _eden_chunk_array have to be non-decreasing in the
// address order.
_eden_chunk_array
[
_eden_chunk_index
]
=
*
_top_addr
;
assert
(
_eden_chunk_array
[
_eden_chunk_index
]
<=
*
_end_addr
,
"Unexpected state of Eden"
);
if
(
_eden_chunk_index
==
0
||
((
_eden_chunk_array
[
_eden_chunk_index
]
>
_eden_chunk_array
[
_eden_chunk_index
-
1
])
&&
(
pointer_delta
(
_eden_chunk_array
[
_eden_chunk_index
],
_eden_chunk_array
[
_eden_chunk_index
-
1
])
>=
CMSSamplingGrain
)))
{
_eden_chunk_index
++
;
// commit sample
}
_eden_chunk_lock
->
unlock
();
}
}
}
// Return a thread-local PLAB recording array, as appropriate.
void
*
CMSCollector
::
get_data_recorder
(
int
thr_num
)
{
if
(
_survivor_plab_array
!=
NULL
&&
...
...
@@ -5553,12 +5709,13 @@ void CMSCollector::reset_survivor_plab_arrays() {
// Merge the per-thread plab arrays into the global survivor chunk
// array which will provide the partitioning of the survivor space
// for CMS rescan.
// for CMS
initial scan and
rescan.
void
CMSCollector
::
merge_survivor_plab_arrays
(
ContiguousSpace
*
surv
,
int
no_of_gc_threads
)
{
assert
(
_survivor_plab_array
!=
NULL
,
"Error"
);
assert
(
_survivor_chunk_array
!=
NULL
,
"Error"
);
assert
(
_collectorState
==
FinalMarking
,
"Error"
);
assert
(
_collectorState
==
FinalMarking
||
(
CMSParallelInitialMarkEnabled
&&
_collectorState
==
InitialMarking
),
"Error"
);
for
(
int
j
=
0
;
j
<
no_of_gc_threads
;
j
++
)
{
_cursor
[
j
]
=
0
;
}
...
...
@@ -5621,7 +5778,7 @@ void CMSCollector::merge_survivor_plab_arrays(ContiguousSpace* surv,
}
// Set up the space's par_seq_tasks structure for work claiming
// for parallel rescan of young gen.
// for parallel
initial scan and
rescan of young gen.
// See ParRescanTask where this is currently used.
void
CMSCollector
::
...
...
@@ -6748,6 +6905,28 @@ void MarkRefsIntoClosure::do_oop(oop obj) {
void
MarkRefsIntoClosure
::
do_oop
(
oop
*
p
)
{
MarkRefsIntoClosure
::
do_oop_work
(
p
);
}
void
MarkRefsIntoClosure
::
do_oop
(
narrowOop
*
p
)
{
MarkRefsIntoClosure
::
do_oop_work
(
p
);
}
Par_MarkRefsIntoClosure
::
Par_MarkRefsIntoClosure
(
MemRegion
span
,
CMSBitMap
*
bitMap
)
:
_span
(
span
),
_bitMap
(
bitMap
)
{
assert
(
_ref_processor
==
NULL
,
"deliberately left NULL"
);
assert
(
_bitMap
->
covers
(
_span
),
"_bitMap/_span mismatch"
);
}
void
Par_MarkRefsIntoClosure
::
do_oop
(
oop
obj
)
{
// if p points into _span, then mark corresponding bit in _markBitMap
assert
(
obj
->
is_oop
(),
"expected an oop"
);
HeapWord
*
addr
=
(
HeapWord
*
)
obj
;
if
(
_span
.
contains
(
addr
))
{
// this should be made more efficient
_bitMap
->
par_mark
(
addr
);
}
}
void
Par_MarkRefsIntoClosure
::
do_oop
(
oop
*
p
)
{
Par_MarkRefsIntoClosure
::
do_oop_work
(
p
);
}
void
Par_MarkRefsIntoClosure
::
do_oop
(
narrowOop
*
p
)
{
Par_MarkRefsIntoClosure
::
do_oop_work
(
p
);
}
// A variant of the above, used for CMS marking verification.
MarkRefsIntoVerifyClosure
::
MarkRefsIntoVerifyClosure
(
MemRegion
span
,
CMSBitMap
*
verification_bm
,
CMSBitMap
*
cms_bm
)
:
...
...
@@ -9305,7 +9484,6 @@ void ASConcurrentMarkSweepGeneration::shrink_by(size_t desired_bytes) {
return
;
}
}
// Transfer some number of overflown objects to usual marking
// stack. Return true if some objects were transferred.
bool
MarkRefsIntoAndScanClosure
::
take_from_overflow_list
()
{
...
...
@@ -9377,4 +9555,3 @@ TraceCMSMemoryManagerStats::TraceCMSMemoryManagerStats(CMSCollector::CollectorSt
ShouldNotReachHere
();
}
}
src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp
浏览文件 @
41035692
...
...
@@ -515,6 +515,8 @@ class CMSCollector: public CHeapObj<mtGC> {
friend
class
ConcurrentMarkSweepThread
;
friend
class
ConcurrentMarkSweepGeneration
;
friend
class
CompactibleFreeListSpace
;
friend
class
CMSParMarkTask
;
friend
class
CMSParInitialMarkTask
;
friend
class
CMSParRemarkTask
;
friend
class
CMSConcMarkingTask
;
friend
class
CMSRefProcTaskProxy
;
...
...
@@ -749,6 +751,7 @@ class CMSCollector: public CHeapObj<mtGC> {
Generation
*
_young_gen
;
// the younger gen
HeapWord
**
_top_addr
;
// ... Top of Eden
HeapWord
**
_end_addr
;
// ... End of Eden
Mutex
*
_eden_chunk_lock
;
HeapWord
**
_eden_chunk_array
;
// ... Eden partitioning array
size_t
_eden_chunk_index
;
// ... top (exclusive) of array
size_t
_eden_chunk_capacity
;
// ... max entries in array
...
...
@@ -950,6 +953,7 @@ class CMSCollector: public CHeapObj<mtGC> {
// Support for parallel remark of survivor space
void
*
get_data_recorder
(
int
thr_num
);
void
sample_eden_chunk
();
CMSBitMap
*
markBitMap
()
{
return
&
_markBitMap
;
}
void
directAllocated
(
HeapWord
*
start
,
size_t
size
);
...
...
@@ -1027,6 +1031,8 @@ class CMSCollector: public CHeapObj<mtGC> {
// Initialization errors
bool
completed_initialization
()
{
return
_completed_initialization
;
}
void
print_eden_and_survivor_chunk_arrays
();
};
class
CMSExpansionCause
:
public
AllStatic
{
...
...
@@ -1317,6 +1323,10 @@ class ConcurrentMarkSweepGeneration: public CardGeneration {
//Delegate to collector
return
collector
()
->
get_data_recorder
(
thr_num
);
}
void
sample_eden_chunk
()
{
//Delegate to collector
return
collector
()
->
sample_eden_chunk
();
}
// Printing
const
char
*
name
()
const
;
...
...
src/share/vm/gc_implementation/g1/g1_globals.hpp
浏览文件 @
41035692
...
...
@@ -96,11 +96,6 @@
"the buffer will be enqueued for processing. A value of 0 " \
"specifies that mutator threads should not do such filtering.") \
\
develop(intx, G1ExtraRegionSurvRate, 33, \
"If the young survival rate is S, and there's room left in " \
"to-space, we will allow regions whose survival rate is up to " \
"S + (1 - S)*X, where X is this parameter (as a fraction.)") \
\
develop(bool, G1SATBPrintStubs, false, \
"If true, print generated stubs for the SATB barrier") \
\
...
...
@@ -110,9 +105,6 @@
develop(bool, G1RSBarrierRegionFilter, true, \
"If true, generate region filtering code in RS barrier") \
\
develop(bool, G1RSBarrierNullFilter, true, \
"If true, generate null-pointer filtering code in RS barrier") \
\
develop(bool, G1DeferredRSUpdate, true, \
"If true, use deferred RS updates") \
\
...
...
@@ -120,9 +112,6 @@
"If true, verify that no dirty cards remain after RS log " \
"processing.") \
\
develop(bool, G1RSCountHisto, false, \
"If true, print a histogram of RS occupancies after each pause") \
\
diagnostic(bool, G1PrintRegionLivenessInfo, false, \
"Prints the liveness information for all regions in the heap " \
"at the end of a marking cycle.") \
...
...
@@ -169,9 +158,6 @@
product(uintx, G1ConcRSHotCardLimit, 4, \
"The threshold that defines (>=) a hot card.") \
\
develop(bool, G1PrintOopAppls, false, \
"When true, print applications of closures to external locs.") \
\
develop(intx, G1RSetRegionEntriesBase, 256, \
"Max number of regions in a fine-grain table per MB.") \
\
...
...
src/share/vm/gc_implementation/g1/heapRegion.cpp
浏览文件 @
41035692
...
...
@@ -314,6 +314,11 @@ void HeapRegion::setup_heap_region_size(uintx min_heap_size) {
region_size
=
MAX_REGION_SIZE
;
}
if
(
region_size
!=
G1HeapRegionSize
)
{
// Update the flag to make sure that PrintFlagsFinal logs the correct value
FLAG_SET_ERGO
(
uintx
,
G1HeapRegionSize
,
region_size
);
}
// And recalculate the log.
region_size_log
=
log2_long
((
jlong
)
region_size
);
...
...
src/share/vm/memory/defNewGeneration.cpp
浏览文件 @
41035692
...
...
@@ -1033,6 +1033,9 @@ HeapWord* DefNewGeneration::allocate(size_t word_size,
// have to use it here, as well.
HeapWord
*
result
=
eden
()
->
par_allocate
(
word_size
);
if
(
result
!=
NULL
)
{
if
(
CMSEdenChunksRecordAlways
&&
_next_gen
!=
NULL
)
{
_next_gen
->
sample_eden_chunk
();
}
return
result
;
}
do
{
...
...
@@ -1063,13 +1066,19 @@ HeapWord* DefNewGeneration::allocate(size_t word_size,
// circular dependency at compile time.
if
(
result
==
NULL
)
{
result
=
allocate_from_space
(
word_size
);
}
else
if
(
CMSEdenChunksRecordAlways
&&
_next_gen
!=
NULL
)
{
_next_gen
->
sample_eden_chunk
();
}
return
result
;
}
HeapWord
*
DefNewGeneration
::
par_allocate
(
size_t
word_size
,
bool
is_tlab
)
{
return
eden
()
->
par_allocate
(
word_size
);
HeapWord
*
res
=
eden
()
->
par_allocate
(
word_size
);
if
(
CMSEdenChunksRecordAlways
&&
_next_gen
!=
NULL
)
{
_next_gen
->
sample_eden_chunk
();
}
return
res
;
}
void
DefNewGeneration
::
gc_prologue
(
bool
full
)
{
...
...
src/share/vm/memory/generation.hpp
浏览文件 @
41035692
...
...
@@ -455,6 +455,7 @@ class Generation: public CHeapObj<mtGC> {
// expected to be GC worker thread-local, with the worker index
// indicated by "thr_num".
virtual
void
*
get_data_recorder
(
int
thr_num
)
{
return
NULL
;
}
virtual
void
sample_eden_chunk
()
{}
// Some generations may require some cleanup actions before allowing
// a verification.
...
...
src/share/vm/memory/sharedHeap.cpp
浏览文件 @
41035692
...
...
@@ -65,7 +65,8 @@ SharedHeap::SharedHeap(CollectorPolicy* policy_) :
}
_sh
=
this
;
// ch is static, should be set only once.
if
((
UseParNewGC
||
(
UseConcMarkSweepGC
&&
CMSParallelRemarkEnabled
)
||
(
UseConcMarkSweepGC
&&
(
CMSParallelInitialMarkEnabled
||
CMSParallelRemarkEnabled
))
||
UseG1GC
)
&&
ParallelGCThreads
>
0
)
{
_workers
=
new
FlexibleWorkGang
(
"Parallel GC Threads"
,
ParallelGCThreads
,
...
...
src/share/vm/runtime/arguments.cpp
浏览文件 @
41035692
...
...
@@ -1891,6 +1891,10 @@ void Arguments::check_deprecated_gc_flags() {
warning
(
"Using MaxGCMinorPauseMillis as minor pause goal is deprecated"
"and will likely be removed in future release"
);
}
if
(
FLAG_IS_CMDLINE
(
DefaultMaxRAMFraction
))
{
warning
(
"DefaultMaxRAMFraction is deprecated and will likely be removed in a future release. "
"Use MaxRAMFraction instead."
);
}
}
// Check stack pages settings
...
...
src/share/vm/runtime/globals.hpp
浏览文件 @
41035692
...
...
@@ -1689,6 +1689,9 @@ class CommandLineFlags {
product(bool, CMSAbortSemantics, false, \
"Whether abort-on-overflow semantics is implemented") \
\
product(bool, CMSParallelInitialMarkEnabled, true, \
"Use the parallel initial mark.") \
\
product(bool, CMSParallelRemarkEnabled, true, \
"Whether parallel remark enabled (only if ParNewGC)") \
\
...
...
@@ -1700,6 +1703,14 @@ class CommandLineFlags {
"Whether to always record survivor space PLAB bdries" \
" (effective only if CMSParallelSurvivorRemarkEnabled)") \
\
product(bool, CMSEdenChunksRecordAlways, true, \
"Whether to always record eden chunks used for " \
"the parallel initial mark or remark of eden" ) \
\
product(bool, CMSPrintEdenSurvivorChunks, false, \
"Print the eden and the survivor chunks used for the parallel " \
"initial mark or remark of the eden/survivor spaces") \
\
product(bool, CMSConcurrentMTEnabled, true, \
"Whether multi-threaded concurrent work enabled (if ParNewGC)") \
\
...
...
src/share/vm/services/gcNotifier.cpp
浏览文件 @
41035692
/*
* Copyright (c) 2011, 201
2
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2011, 201
3
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -211,9 +211,9 @@ void GCNotifier::sendNotificationInternal(TRAPS) {
NotificationMark
nm
(
request
);
Handle
objGcInfo
=
createGcInfo
(
request
->
gcManager
,
request
->
gcStatInfo
,
THREAD
);
Handle
objName
=
java_lang_String
::
create_from_
platform_dependent_
str
(
request
->
gcManager
->
name
(),
CHECK
);
Handle
objAction
=
java_lang_String
::
create_from_
platform_dependent_
str
(
request
->
gcAction
,
CHECK
);
Handle
objCause
=
java_lang_String
::
create_from_
platform_dependent_
str
(
request
->
gcCause
,
CHECK
);
Handle
objName
=
java_lang_String
::
create_from_str
(
request
->
gcManager
->
name
(),
CHECK
);
Handle
objAction
=
java_lang_String
::
create_from_str
(
request
->
gcAction
,
CHECK
);
Handle
objCause
=
java_lang_String
::
create_from_str
(
request
->
gcCause
,
CHECK
);
Klass
*
k
=
Management
::
sun_management_GarbageCollectorImpl_klass
(
CHECK
);
instanceKlassHandle
gc_mbean_klass
(
THREAD
,
k
);
...
...
src/share/vm/services/management.cpp
浏览文件 @
41035692
...
...
@@ -1831,13 +1831,13 @@ class ThreadTimesClosure: public ThreadClosure {
private:
objArrayHandle
_names_strings
;
char
**
_names_chars
;
typeArray
Oop
_times
;
typeArray
Handle
_times
;
int
_names_len
;
int
_times_len
;
int
_count
;
public:
ThreadTimesClosure
(
objArrayHandle
names
,
typeArray
Oop
times
);
ThreadTimesClosure
(
objArrayHandle
names
,
typeArray
Handle
times
);
~
ThreadTimesClosure
();
virtual
void
do_thread
(
Thread
*
thread
);
void
do_unlocked
();
...
...
@@ -1845,9 +1845,9 @@ class ThreadTimesClosure: public ThreadClosure {
};
ThreadTimesClosure
::
ThreadTimesClosure
(
objArrayHandle
names
,
typeArray
Oop
times
)
{
typeArray
Handle
times
)
{
assert
(
names
()
!=
NULL
,
"names was NULL"
);
assert
(
times
!=
NULL
,
"times was NULL"
);
assert
(
times
()
!=
NULL
,
"times was NULL"
);
_names_strings
=
names
;
_names_len
=
names
->
length
();
_names_chars
=
NEW_C_HEAP_ARRAY
(
char
*
,
_names_len
,
mtInternal
);
...
...
@@ -1925,7 +1925,7 @@ JVM_ENTRY(jint, jmm_GetInternalThreadTimes(JNIEnv *env,
typeArrayOop
ta
=
typeArrayOop
(
JNIHandles
::
resolve_non_null
(
times
));
typeArrayHandle
times_ah
(
THREAD
,
ta
);
ThreadTimesClosure
ttc
(
names_ah
,
times_ah
()
);
ThreadTimesClosure
ttc
(
names_ah
,
times_ah
);
{
MutexLockerEx
ml
(
Threads_lock
);
Threads
::
threads_do
(
&
ttc
);
...
...
test/gc/arguments/TestG1HeapRegionSize.java
0 → 100644
浏览文件 @
41035692
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test TestG1HeapRegionSize
* @key gc
* @bug 8021879
* @summary Verify that the flag G1HeapRegionSize is updated properly
* @run main/othervm -Xmx64m TestG1HeapRegionSize 1048576
* @run main/othervm -XX:G1HeapRegionSize=2m -Xmx64m TestG1HeapRegionSize 2097152
* @run main/othervm -XX:G1HeapRegionSize=3m -Xmx64m TestG1HeapRegionSize 2097152
* @run main/othervm -XX:G1HeapRegionSize=64m -Xmx256m TestG1HeapRegionSize 33554432
*/
import
sun.management.ManagementFactoryHelper
;
import
com.sun.management.HotSpotDiagnosticMXBean
;
import
com.sun.management.VMOption
;
public
class
TestG1HeapRegionSize
{
public
static
void
main
(
String
[]
args
)
{
HotSpotDiagnosticMXBean
diagnostic
=
ManagementFactoryHelper
.
getDiagnosticMXBean
();
VMOption
option
=
diagnostic
.
getVMOption
(
"UseG1GC"
);
if
(
option
.
getValue
().
equals
(
"false"
))
{
System
.
out
.
println
(
"Skipping this test. It is only a G1 test."
);
return
;
}
String
expectedValue
=
getExpectedValue
(
args
);
option
=
diagnostic
.
getVMOption
(
"G1HeapRegionSize"
);
if
(!
expectedValue
.
equals
(
option
.
getValue
()))
{
throw
new
RuntimeException
(
"Wrong value for G1HeapRegionSize. Expected "
+
expectedValue
+
" but got "
+
option
.
getValue
());
}
}
private
static
String
getExpectedValue
(
String
[]
args
)
{
if
(
args
.
length
!=
1
)
{
throw
new
RuntimeException
(
"Wrong number of arguments. Expected 1 but got "
+
args
.
length
);
}
return
args
[
0
];
}
}
test/gc/g1/TestPrintRegionRememberedSetInfo.java
浏览文件 @
41035692
...
...
@@ -27,7 +27,7 @@
* @bug 8014240
* @summary Test output of G1PrintRegionRememberedSetInfo
* @library /testlibrary
* @
build
TestPrintRegionRememberedSetInfo
* @
run main
TestPrintRegionRememberedSetInfo
* @author thomas.schatzl@oracle.com
*/
...
...
test/gc/startup_warnings/TestDefaultMaxRAMFraction.java
0 → 100644
浏览文件 @
41035692
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test TestDefaultMaxRAMFraction
* @key gc
* @bug 8021967
* @summary Test that the deprecated TestDefaultMaxRAMFraction flag print a warning message
* @library /testlibrary
*/
import
com.oracle.java.testlibrary.OutputAnalyzer
;
import
com.oracle.java.testlibrary.ProcessTools
;
public
class
TestDefaultMaxRAMFraction
{
public
static
void
main
(
String
[]
args
)
throws
Exception
{
ProcessBuilder
pb
=
ProcessTools
.
createJavaProcessBuilder
(
"-XX:DefaultMaxRAMFraction=4"
,
"-version"
);
OutputAnalyzer
output
=
new
OutputAnalyzer
(
pb
.
start
());
output
.
shouldContain
(
"warning: DefaultMaxRAMFraction is deprecated and will likely be removed in a future release. Use MaxRAMFraction instead."
);
output
.
shouldNotContain
(
"error"
);
output
.
shouldHaveExitValue
(
0
);
}
}
test/runtime/8000968/Test8000968.sh
已删除
100644 → 0
浏览文件 @
d58fa9c8
#
# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
# @test Test8000968.sh
# @bug 8000968
# @summary NPG: UseCompressedKlassPointers asserts with ObjectAlignmentInBytes=32
# @run shell Test8000968.sh
#
if
[
"
${
TESTJAVA
}
"
=
""
]
then
PARENT
=
`
dirname
\`
which java
\`
`
TESTJAVA
=
`
dirname
${
PARENT
}
`
printf
"TESTJAVA not set, selecting "
${
TESTJAVA
}
printf
" If this is incorrect, try setting the variable manually.
\n
"
fi
# set platform-dependent variables
OS
=
`
uname
-s
`
case
"
$OS
"
in
Windows_
*
)
FS
=
"
\\
"
NULL
=
NUL
;;
*
)
FS
=
"/"
NULL
=
/dev/null
;;
esac
JAVA
=
${
TESTJAVA
}${
FS
}
bin
${
FS
}
java
#
# See if platform has 64 bit java.
#
${
JAVA
}
${
TESTVMOPTS
}
-d64
-version
2>&1 |
grep
-i
"does not support"
>
${
NULL
}
if
[
"
$?
"
!=
"1"
]
then
printf
"Platform is 32 bit, does not support -XX:ObjectAlignmentInBytes= option.
\n
"
printf
"Passed.
\n
"
exit
0
fi
#
# Test -XX:ObjectAlignmentInBytes with -XX:+UseCompressedKlassPointers -XX:+UseCompressedOops.
#
${
JAVA
}
${
TESTVMOPTS
}
-d64
-XX
:+UseCompressedKlassPointers
-XX
:+UseCompressedOops
-XX
:ObjectAlignmentInBytes
=
16
-version
2>&1
>
${
NULL
}
if
[
"
$?
"
!=
"0"
]
then
printf
"FAILED: -XX:ObjectAlignmentInBytes=16 option did not work.
\n
"
exit
1
fi
${
JAVA
}
${
TESTVMOPTS
}
-d64
-XX
:+UseCompressedKlassPointers
-XX
:+UseCompressedOops
-XX
:ObjectAlignmentInBytes
=
32
-version
2>&1
>
${
NULL
}
if
[
"
$?
"
!=
"0"
]
then
printf
"FAILED: -XX:ObjectAlignmentInBytes=32 option did not work.
\n
"
exit
1
fi
${
JAVA
}
${
TESTVMOPTS
}
-d64
-XX
:+UseCompressedKlassPointers
-XX
:+UseCompressedOops
-XX
:ObjectAlignmentInBytes
=
64
-version
2>&1
>
${
NULL
}
if
[
"
$?
"
!=
"0"
]
then
printf
"FAILED: -XX:ObjectAlignmentInBytes=64 option did not work.
\n
"
exit
1
fi
${
JAVA
}
${
TESTVMOPTS
}
-d64
-XX
:+UseCompressedKlassPointers
-XX
:+UseCompressedOops
-XX
:ObjectAlignmentInBytes
=
128
-version
2>&1
>
${
NULL
}
if
[
"
$?
"
!=
"0"
]
then
printf
"FAILED: -XX:ObjectAlignmentInBytes=128 option did not work.
\n
"
exit
1
fi
printf
"Passed.
\n
"
exit
0
test/runtime/CompressedOops/CompressedKlassPointerAndOops.java
0 → 100644
浏览文件 @
41035692
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8000968
* @key regression
* @summary NPG: UseCompressedKlassPointers asserts with ObjectAlignmentInBytes=32
* @library /testlibrary
*/
import
com.oracle.java.testlibrary.*
;
public
class
CompressedKlassPointerAndOops
{
public
static
void
main
(
String
[]
args
)
throws
Exception
{
if
(!
Platform
.
is64bit
())
{
// Can't test this on 32 bit, just pass
System
.
out
.
println
(
"Skipping test on 32bit"
);
return
;
}
runWithAlignment
(
16
);
runWithAlignment
(
32
);
runWithAlignment
(
64
);
runWithAlignment
(
128
);
}
private
static
void
runWithAlignment
(
int
alignment
)
throws
Exception
{
ProcessBuilder
pb
;
OutputAnalyzer
output
;
pb
=
ProcessTools
.
createJavaProcessBuilder
(
"-XX:+UseCompressedKlassPointers"
,
"-XX:+UseCompressedOops"
,
"-XX:ObjectAlignmentInBytes="
+
alignment
,
"-version"
);
output
=
new
OutputAnalyzer
(
pb
.
start
());
output
.
shouldHaveExitValue
(
0
);
}
}
test/runtime/
7196045/Test7196045
.java
→
test/runtime/
InternalApi/ThreadCpuTimesDeadlock
.java
浏览文件 @
41035692
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012,
2013,
Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -25,8 +25,9 @@
/*
* @test
* @bug 7196045
* @bug 8014294
* @summary Possible JVM deadlock in ThreadTimesClosure when using HotspotInternal non-public API.
* @run main/othervm -XX:+UsePerfData
Test7196045
* @run main/othervm -XX:+UsePerfData
-Xmx32m ThreadCpuTimesDeadlock
*/
import
java.lang.management.ManagementFactory
;
...
...
@@ -35,9 +36,10 @@ import javax.management.MBeanServer;
import
javax.management.MalformedObjectNameException
;
import
javax.management.ObjectName
;
public
class
T
est7196045
{
public
class
T
hreadCpuTimesDeadlock
{
public
static
long
duration
=
1000
*
60
*
2
;
public
static
byte
[]
dummy
;
public
static
long
duration
=
10
*
1000
;
private
static
final
String
HOTSPOT_INTERNAL
=
"sun.management:type=HotspotInternal"
;
public
static
void
main
(
String
[]
args
)
{
...
...
@@ -57,6 +59,18 @@ public class Test7196045 {
throw
new
RuntimeException
(
"Bad object name"
+
e1
);
}
// Thread that allocs memory to generate GC's
Thread
allocThread
=
new
Thread
()
{
public
void
run
()
{
while
(
true
)
{
dummy
=
new
byte
[
4096
];
}
}
};
allocThread
.
setDaemon
(
true
);
allocThread
.
start
();
long
endTime
=
System
.
currentTimeMillis
()
+
duration
;
long
i
=
0
;
while
(
true
)
{
...
...
test/testlibrary/OutputAnalyzerReportingTest.java
0 → 100644
浏览文件 @
41035692
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @summary Test the OutputAnalyzer reporting functionality,
* such as printing additional diagnostic info
* (exit code, stdout, stderr, command line, etc.)
* @library /testlibrary
*/
import
java.io.ByteArrayOutputStream
;
import
java.io.PrintStream
;
import
com.oracle.java.testlibrary.OutputAnalyzer
;
import
com.oracle.java.testlibrary.ProcessTools
;
public
class
OutputAnalyzerReportingTest
{
public
static
void
main
(
String
[]
args
)
throws
Exception
{
// Create the output analyzer under test
String
stdout
=
"aaaaaa"
;
String
stderr
=
"bbbbbb"
;
OutputAnalyzer
output
=
new
OutputAnalyzer
(
stdout
,
stderr
);
// Expected summary values should be the same for all cases,
// since the outputAnalyzer object is the same
String
expectedExitValue
=
"-1"
;
String
expectedSummary
=
" stdout: ["
+
stdout
+
"];\n"
+
" stderr: ["
+
stderr
+
"]\n"
+
" exitValue = "
+
expectedExitValue
+
"\n"
;
DiagnosticSummaryTestRunner
testRunner
=
new
DiagnosticSummaryTestRunner
();
// should have exit value
testRunner
.
init
(
expectedSummary
);
int
unexpectedExitValue
=
2
;
try
{
output
.
shouldHaveExitValue
(
unexpectedExitValue
);
}
catch
(
RuntimeException
e
)
{
}
testRunner
.
closeAndCheckResults
();
// should not contain
testRunner
.
init
(
expectedSummary
);
try
{
output
.
shouldNotContain
(
stdout
);
}
catch
(
RuntimeException
e
)
{
}
testRunner
.
closeAndCheckResults
();
// should contain
testRunner
.
init
(
expectedSummary
);
try
{
output
.
shouldContain
(
"unexpected-stuff"
);
}
catch
(
RuntimeException
e
)
{
}
testRunner
.
closeAndCheckResults
();
// should not match
testRunner
.
init
(
expectedSummary
);
try
{
output
.
shouldNotMatch
(
"[a]"
);
}
catch
(
RuntimeException
e
)
{
}
testRunner
.
closeAndCheckResults
();
// should match
testRunner
.
init
(
expectedSummary
);
try
{
output
.
shouldMatch
(
"[qwerty]"
);
}
catch
(
RuntimeException
e
)
{
}
testRunner
.
closeAndCheckResults
();
}
private
static
class
DiagnosticSummaryTestRunner
{
private
ByteArrayOutputStream
byteStream
=
new
ByteArrayOutputStream
(
10000
);
private
String
expectedSummary
=
""
;
private
PrintStream
errStream
;
public
void
init
(
String
expectedSummary
)
{
this
.
expectedSummary
=
expectedSummary
;
byteStream
.
reset
();
errStream
=
new
PrintStream
(
byteStream
);
System
.
setErr
(
errStream
);
}
public
void
closeAndCheckResults
()
{
// check results
errStream
.
close
();
String
stdErrStr
=
byteStream
.
toString
();
if
(!
stdErrStr
.
contains
(
expectedSummary
))
{
throw
new
RuntimeException
(
"The output does not contain "
+
"the diagnostic message, or the message is incorrect"
);
}
}
}
}
test/testlibrary/com/oracle/java/testlibrary/OutputAnalyzer.java
浏览文件 @
41035692
...
...
@@ -76,7 +76,8 @@ public final class OutputAnalyzer {
*/
public
void
shouldContain
(
String
expectedString
)
{
if
(!
stdout
.
contains
(
expectedString
)
&&
!
stderr
.
contains
(
expectedString
))
{
throw
new
RuntimeException
(
"'"
+
expectedString
+
"' missing from stdout/stderr: ["
+
stdout
+
stderr
+
"]\n"
);
reportDiagnosticSummary
();
throw
new
RuntimeException
(
"'"
+
expectedString
+
"' missing from stdout/stderr \n"
);
}
}
...
...
@@ -88,7 +89,8 @@ public final class OutputAnalyzer {
*/
public
void
stdoutShouldContain
(
String
expectedString
)
{
if
(!
stdout
.
contains
(
expectedString
))
{
throw
new
RuntimeException
(
"'"
+
expectedString
+
"' missing from stdout: ["
+
stdout
+
"]\n"
);
reportDiagnosticSummary
();
throw
new
RuntimeException
(
"'"
+
expectedString
+
"' missing from stdout \n"
);
}
}
...
...
@@ -100,7 +102,8 @@ public final class OutputAnalyzer {
*/
public
void
stderrShouldContain
(
String
expectedString
)
{
if
(!
stderr
.
contains
(
expectedString
))
{
throw
new
RuntimeException
(
"'"
+
expectedString
+
"' missing from stderr: ["
+
stderr
+
"]\n"
);
reportDiagnosticSummary
();
throw
new
RuntimeException
(
"'"
+
expectedString
+
"' missing from stderr \n"
);
}
}
...
...
@@ -112,10 +115,12 @@ public final class OutputAnalyzer {
*/
public
void
shouldNotContain
(
String
notExpectedString
)
{
if
(
stdout
.
contains
(
notExpectedString
))
{
throw
new
RuntimeException
(
"'"
+
notExpectedString
+
"' found in stdout: ["
+
stdout
+
"]\n"
);
reportDiagnosticSummary
();
throw
new
RuntimeException
(
"'"
+
notExpectedString
+
"' found in stdout \n"
);
}
if
(
stderr
.
contains
(
notExpectedString
))
{
throw
new
RuntimeException
(
"'"
+
notExpectedString
+
"' found in stderr: ["
+
stderr
+
"]\n"
);
reportDiagnosticSummary
();
throw
new
RuntimeException
(
"'"
+
notExpectedString
+
"' found in stderr \n"
);
}
}
...
...
@@ -127,7 +132,8 @@ public final class OutputAnalyzer {
*/
public
void
stdoutShouldNotContain
(
String
notExpectedString
)
{
if
(
stdout
.
contains
(
notExpectedString
))
{
throw
new
RuntimeException
(
"'"
+
notExpectedString
+
"' found in stdout: ["
+
stdout
+
"]\n"
);
reportDiagnosticSummary
();
throw
new
RuntimeException
(
"'"
+
notExpectedString
+
"' found in stdout \n"
);
}
}
...
...
@@ -139,7 +145,8 @@ public final class OutputAnalyzer {
*/
public
void
stderrShouldNotContain
(
String
notExpectedString
)
{
if
(
stderr
.
contains
(
notExpectedString
))
{
throw
new
RuntimeException
(
"'"
+
notExpectedString
+
"' found in stderr: ["
+
stderr
+
"]\n"
);
reportDiagnosticSummary
();
throw
new
RuntimeException
(
"'"
+
notExpectedString
+
"' found in stderr \n"
);
}
}
...
...
@@ -154,9 +161,9 @@ public final class OutputAnalyzer {
Matcher
stdoutMatcher
=
Pattern
.
compile
(
pattern
,
Pattern
.
MULTILINE
).
matcher
(
stdout
);
Matcher
stderrMatcher
=
Pattern
.
compile
(
pattern
,
Pattern
.
MULTILINE
).
matcher
(
stderr
);
if
(!
stdoutMatcher
.
find
()
&&
!
stderrMatcher
.
find
())
{
reportDiagnosticSummary
();
throw
new
RuntimeException
(
"'"
+
pattern
+
"' missing from stdout/stderr: ["
+
stdout
+
stderr
+
"]\n"
);
+
"' missing from stdout/stderr \n"
);
}
}
...
...
@@ -170,8 +177,9 @@ public final class OutputAnalyzer {
public
void
stdoutShouldMatch
(
String
pattern
)
{
Matcher
matcher
=
Pattern
.
compile
(
pattern
,
Pattern
.
MULTILINE
).
matcher
(
stdout
);
if
(!
matcher
.
find
())
{
reportDiagnosticSummary
();
throw
new
RuntimeException
(
"'"
+
pattern
+
"' missing from stdout: ["
+
stdout
+
"]
\n"
);
+
"' missing from stdout
\n"
);
}
}
...
...
@@ -185,8 +193,9 @@ public final class OutputAnalyzer {
public
void
stderrShouldMatch
(
String
pattern
)
{
Matcher
matcher
=
Pattern
.
compile
(
pattern
,
Pattern
.
MULTILINE
).
matcher
(
stderr
);
if
(!
matcher
.
find
())
{
reportDiagnosticSummary
();
throw
new
RuntimeException
(
"'"
+
pattern
+
"' missing from stderr: ["
+
stderr
+
"]
\n"
);
+
"' missing from stderr
\n"
);
}
}
...
...
@@ -200,13 +209,15 @@ public final class OutputAnalyzer {
public
void
shouldNotMatch
(
String
pattern
)
{
Matcher
matcher
=
Pattern
.
compile
(
pattern
,
Pattern
.
MULTILINE
).
matcher
(
stdout
);
if
(
matcher
.
find
())
{
reportDiagnosticSummary
();
throw
new
RuntimeException
(
"'"
+
pattern
+
"' found in stdout
: ["
+
stdout
+
"]
\n"
);
+
"' found in stdout
\n"
);
}
matcher
=
Pattern
.
compile
(
pattern
,
Pattern
.
MULTILINE
).
matcher
(
stderr
);
if
(
matcher
.
find
())
{
reportDiagnosticSummary
();
throw
new
RuntimeException
(
"'"
+
pattern
+
"' found in stderr
: ["
+
stderr
+
"]
\n"
);
+
"' found in stderr
\n"
);
}
}
...
...
@@ -220,8 +231,9 @@ public final class OutputAnalyzer {
public
void
stdoutShouldNotMatch
(
String
pattern
)
{
Matcher
matcher
=
Pattern
.
compile
(
pattern
,
Pattern
.
MULTILINE
).
matcher
(
stdout
);
if
(
matcher
.
find
())
{
reportDiagnosticSummary
();
throw
new
RuntimeException
(
"'"
+
pattern
+
"' found in stdout
: ["
+
stdout
+
"]
\n"
);
+
"' found in stdout
\n"
);
}
}
...
...
@@ -235,23 +247,45 @@ public final class OutputAnalyzer {
public
void
stderrShouldNotMatch
(
String
pattern
)
{
Matcher
matcher
=
Pattern
.
compile
(
pattern
,
Pattern
.
MULTILINE
).
matcher
(
stderr
);
if
(
matcher
.
find
())
{
reportDiagnosticSummary
();
throw
new
RuntimeException
(
"'"
+
pattern
+
"' found in stderr
: ["
+
stderr
+
"]
\n"
);
+
"' found in stderr
\n"
);
}
}
/**
* Verif
i
y the exit value of the process
* Verify the exit value of the process
*
* @param expectedExitValue Expected exit value from process
* @throws RuntimeException If the exit value from the process did not match the expected value
*/
public
void
shouldHaveExitValue
(
int
expectedExitValue
)
{
if
(
getExitValue
()
!=
expectedExitValue
)
{
throw
new
RuntimeException
(
"Exit value "
+
getExitValue
()
+
" , expected to get "
+
expectedExitValue
);
reportDiagnosticSummary
();
throw
new
RuntimeException
(
"Expected to get exit value of ["
+
expectedExitValue
+
"]\n"
);
}
}
/**
* Report summary that will help to diagnose the problem
* Currently includes:
* - standard input produced by the process under test
* - standard output
* - exit code
* Note: the command line is printed by the ProcessTools
*/
private
void
reportDiagnosticSummary
()
{
String
msg
=
" stdout: ["
+
stdout
+
"];\n"
+
" stderr: ["
+
stderr
+
"]\n"
+
" exitValue = "
+
getExitValue
()
+
"\n"
;
System
.
err
.
println
(
msg
);
}
/**
* Get the contents of the output buffer (stdout and stderr)
*
...
...
test/testlibrary/com/oracle/java/testlibrary/ProcessTools.java
浏览文件 @
41035692
...
...
@@ -31,6 +31,7 @@ import java.lang.reflect.Field;
import
java.lang.reflect.Method
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.List
;
import
sun.management.VMManagement
;
...
...
@@ -106,6 +107,22 @@ public final class ProcessTools {
return
pid
;
}
/**
* Get the string containing input arguments passed to the VM
*
* @return arguments
*/
public
static
String
getVmInputArguments
()
{
RuntimeMXBean
runtime
=
ManagementFactory
.
getRuntimeMXBean
();
List
<
String
>
args
=
runtime
.
getInputArguments
();
StringBuilder
result
=
new
StringBuilder
();
for
(
String
arg
:
args
)
result
.
append
(
arg
).
append
(
' '
);
return
result
.
toString
();
}
/**
* Get platform specific VM arguments (e.g. -d64 on 64bit Solaris)
*
...
...
@@ -132,8 +149,13 @@ public final class ProcessTools {
Collections
.
addAll
(
args
,
getPlatformSpecificVMArgs
());
Collections
.
addAll
(
args
,
command
);
return
new
ProcessBuilder
(
args
.
toArray
(
new
String
[
args
.
size
()]));
// Reporting
StringBuilder
cmdLine
=
new
StringBuilder
();
for
(
String
cmd
:
args
)
cmdLine
.
append
(
cmd
).
append
(
' '
);
System
.
out
.
println
(
"Command line: ["
+
cmdLine
.
toString
()
+
"]"
);
return
new
ProcessBuilder
(
args
.
toArray
(
new
String
[
args
.
size
()]));
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录