Tag: classloader

加载类和实例化它之间的区别

有人可以解释类加载和实例化类之间的区别。 当我们使用Static变量加载一个类时,它是否也在Class加载的同时实例化? 毕竟静态代码是类的一部分而不是它的个别实例。 如果有人提供了一个例子来帮助我更好地理解这一点,那将会很有帮助。

Javassist:重新创建一个类 – 先删除,还是解冻()并修改?

我使用Javassist创建一个类。 在测试套件中,当第二个测试尝试创建相同的类时,它在pool.makeClass( … )处失败,因为该类被冻结(即已经通过toClass()创建。 克服这个问题的方法是什么? 理想情况下,第一个测试应该以某种方式删除类 – 也许从类加载器中卸载 – 但是当我在JLS中读取时 ,卸载操作是不可靠的。 因此,或许解决方法是检查创建代码的类是否存在,如果存在,则defrost()它,删除所有成员等,然后重新创建它。 还有其他想法吗? 或者是否有一些通过Javassist删除类的可靠方法?

如何安全地解决此Java上下文类加载器问题?

我的数百名用户中只有一个在启动Java桌面应用程序时遇到问题。 只有三分之一的时间才开始。 另外三分之二的时间在启动时抛出NullPointerException: Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException at java.util.Hashtable.put(Hashtable.java:394) at javax.swing.JEditorPane.registerEditorKitForContentType(JEditorPane.java:1327) at javax.swing.JEditorPane.registerEditorKitForContentType(JEditorPane.java:1309) at javax.swing.JEditorPane.loadDefaultKitsIfNecessary(JEditorPane.java:1387) at javax.swing.JEditorPane.getKitTypeRegistry(JEditorPane.java:1344) at javax.swing.JEditorPane.getEditorKitClassNameForContentType(JEditorPane.java:1340) at javax.swing.JTextPane.(JTextPane.java:76) at myapp.Launcher$1.run(Launcher.java:13) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) at java.awt.EventQueue.dispatchEvent(EventQueue.java:633) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 我已经按照堆栈跟踪找到原因 Thread.currentThread().getContextClassLoader() 在JEditorPane中返回null。 谷歌搜索显示,这是一个零星的,非常罕见的,神秘的问题,影响了一些人。 我的问题是,作为一种解决办法,我能做些什么? 如果我在创建EditorPane之前调用它,这可能会有效: Thread.currentThread().setContextClassLoader(MyClass.class.getClassLoader()); 但我并不像我想的那样真正理解类加载器(我试图更好地理解它们)。 我觉得改变EDT中的contextClassLoader可能会产生不良影响。 任何想法我能做什么? 编辑:我与熟悉Java ClassLoaders的人有一些通信。 这似乎是一个模糊的ClassLoader竞争条件。 也就是Java中的一个bug。

AppClassloader和SystemClassloader之间的区别

我对这两个类加载器非常困惑。 在谈到Java类加载器的层次结构时,通常会提到引导类加载器和ext类加载器以及第三个(系统类加载器或应用程序类加载器)。 为了更准确,我检查了JDK的源代码。 在类Launcher ,有代码: loader = AppClassLoader.getAppClassLoader(extcl); 在类ClassLoader ,方法: getSystemClassloader() 还说系统类加载器用于启动应用程序。 那么哪个是层次结构中的第三个,还是两个类加载器相同?

ClassLoader泄漏 – 他们值得解决吗?

ClassLoader泄漏通常会导致java.lang.OutOfMemoryError:PermGen 。 在处理应用程序服务器的过程中,您可能会看到这是许多重新部署常见应用程序的结果。 可以在这两个链接上看到对此问题的解释和可能的解决方案。 (其中包括) http://dev.eclipse.org/blogs/memoryanalyzer/2008/05/17/the-unknown-generation-perm/ http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java 现在大部分时间他们很容易绕过。 只需增加-XX:MaxPermSize,当不可避免的情况发生时,完全重启JVM。 尝试解决这个问题的问题是,在大型应用程序中,许多类可能导致类加载器泄漏,因此类仍然保留在permgen中。 由此产生两个问题: 是否合理地说这样的问题更好地增加最大烫发大小并在必要时重新启动或者应该找到更高优先级的解决方案? 有没有更简单的方法来解决类加载器泄漏?

将Class对象转换为字节

如果我在运行时有一个Class实例,我可以得到它的byte []表示吗? 我感兴趣的字节是Class文件格式 ,这样它们就是[ClassLoader.defineClass] [3]的有效输入。 [3]: http : //java.sun.com/j2se/1.5.0/docs/api/java/lang/ClassLoader.html#defineClass(java.lang.String ,byb [],int,int) 编辑:我接受了一个getResourceAsStream答案,因为它很简单,大部分时间都可以工作。 ClassFileTransformer似乎是一个更强大的解决方案,因为它不要求从.class文件加载类; 例如,它将处理网络加载的类。 用这种方法可以跳过几个箍,但我会记住。 谢谢大家!

Java中的“new”做什么做了类加载器?

我不能在JLS / JVMSpec中找到它,也不能在SO中找到它。 我肯定一定会被问到…… 那么,“新”究竟做了什么呢? 假设我们在A中实例化一个B类: class A { // … new B(); // … } 这相当于 class A { // … A.class.getClassLoader().loadClass(“B’s canonical name”).newInstance(); // … } ? 它是,还是在每个环境中都不像那样? 如果您能指出JLS / JVMSpec中的相应章节,我将不胜感激。 谢谢! 编辑:当然我们不能在loadClass()调用中调用B.class.getCanonicalName() ,因为B尚未加载。 JVM必须根据import语句解析名称。

Java ASM字节码修改 – 更改方法体

我在jar子里有一个类的方法,我想用自己的身体交换它。 在这种情况下,我只想让方法打印出“GOT IT”到控制台并返回true; 我正在使用系统加载程序来加载jar的类。 我使用reflection使系统类加载器能够通过字节码加载类。 这部分似乎工作正常。 我按照这里找到的方法替换示例:asm.ow2.org/current/asm-transformations.pdf。 我的代码如下: public class Main { public static void main(String[] args) { URL[] url = new URL[1]; try { url[0] = new URL(“file:////C://Users//emist//workspace//tmloader//bin//runtime//tmgames.jar”); verifyValidPath(url[0]); } catch (Exception ex) { System.out.println(“URL error”); } Loader l = new Loader(); l.loadobjection(url); } public static void verifyValidPath(URL url) throws FileNotFoundException { File filePath […]

validation,方法执行和JIT编译过程中类加载的原因和跟踪

我试图在非常详细的基础上理解哪些事件导致类加载,并且在我的测试期间遇到了一个我在这个非常基本的示例中无法理解的行为: public class ClinitTest { public static Integer num; public static Long NUMTEST; static { NUMTEST = new Long(15);; num = (int) (NUMTEST * 5); System.out.println(num); } public static void main(String[] args) { System.out.println( “The number is ” + num); } } 在执行时运行java.lang.Long时。 好吧,它先前由bootstrap类加载器加载,但此时调用了AppClassloader,因为它尚未注册为启动类加载器。 因此,LauncherHelper将获取应用程序类,在它调用main方法之前,JVM将确保该类已初始化。 在执行期间,会发生此类加载。 在另一个运行中,我使用Java代理将重命名为其他内容并添加一个空代理。 我的期望是 – 由于原来的代码没有被执行,我也不会得到类加载事件。 奇怪的是,此时java.lang.Long的负载似乎发生在更早的时间。 在我的跟踪中,我看到当LauncherHelper尝试validation主类时会触发它。 在这里,它尝试通过reflection获取main方法,并且在引擎盖下调用java.lang.Class.getDeclaredMethods0()会导致调用AppClassLoader请求java.lang.Long 。 所以问题是: […]

Glassfish / Hibernate的PermGen空间问题

我正在Glassfish 3.1上运行GWT + Hibernate应用程序。 几个小时后,我跑出了Permgen空间。 这没有任何webapp重新加载。 我正在运行–XX:MaxPermSize=256m –XmX1024m 。 我接受了这个页面的建议,发现我泄漏了很多类 – 我的所有Hibernate模型和所有GWT RequestFactory代理。 上面引用的指南说“检查链条,找到意外参考,并修复代码”。 说起来容易做起来难。 类加载器始终指向org.glassfish.web.loader.WebappClassLoader的实例。 进一步深入,我发现了许多来自$Proxy135和类似命名对象的引用。 但我不知道怎么回事。