[prev in list] [next in list] [prev in thread] [next in thread]
List: openjdk-serviceability-dev
Subject: Re: RFR: 8259070: Add jcmd option to dump CDS [v8]
From: Ioi Lam <iklam () openjdk ! java ! net>
Date: 2021-03-31 23:30:42
Message-ID: 3yTFtGkXVbbpeMoqSZjS8Gu_iYUmDVFzUjqX6hCI0Ro=.942e390b-672f-4090-bf0a-59b937b23e60 () github ! com
[Download RAW message or body]
On Wed, 31 Mar 2021 20:58:46 GMT, Yumin Qi <minqi@openjdk.org> wrote:
> > Hi, Please review
> >
> > Added jcmd option for dumping CDS archive during application runtime. Before this \
> > change, user has to dump shared archive in two steps: first run application with \
> > `java -XX:DumpLoadedClassList=<classlist> .... ` to collect shareable class \
> > names and saved in file `<classlist>` , then `java -Xshare:dump \
> > -XX:SharedClassListFile=<classlist> -XX:SharedArchiveFile=<archivefile> ...` With \
> > this change, user can use jcmd to dump CDS without going through above steps. \
> > Also user can choose a moment during the app runtime to dump an archive. The bug \
> > is associated with the CSR: https://bugs.openjdk.java.net/browse/JDK-8259798 \
> > which has been approved. New added jcmd option:
> > `jcmd <pid or AppName> VM.cds static_dump <filename>`
> > or
> > `jcmd <pid or AppName> VM.cds dynamic_dump <filename>`
> > To dump dynamic archive, requires start app with newly added flag \
> > `-XX:+RecordDynamicDumpInfo`, with this flag, some information related to dynamic \
> > dump like loader constraints will be recorded. Note the dumping process changed \
> > some object memory locations so for dumping dynamic archive, can only done once \
> > for a running app. For static dump, user can dump multiple times against same \
> > process. The file name is optional, if the file name is not supplied, the file \
> > name will take format of `java_pid<number>_static.jsa` or \
> > `java_pid<number>_dynamic.jsa` for static and dynamic respectively. The \
> > `<number>` is the application process ID.
> > Tests: tier1,tier2,tier3,tier4
> >
> > Thanks
> > Yumin
>
> Yumin Qi has updated the pull request with a new target base due to a merge or a \
> rebase. The pull request now contains 10 commits:
> - Fix revert unintentionally comment, merge master.
> - Merge branch 'master' of ssh://github.com/yminqi/jdk into jdk-8259070
> - Remove CDS.getVMArguments, changed to use VM.getRuntimeVMArguments. Removed \
> unused function from ClassLoader. Improved InstanceKlass::is_shareable() and \
> related test. Added more test scenarios.
> - Remove redundant check for if a class is shareable
> - Fix according to review comment and add more tests
> - Fix filter more flags to exclude in static dump, add more test cases
> - Merge branch 'master' into jdk-8259070
> - Fix white space in CDS.java
> - Add function CDS.dumpSharedArchive in java to dump shared archive
> - 8259070: Add jcmd option to dump CDS
Changes requested by iklam (Reviewer).
src/hotspot/share/classfile/vmSymbols.hpp line 304:
> 302: template(generateLambdaFormHolderClasses_signature, \
> "([Ljava/lang/String;)[Ljava/lang/Object;") \
> 303: template(dumpSharedArchive, "dumpSharedArchive") \
> \
> 304: template(dumpSharedArchive_signature, "(ZLjava/lang/String;)V") \
> \
Need to align the "dumpSharedArchive" part with the previous line.
src/hotspot/share/prims/jvm.cpp line 3745:
> 3743: #if INCLUDE_CDS
> 3744: assert(UseSharedSpaces && RecordDynamicDumpInfo, "already checked in \
> arguments.cpp?");
> 3745: if (DynamicArchive::has_been_dumped_once()) {
Maybe add a comment like this:?
// During dynamic archive dumping, some of the data structures are overwritten so
// we cannot dump the dynamic archive again. TODO: this should be fixed.
src/hotspot/share/prims/jvm.cpp line 3754:
> 3752: assert(ArchiveClassesAtExit == nullptr, "already checked in \
> arguments.cpp?");
> 3753: Handle file_handle(THREAD, JNIHandles::resolve_non_null(archiveName));
> 3754: char* archive_name = java_lang_String::as_utf8_string(file_handle());
A ResourceMark is needed before calling java_lang_String::as_utf8_string().
In general, I think the code in jvm.cpp should only marshall the jobject argument \
(e.g., convert `jstring` to `char*`.). The main functionality of \
JVM_DumpDynamicArchive should be moved to dynamicArchive.cpp. Similarly, most of the \
work in JVM_DumpClassListToFile should be moved to metaspaceShared.cpp.
src/hotspot/share/prims/jvm.cpp line 3759:
> 3757: DynamicArchive::dump();
> 3758: } else {
> 3759: THROW_MSG(vmSymbols::java_lang_RuntimeException(),
Need to set ArchiveClassesAtExit to NULL before throwing the exception, since dynamic \
dump may not work anymore after the failure.
test/hotspot/jtreg/runtime/cds/appcds/jcmd/LingeredTestApp.java line 28:
> 26: public class LingeredTestApp extends LingeredApp {
> 27: // Do not use default test.class.path in class path.
> 28: public boolean useDefaultClasspath() { return false; }
It's not obvious that you're changing the behavior of the base class by overriding a \
member function. It's better to have
public LingeredTestApp() {
setUseDefaultClasspath(false);
}
Also, the name of LingeredTestApp is kind of generic. How about renaming it to \
JCmdTestLingeredApp?
-------------
PR: https://git.openjdk.java.net/jdk/pull/2737
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic