簡體   English   中英

為什么jvm在沒有人真正需要時從jar加載類?

[英]Why the jvm load classes from a jar when no one is really requiring it?

我的應用程序使用了很多類,遍布很多jar,所以我想基於類加載的順序創建一個帶有序jar的類路徑。 當所有這些罐子都在網絡/遠程文件系統上時,這會減少啟動時間。

我開始嘗試使用java -verbose:class -classpath ... mainclass並檢查加載的內容。 獲取ClassNotFoundException時添加新jar。

然后我注意到每次都會加載一些類,而我的應用程序並沒有真正使用它。 我剛剛做了一個例子:一個空類啟動方法。 即使loadind這個類,也需要很多其他的jar。

package test;
public class CheckClassLoader {
  static public void main (String args[]) {
  }
}

請注意,此類包含在包含許多其他類的大型jar中。

這是我的輸出。 它表明我加載了一大堆類(不是標准java,也不是我使用的externa jar中的類)。

$ java -verbose:class -Xdiag -jar Neos.jar test.CheckClassLoader \
  | egrep -v 'Loaded (sun|java|javax|org\.xml)\.'
[Opened /home/giuseppe/jdk1.7.0_15/jre/lib/rt.jar]
[Loaded gui.sendto.SendToListener from file:/tmp/Neos.jar]
[Loaded gui.ParentChildFrameIfc from file:/tmp/Neos.jar]
[Loaded gui.ParentChildFrame from file:/tmp/Neos.jar]
[Loaded gui.MainFrame from file:/tmp/Neos.jar]
[Loaded utils.MessageException from file:/tmp/Neos.jar]
[Loaded exchange.xml.XmlImportReader from file:/tmp/Neos.jar]
[Loaded gui.ParentChildFrame$7 from file:/tmp/Neos.jar]
[Loaded engine.TableBean from file:/tmp/Neos.jar]
[Loaded utils.io.net.ConnectionListener from file:/tmp/Neos.jar]
[Loaded utils.image.ByteDocTools from file:/tmp/Neos.jar]
[Loaded gui.utils.FileFilterExtension from file:/tmp/Neos.jar]
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/pdfbox/pdmodel/PDDocument
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2451)
at java.lang.Class.getMethod0(Class.java:2694)
at java.lang.Class.getMethod(Class.java:1622)
at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)
Caused by: java.lang.ClassNotFoundException: org.apache.pdfbox.pdmodel.PDDocument
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
... 6 more

完整輸出的最后一部分(未使用egrep過濾)是:

[Loaded engine.TableBean from file:/tmp/Neos.jar]
[Loaded java.io.IOException from /home/giuseppe/jdk1.7.0_15/jre/lib/rt.jar]
[Loaded utils.io.net.ConnectionListener from file:/tmp/Neos.jar]
[Loaded utils.image.ByteDocTools from file:/tmp/Neos.jar]
[Loaded javax.swing.filechooser.FileFilter from /home/giuseppe/jdk1.7.0_15/jre/lib    /rt.jar]
[Loaded gui.utils.FileFilterExtension from file:/tmp/Neos.jar]
[Loaded java.io.FileNotFoundException from /home/giuseppe/jdk1.7.0_15/jre/lib/rt.jar]
[Loaded java.lang.NoSuchMethodException from /home/giuseppe/jdk1.7.0_15/jre/lib/rt.jar]
Exception in thread "main" [Loaded java.lang.Throwable$PrintStreamOrWriter from /home/giuseppe/jdk1.7.0_15/jre/lib/rt.jar]
[Loaded java.lang.Throwable$WrappedPrintStream from /home/giuseppe/jdk1.7.0_15/jre/lib/rt.jar]
[Loaded java.util.IdentityHashMap from /home/giuseppe/jdk1.7.0_15/jre/lib/rt.jar]
[Loaded java.util.IdentityHashMap$KeySet from /home/giuseppe/jdk1.7.0_15/jre/lib/rt.jar]
java.lang.NoClassDefFoundError: org/apache/pdfbox/pdmodel/PDDocument
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2451)
at java.lang.Class.getMethod0(Class.java:2694)
at java.lang.Class.getMethod(Class.java:1622)
at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)
[Loaded java.util.Objects from /home/giuseppe/jdk1.7.0_15/jre/lib/rt.jar]
Caused by: java.lang.ClassNotFoundException: org.apache.pdfbox.pdmodel.PDDocument
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
... 6 more
[Loaded java.lang.Shutdown from /home/giuseppe/jdk1.7.0_15/jre/lib/rt.jar]
[Loaded java.lang.Shutdown$Lock from /home/giuseppe/jdk1.7.0_15/jre/lib/rt.jar]

所以,我的問題:為什么jvm從jar中加載類沒有人真的需要它?

您的命令行正在運行Neos.jar中的主類, 而不是您的測試類。 要實現此目的,請在命令行中將-jar替換為-cp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM