本文介绍了JNLP中的JVM类加载器跟踪选项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试通过JNLP运行的Java客户端中调试类加载问题。但是 -XX:+ TraceClassLoading 仅打印 Loaded事件,并且仅用于核心类。另一个选项 -verbose:class 不执行任何操作。我试图用D和X作为前缀而没有效果。



当我在桌面上使用 -verbose:class 时Java应用程序,它可以很好地打印所有事件,但这里不会发生该错误。



我遗漏了什么吗,还是有另一种方法来跟踪JNLP中的类加载? / p>

编辑

我尝试过的示例(这是 javaws 调用扩展为):

  /usr/lib/jvm/jdk1.8.0_161/jre/bin/java-类路径/usr/lib/jvm/jdk1.8.0_161/jre/lib/deploy.jar -Djava.security.policy = file:/usr/lib/jvm/jdk1.8.0_161/jre/lib/security/javaws.policy -DtrustProxy = true-详细:类-XX:+ TraceClassLoading -Xverify:远程-Djnlpx.home = / usr / lib / jvm / jdk1.8.0_161 / jre / bin -Djava.security.manager -Djnlpx.origFilenameArg = http: //localhost:8080/webstart.jnlp -Djnlpx.remove = false -Dsun.awt.warmup = true -Xbootclasspath / a:/usr/lib/jvm/jdk1.8.0_161/jre/lib/javaws.jar:/ usr /lib/jvm/jdk1.8.0_161/jre/lib/deploy.jar:/usr/lib/j vm / jdk1.8.0_161 / jre / lib / plugin.jar -Djnlpx.splashport = 59367 -Djnlpx.jvm = / usr / lib / jvm / jdk1.8.0_161 / jre / bin / java com.sun.javaws.Main- notWebJava http:// localhost:8080 / webstart.jnlp 

JNLP运行的部分输出(无用户类) ):

  [从java.lang.UNIXProcess加载java.lang.UNIXProcess $$ Lambda $ 15/1173574345] 
[从/usr/lib/jvm/jdk1.8.0_161/jre/lib/javaws.jar加载com.sun.javaws.Launcher $ CacheUpdateRequiredException]
[从/ usr / lib / jvm加载java.lang.SecurityException /jdk1.8.0_161/jre/lib/rt.jar]
[从/usr/lib/jvm/jdk1.8.0_161/jre/lib/deploy.jar加载com.sun.deploy.security.BlockedException
[从/usr/lib/jvm/jdk1.8.0_161/jre/lib/rt.jar加载的sun.awt.X11.XSystemTrayPeer]

桌面Java运行的部分输出(请注意.m2存储库中的用户类,是的,它在_151上运行,但没有区别,我尝试了两者):

  [已加载< ...> .Unmodifiab来自文件的leArrayIterator:/home/imaskar/.m2/repository /.../ 1.6-SNAPSHOT /-...- 1.6-SNAPSHOT-jar-with-dependencies.jar] 
[从文件:/home/imaskar/.m2/repository/< ... / 1.6 / SNAPSHOT /< ...-- 1.6-SNAPSHOT-jar- with-dependencies.jar]
[已从文件:/home/imaskar/.m2/repository/< ...> /1.6-SNAPSHOT/< .......加载.RCMessengerQualityListener $ 1。 ..> -1.6-SNAPSHOT.jar]
[已从javax.swing.JComponent中加载javax.swing.JComponent $$ Lambda $ 124/1794174740]
[已从中加载java.util.prefs.FileSystemPreferences $ 10 /usr/lib/jvm/jdk1.8.0_151/jre/lib/rt.jar]
[从/usr/lib/jvm/jdk1.8.0_151/jre/lib下载的java.util.prefs.FileSystemPreferences $ 12 /rt.jar]
[从/usr/lib/jvm/jdk1.8.0_151/jre/lib/rt.jar加载的java.util.prefs.FileSystemPreferences $ 11]

Edit2



将选项传递给jnlp的另一种方法,但它也只打印核心类。我想是因为选项只传递给第一个java调用,它仅管理部署,然后再调用实际的应用程序。

解决方案

解决方法




  1. 运行 javaws http:// localhost:8080 / webstart.jnlp ,稍等片刻即可部署并启动

  2. 运行 ps -ax | grep Djnlpx 并复制完全扩展的JNLP调用

  3. 从p1关闭应用程序

  4. 添加 -verbose :class (或您想要的任何其他选项)从p2调用并再次运行。



说明



我发现javaws调用扩展了两次。因此,基本调用是

  javaws http:// localhost:8080 / sin-web / webstart.jnlp 

如果我尝试在此处添加任何选项,则没有任何效果。
它扩展为

  /usr/lib/jvm/jdk1.8.0_151/jre/bin/java 
-classpath
/usr/lib/jvm/jdk1.8.0_151/jre/lib/deploy.jar
-Djava.security.policy = file:/usr/lib/jvm/jdk1.8.0 _151 / jre / lib / security / javaws.policy
-DtrustProxy = true
-Xverify:remote
-Djnlpx.home = / usr / lib / jvm / jdk1.8.0_151 / jre / bin
-Djava.security.manager
-Djnlpx.origFilenameArg = http:// localhost:8080 / sin-web / webstart.jnlp
-Djnlpx.remove = false
- Dsun.awt.warmup = true
-Xbootclasspath / a:/usr/lib/jvm/jdk1.8.0_151/jre/lib/javaws.jar:/usr/lib/jvm/jdk1.8.0_151/jre/ lib / deploy.jar:/usr/lib/jvm/jdk1.8.0_151/jre/lib/plugin.jar
-Djnlpx.splashport = 44975
-Djnlpx.jvm = / usr / lib / jvm /jdk1.8.0_151/jre/bin/java
com.sun.javaws.Main
-详细
-notWebJava
http:// localhost:8080 / sin-web / webstart.jnlp

为了方便阅读,换行了,您必须删除它们。如果在此处输入 -verbose:class ,则仅显示核心类。该调用扩展为:

  /usr/lib/jvm/jdk1.8.0_161/jre/bin/java 
-Xmx1g -Xms256m
-Djnlp.packEnabled = false
-Xbootclasspath / a:/usr/lib/jvm/jdk1.8.0_161/jre/lib/javaws.jar:/ usr / lib / jvm /jdk1.8.0_161/jre/lib/deploy.jar:/usr/lib/jvm/jdk1.8.0_161/jre/lib/plugin.jar
-Djnlp.tk = awt
-classpath / usr / lib / jvm / jdk1.8.0_161 / jre / lib / deploy.jar -Djnlpx.vmargs = LVhteDFnAC1YbXMyNTZtAC1Eam5scC5wYWNrRW5hYmxlZD1mYWxzZQA = -Djnlpx.jvm = / lib / $$ / j_b / j.jvm = / lib。 b -Djnlpx.splashport = 59367
-Djnlpx.home = / usr / lib / jvm / jdk1.8.0_161 / jre / bin
-Djnlpx.remove = false
-Djnlpx.offline = false
-Djnlpx.relaunch = true
-Djnlpx.session.data = / tmp / session2497443162302588696
-Djnlpx.heapsize = NULL,NULL
-Djava.security.policy = file :/usr/lib/jvm/jdk1.8.0_161/jre/lib/security/javaws.policy
-DtrustProxy = true
-Xverify:remote
-Djnlpx.origFilenameArg = http:/ /本地主机:8080 / webstart.jnlp
-Dsun.awt.warmup = true
-Djava.security.manager
com.sun.javaws.Main
-notWebJava
/home/imaskar/.java/deployment/cache/6.0/1/40a358c1-677ef294

再次换行以提高可读性。如果在此处放置 -verbose:class ,则会打印所有类事件。


I'm trying to debug class loading issue in a java clied that is being run via JNLP. But -XX:+TraceClassLoading only prints 'Loaded' events and only for core classes. The other option, -verbose:class does nothing. I tried to prefix it with D and X without effect.

When I use -verbose:class in a desktop java application, it prints all events just fine, but the bug does not occur here.

Am I missing something or is there another way to trace class loading in JNLP?

Edit:
Examples of what I tried (this is what javaws call expands into):

/usr/lib/jvm/jdk1.8.0_161/jre/bin/java -classpath /usr/lib/jvm/jdk1.8.0_161/jre/lib/deploy.jar -Djava.security.policy=file:/usr/lib/jvm/jdk1.8.0_161/jre/lib/security/javaws.policy -DtrustProxy=true -verbose:class -XX:+TraceClassLoading -Xverify:remote -Djnlpx.home=/usr/lib/jvm/jdk1.8.0_161/jre/bin -Djava.security.manager -Djnlpx.origFilenameArg=http://localhost:8080/webstart.jnlp -Djnlpx.remove=false -Dsun.awt.warmup=true -Xbootclasspath/a:/usr/lib/jvm/jdk1.8.0_161/jre/lib/javaws.jar:/usr/lib/jvm/jdk1.8.0_161/jre/lib/deploy.jar:/usr/lib/jvm/jdk1.8.0_161/jre/lib/plugin.jar -Djnlpx.splashport=59367 -Djnlpx.jvm=/usr/lib/jvm/jdk1.8.0_161/jre/bin/java com.sun.javaws.Main -notWebJava http://localhost:8080/webstart.jnlp

Partial output from JNLP run (no user classes):

[Loaded java.lang.UNIXProcess$$Lambda$15/1173574345 from java.lang.UNIXProcess]
[Loaded com.sun.javaws.Launcher$CacheUpdateRequiredException from /usr/lib/jvm/jdk1.8.0_161/jre/lib/javaws.jar]
[Loaded java.lang.SecurityException from /usr/lib/jvm/jdk1.8.0_161/jre/lib/rt.jar]
[Loaded com.sun.deploy.security.BlockedException from /usr/lib/jvm/jdk1.8.0_161/jre/lib/deploy.jar]
[Loaded sun.awt.X11.XSystemTrayPeer from /usr/lib/jvm/jdk1.8.0_161/jre/lib/rt.jar]

Partial output from desktop java run (notice user classes from .m2 repo and yes, it was run on _151 but there is no difference, I tried both):

[Loaded <...>.UnmodifiableArrayIterator from file:/home/imaskar/.m2/repository/<...>/1.6-SNAPSHOT/<...>-1.6-SNAPSHOT-jar-with-dependencies.jar]
[Loaded <...>.RCEvent from file:/home/imaskar/.m2/repository/<...>/1.6-SNAPSHOT/<...>-1.6-SNAPSHOT-jar-with-dependencies.jar]
[Loaded <...>.RCMessengerQualityListener$1 from file:/home/imaskar/.m2/repository/<...>/1.6-SNAPSHOT/<...>-1.6-SNAPSHOT.jar]
[Loaded javax.swing.JComponent$$Lambda$124/1794174740 from javax.swing.JComponent]
[Loaded java.util.prefs.FileSystemPreferences$10 from /usr/lib/jvm/jdk1.8.0_151/jre/lib/rt.jar]
[Loaded java.util.prefs.FileSystemPreferences$12 from /usr/lib/jvm/jdk1.8.0_151/jre/lib/rt.jar]
[Loaded java.util.prefs.FileSystemPreferences$11 from /usr/lib/jvm/jdk1.8.0_151/jre/lib/rt.jar]

Edit2:

Here is suggested another method of passing options to jnlp, but it also prints only core classes. I suppose, it happens because options only passed to the first java call, which only manages deployment and then makes another call to the actual application.

解决方案

Workaround

  1. run javaws http://localhost:8080/webstart.jnlp and wait a bit so it deploys and starts
  2. run ps -ax | grep Djnlpx and copy fully expanded JNLP call
  3. close application from p1
  4. add -verbose:class (or any other option you want) to the call from p2 and run again.

Explanation

I found that javaws call expands twice. So, basic call is

javaws http://localhost:8080/sin-web/webstart.jnlp

If I try to add any options here, nothing works.It expands into

/usr/lib/jvm/jdk1.8.0_151/jre/bin/java
 -classpath
 /usr/lib/jvm/jdk1.8.0_151/jre/lib/deploy.jar
 -Djava.security.policy=file:/usr/lib/jvm/jdk1.8.0_151/jre/lib/security/javaws.policy
 -DtrustProxy=true
 -Xverify:remote
 -Djnlpx.home=/usr/lib/jvm/jdk1.8.0_151/jre/bin
 -Djava.security.manager
 -Djnlpx.origFilenameArg=http://localhost:8080/sin-web/webstart.jnlp
 -Djnlpx.remove=false
 -Dsun.awt.warmup=true
 -Xbootclasspath/a:/usr/lib/jvm/jdk1.8.0_151/jre/lib/javaws.jar:/usr/lib/jvm/jdk1.8.0_151/jre/lib/deploy.jar:/usr/lib/jvm/jdk1.8.0_151/jre/lib/plugin.jar
 -Djnlpx.splashport=44975
 -Djnlpx.jvm=/usr/lib/jvm/jdk1.8.0_151/jre/bin/java
 com.sun.javaws.Main
 -verbose
 -notWebJava
 http://localhost:8080/sin-web/webstart.jnlp

Line breaks for readability, you have to remove them. If you put -verbose:class here it only prints core classes. And that call expands into:

/usr/lib/jvm/jdk1.8.0_161/jre/bin/java
-Xmx1g -Xms256m
-Djnlp.packEnabled=false
-Xbootclasspath/a:/usr/lib/jvm/jdk1.8.0_161/jre/lib/javaws.jar:/usr/lib/jvm/jdk1.8.0_161/jre/lib/deploy.jar:/usr/lib/jvm/jdk1.8.0_161/jre/lib/plugin.jar
-Djnlp.tk=awt
-classpath /usr/lib/jvm/jdk1.8.0_161/jre/lib/deploy.jar -Djnlpx.vmargs=LVhteDFnAC1YbXMyNTZtAC1Eam5scC5wYWNrRW5hYmxlZD1mYWxzZQA= -Djnlpx.jvm=/usr/lib/jvm/jdk1.8.0_161/jre/bin/java
-Djnlpx.splashport=59367
-Djnlpx.home=/usr/lib/jvm/jdk1.8.0_161/jre/bin
-Djnlpx.remove=false
-Djnlpx.offline=false
-Djnlpx.relaunch=true
-Djnlpx.session.data=/tmp/session2497443162302588696
-Djnlpx.heapsize=NULL,NULL
-Djava.security.policy=file:/usr/lib/jvm/jdk1.8.0_161/jre/lib/security/javaws.policy
-DtrustProxy=true
-Xverify:remote
-Djnlpx.origFilenameArg=http://localhost:8080/webstart.jnlp
-Dsun.awt.warmup=true
-Djava.security.manager
com.sun.javaws.Main
-notWebJava
/home/imaskar/.java/deployment/cache/6.0/1/40a358c1-677ef294

Line breaks for readablility again. If you put -verbose:class here, all classes events are printed.

这篇关于JNLP中的JVM类加载器跟踪选项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-12 07:59