Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
5206b3b2
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看板
提交
5206b3b2
编写于
5月 05, 2010
作者:
D
dcubed
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
44c3830a
626b089d
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
213 addition
and
9 deletion
+213
-9
make/hotspot_distro
make/hotspot_distro
+1
-1
src/os/linux/vm/attachListener_linux.cpp
src/os/linux/vm/attachListener_linux.cpp
+1
-1
src/os/linux/vm/os_linux.cpp
src/os/linux/vm/os_linux.cpp
+1
-1
src/os/solaris/vm/attachListener_solaris.cpp
src/os/solaris/vm/attachListener_solaris.cpp
+1
-1
src/share/vm/oops/methodOop.cpp
src/share/vm/oops/methodOop.cpp
+19
-5
test/runtime/6925573/SortMethodsTest.java
test/runtime/6925573/SortMethodsTest.java
+190
-0
未找到文件。
make/hotspot_distro
浏览文件 @
5206b3b2
...
@@ -28,5 +28,5 @@
...
@@ -28,5 +28,5 @@
# Don't put quotes (fail windows build).
# Don't put quotes (fail windows build).
HOTSPOT_VM_DISTRO=Java HotSpot(TM)
HOTSPOT_VM_DISTRO=Java HotSpot(TM)
COMPANY_NAME=
Sun Microsystems, Inc.
COMPANY_NAME=
Oracle Corporation
PRODUCT_NAME=Java(TM) Platform SE
PRODUCT_NAME=Java(TM) Platform SE
src/os/linux/vm/attachListener_linux.cpp
浏览文件 @
5206b3b2
...
@@ -461,7 +461,7 @@ bool AttachListener::is_init_trigger() {
...
@@ -461,7 +461,7 @@ bool AttachListener::is_init_trigger() {
if
(
init_at_startup
()
||
is_initialized
())
{
if
(
init_at_startup
()
||
is_initialized
())
{
return
false
;
// initialized at startup or already initialized
return
false
;
// initialized at startup or already initialized
}
}
char
fn
[
128
];
char
fn
[
PATH_MAX
+
1
];
sprintf
(
fn
,
".attach_pid%d"
,
os
::
current_process_id
());
sprintf
(
fn
,
".attach_pid%d"
,
os
::
current_process_id
());
int
ret
;
int
ret
;
struct
stat64
st
;
struct
stat64
st
;
...
...
src/os/linux/vm/os_linux.cpp
浏览文件 @
5206b3b2
...
@@ -2305,7 +2305,7 @@ void linux_wrap_code(char* base, size_t size) {
...
@@ -2305,7 +2305,7 @@ void linux_wrap_code(char* base, size_t size) {
return
;
return
;
}
}
char
buf
[
40
];
char
buf
[
PATH_MAX
+
1
];
int
num
=
Atomic
::
add
(
1
,
&
cnt
);
int
num
=
Atomic
::
add
(
1
,
&
cnt
);
snprintf
(
buf
,
sizeof
(
buf
),
"%s/hs-vm-%d-%d"
,
snprintf
(
buf
,
sizeof
(
buf
),
"%s/hs-vm-%d-%d"
,
...
...
src/os/solaris/vm/attachListener_solaris.cpp
浏览文件 @
5206b3b2
...
@@ -592,7 +592,7 @@ bool AttachListener::is_init_trigger() {
...
@@ -592,7 +592,7 @@ bool AttachListener::is_init_trigger() {
if
(
init_at_startup
()
||
is_initialized
())
{
if
(
init_at_startup
()
||
is_initialized
())
{
return
false
;
// initialized at startup or already initialized
return
false
;
// initialized at startup or already initialized
}
}
char
fn
[
128
];
char
fn
[
PATH_MAX
+
1
];
sprintf
(
fn
,
".attach_pid%d"
,
os
::
current_process_id
());
sprintf
(
fn
,
".attach_pid%d"
,
os
::
current_process_id
());
int
ret
;
int
ret
;
struct
stat64
st
;
struct
stat64
st
;
...
...
src/share/vm/oops/methodOop.cpp
浏览文件 @
5206b3b2
...
@@ -1114,6 +1114,20 @@ extern "C" {
...
@@ -1114,6 +1114,20 @@ extern "C" {
return
(
a
<
b
?
-
1
:
(
a
==
b
?
0
:
1
));
return
(
a
<
b
?
-
1
:
(
a
==
b
?
0
:
1
));
}
}
// We implement special compare versions for narrow oops to avoid
// testing for UseCompressedOops on every comparison.
static
int
method_compare_narrow
(
narrowOop
*
a
,
narrowOop
*
b
)
{
methodOop
m
=
(
methodOop
)
oopDesc
::
load_decode_heap_oop
(
a
);
methodOop
n
=
(
methodOop
)
oopDesc
::
load_decode_heap_oop
(
b
);
return
m
->
name
()
->
fast_compare
(
n
->
name
());
}
static
int
method_compare_narrow_idempotent
(
narrowOop
*
a
,
narrowOop
*
b
)
{
int
i
=
method_compare_narrow
(
a
,
b
);
if
(
i
!=
0
)
return
i
;
return
(
a
<
b
?
-
1
:
(
a
==
b
?
0
:
1
));
}
typedef
int
(
*
compareFn
)(
const
void
*
,
const
void
*
);
typedef
int
(
*
compareFn
)(
const
void
*
,
const
void
*
);
}
}
...
@@ -1166,7 +1180,7 @@ void methodOopDesc::sort_methods(objArrayOop methods,
...
@@ -1166,7 +1180,7 @@ void methodOopDesc::sort_methods(objArrayOop methods,
// Use a simple bubble sort for small number of methods since
// Use a simple bubble sort for small number of methods since
// qsort requires a functional pointer call for each comparison.
// qsort requires a functional pointer call for each comparison.
if
(
UseCompressedOops
||
length
<
8
)
{
if
(
length
<
8
)
{
bool
sorted
=
true
;
bool
sorted
=
true
;
for
(
int
i
=
length
-
1
;
i
>
0
;
i
--
)
{
for
(
int
i
=
length
-
1
;
i
>
0
;
i
--
)
{
for
(
int
j
=
0
;
j
<
i
;
j
++
)
{
for
(
int
j
=
0
;
j
<
i
;
j
++
)
{
...
@@ -1182,10 +1196,10 @@ void methodOopDesc::sort_methods(objArrayOop methods,
...
@@ -1182,10 +1196,10 @@ void methodOopDesc::sort_methods(objArrayOop methods,
sorted
=
true
;
sorted
=
true
;
}
}
}
else
{
}
else
{
// XXX This doesn't work for UseCompressedOops because the compare fn
compareFn
compare
=
// will have to decode the methodOop anyway making it not much faster
(
UseCompressedOops
?
// than above.
(
compareFn
)
(
idempotent
?
method_compare_narrow_idempotent
:
method_compare_narrow
)
:
compareFn
compare
=
(
compareFn
)
(
idempotent
?
method_compare_idempotent
:
method_compare
);
(
compareFn
)
(
idempotent
?
method_compare_idempotent
:
method_compare
)
);
qsort
(
methods
->
base
(),
length
,
heapOopSize
,
compare
);
qsort
(
methods
->
base
(),
length
,
heapOopSize
,
compare
);
}
}
...
...
test/runtime/6925573/SortMethodsTest.java
0 → 100644
浏览文件 @
5206b3b2
/*
* Copyright 2008-2010 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*
*/
import
java.io.ByteArrayOutputStream
;
import
java.io.IOException
;
import
java.io.OutputStream
;
import
java.io.PrintWriter
;
import
java.io.StringWriter
;
import
java.lang.reflect.Method
;
import
java.net.URI
;
import
java.util.Arrays
;
import
java.util.Vector
;
import
javax.tools.Diagnostic
;
import
javax.tools.DiagnosticCollector
;
import
javax.tools.FileObject
;
import
javax.tools.ForwardingJavaFileManager
;
import
javax.tools.JavaCompiler
;
import
javax.tools.JavaCompiler.CompilationTask
;
import
javax.tools.JavaFileManager
;
import
javax.tools.JavaFileObject
;
import
javax.tools.JavaFileObject.Kind
;
import
javax.tools.SimpleJavaFileObject
;
import
javax.tools.StandardJavaFileManager
;
import
javax.tools.ToolProvider
;
/*
* @test SortMethodsTest
* @bug 6925573
* @summary verify that class loading does not need quadratic time with regard to the number of class
methods.
* @run main SortMethodsTest
* @author volker.simonis@gmail.com
*/
public
class
SortMethodsTest
{
static
String
createClass
(
String
name
,
int
nrOfMethods
)
{
StringWriter
sw
=
new
StringWriter
();
PrintWriter
pw
=
new
PrintWriter
(
sw
);
pw
.
println
(
"public class "
+
name
+
"{"
);
for
(
int
i
=
0
;
i
<
nrOfMethods
;
i
++)
{
pw
.
println
(
" public void m"
+
i
+
"() {}"
);
}
pw
.
println
(
" public static String sayHello() {"
);
pw
.
println
(
" return \"Hello from class \" + "
+
name
+
".class.getName() + \" with \" + "
+
name
+
".class.getDeclaredMethods().length + \" methods\";"
);
pw
.
println
(
" }"
);
pw
.
println
(
"}"
);
pw
.
close
();
return
sw
.
toString
();
}
public
static
void
main
(
String
args
[])
{
JavaCompiler
comp
=
ToolProvider
.
getSystemJavaCompiler
();
DiagnosticCollector
<
JavaFileObject
>
diags
=
new
DiagnosticCollector
<
JavaFileObject
>();
final
String
cName
=
new
String
(
"ManyMethodsClass"
);
Vector
<
Long
>
results
=
new
Vector
<
Long
>();
for
(
int
i
=
6
;
i
<
600000
;
i
*=
10
)
{
String
klass
=
createClass
(
cName
,
i
);
JavaMemoryFileObject
file
=
new
JavaMemoryFileObject
(
cName
,
klass
);
MemoryFileManager
mfm
=
new
MemoryFileManager
(
comp
.
getStandardFileManager
(
diags
,
null
,
null
),
file
);
CompilationTask
task
=
comp
.
getTask
(
null
,
mfm
,
diags
,
null
,
null
,
Arrays
.
asList
(
file
));
if
(
task
.
call
())
{
try
{
MemoryClassLoader
mcl
=
new
MemoryClassLoader
(
file
);
long
start
=
System
.
nanoTime
();
Class
<?
extends
Object
>
c
=
Class
.
forName
(
cName
,
true
,
mcl
);
long
end
=
System
.
nanoTime
();
results
.
add
(
end
-
start
);
Method
m
=
c
.
getDeclaredMethod
(
"sayHello"
,
new
Class
[
0
]);
String
ret
=
(
String
)
m
.
invoke
(
null
,
new
Object
[
0
]);
System
.
out
.
println
(
ret
+
" (loaded and resloved in "
+
(
end
-
start
)
+
"ns)"
);
}
catch
(
Exception
e
)
{
System
.
err
.
println
(
e
);
}
}
else
{
System
.
out
.
println
(
klass
);
System
.
out
.
println
();
for
(
Diagnostic
diag
:
diags
.
getDiagnostics
())
{
System
.
out
.
println
(
diag
.
getCode
()
+
"\n"
+
diag
.
getKind
()
+
"\n"
+
diag
.
getPosition
());
System
.
out
.
println
(
diag
.
getSource
()
+
"\n"
+
diag
.
getMessage
(
null
));
}
}
}
long
lastRatio
=
0
;
for
(
int
i
=
2
;
i
<
results
.
size
();
i
++)
{
long
normalized1
=
Math
.
max
(
results
.
get
(
i
-
1
)
-
results
.
get
(
0
),
1
);
long
normalized2
=
Math
.
max
(
results
.
get
(
i
)
-
results
.
get
(
0
),
1
);
long
ratio
=
normalized2
/
normalized1
;
lastRatio
=
ratio
;
System
.
out
.
println
(
"10 x more methods requires "
+
ratio
+
" x more time"
);
}
// The following is just vague estimation but seems to work on current x86_64 and sparcv9 machines
if
(
lastRatio
>
80
)
{
throw
new
RuntimeException
(
"ATTENTION: it seems that class loading needs quadratic time with regard to the number of class methods!!!"
);
}
}
}
class
JavaMemoryFileObject
extends
SimpleJavaFileObject
{
private
final
String
code
;
private
ByteArrayOutputStream
byteCode
;
JavaMemoryFileObject
(
String
name
,
String
code
)
{
super
(
URI
.
create
(
"string:///"
+
name
.
replace
(
'.'
,
'/'
)
+
Kind
.
SOURCE
.
extension
),
Kind
.
SOURCE
);
this
.
code
=
code
;
}
@Override
public
CharSequence
getCharContent
(
boolean
ignoreEncodingErrors
)
{
return
code
;
}
@Override
public
OutputStream
openOutputStream
()
{
byteCode
=
new
ByteArrayOutputStream
();
return
byteCode
;
}
byte
[]
getByteCode
()
{
return
byteCode
.
toByteArray
();
}
}
class
MemoryClassLoader
extends
ClassLoader
{
private
final
JavaMemoryFileObject
jfo
;
public
MemoryClassLoader
(
JavaMemoryFileObject
jfo
)
{
this
.
jfo
=
jfo
;
}
public
Class
findClass
(
String
name
)
{
byte
[]
b
=
jfo
.
getByteCode
();
return
defineClass
(
name
,
b
,
0
,
b
.
length
);
}
}
class
MemoryFileManager
extends
ForwardingJavaFileManager
<
JavaFileManager
>
{
private
final
JavaFileObject
jfo
;
public
MemoryFileManager
(
StandardJavaFileManager
jfm
,
JavaFileObject
jfo
)
{
super
(
jfm
);
this
.
jfo
=
jfo
;
}
@Override
public
FileObject
getFileForInput
(
Location
location
,
String
packageName
,
String
relativeName
)
throws
IOException
{
return
jfo
;
}
@Override
public
JavaFileObject
getJavaFileForOutput
(
Location
location
,
String
qualifiedName
,
Kind
kind
,
FileObject
outputFile
)
throws
IOException
{
return
jfo
;
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录