Tag: 类加载器

多个静态变量实例

我正在尝试使用不同的类加载器来加载特定的类,并查看该类中的静态变量是否可以具有不同的实例。 基本上,我正在尝试编写Stephen C在此答案中提到的代码。 这是我的课程: CustomClassLoader.java class CustomClassLoader extends ClassLoader { public Class loadClass(String classname) throws ClassNotFoundException { return super.loadClass(classname, true); } } Test.java(包含驱动程序) class Test { public static void main(String[] args) throws Exception { CustomClassLoader c1 = new CustomClassLoader(); CustomClassLoader c2 = new CustomClassLoader(); Class m1, m2; m1 = c1.loadClass(“A”); m2 = c2.loadClass(“A”); m1.getField(“b”).set(null, 10); […]

在运行时使用JDK编译器时内存泄漏

我试图在我的程序中添加一个javaeditor来在运行时扩展程序。 一切正常,除了广泛使用程序(我模拟1000-10000编译器执行)。 内存使用量上升和上升,看起来有内存泄漏。 在我的程序中,类被加载,构造函数被执行并且类被卸载(没有剩余的实例,并且当我将指针设置为null时,classLoader变得无效)。 我用JConsole分析了这个过程,当执行垃圾收集器时,类被卸载。 我在内存分析器中做了一个heapdum打开它,问题似乎在java.net.FactoryURLClassLoader里面(在com.sun.tools.javac.util.List对象中)。 由于(com.sun.tools.javac)是JDK的一部分,而不是JRE,而SystemToolClassLoader是一个FactoryURLClassLoader对象,我会在那里的某处找到泄漏。 当我第一次执行编译器时,SystemToolClassLoader中加载的类的数量从1上升到521,但之后保持不变。 所以我不知道泄漏在哪里,有没有办法重置SystemToolClassLoader? 我怎样才能更准确地找到泄漏点。 编辑:好的,我发现它也发生在一个非常简单的例子中。 所以它似乎是编译的一部分,我不需要加载类或实例化它: import java.io.File; import java.io.IOException; import java.util.Arrays; import javax.tools.JavaCompiler; import javax.tools.JavaFileObject; import javax.tools.StandardJavaFileManager; import javax.tools.ToolProvider; public class Example { public static void main(String[] args) { for (int i =0; i<10000;i++){ try { System.out.println(i); compile(); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | IOException e) […]

检测类文件时出错(asm.ClassWriter.getCommonSuperClass)

在仪器上获得错误 java.lang.RuntimeException: java.lang.ClassNotFoundException: Deposit at org.objectweb.asm.ClassWriter.getCommonSuperClass(Unknown Source) at org.objectweb.asm.ClassWriter.a(Unknown Source) at org.objectweb.asm.Frame.a(Unknown Source) at org.objectweb.asm.Frame.a(Unknown Source) at org.objectweb.asm.MethodWriter.visitMaxs(Unknown Source) at com.jConSequence.instrumentor.methodProber.AdddataBaseDetailsInstructions$AdddataBaseDetailsMethodInstructions.visitMaxs(AdddataBaseDetailsInstructions.java:131) at org.objectweb.asm.ClassReader.accept(Unknown Source) at org.objectweb.asm.ClassReader.accept(Unknown Source) at com.jConSequence.instrumentor.PrintLoadedClasses.print(PrintLoadedClasses.java:31) at com.jConSequence.tooGUI.RevEnggToolGUI.jButton1ActionPerformed(RevEnggToolGUI.java:487) at com.jConSequence.tooGUI.RevEnggToolGUI.access$0(RevEnggToolGUI.java:471) at com.jConSequence.tooGUI.RevEnggToolGUI$1.actionPerformed(RevEnggToolGUI.java:127) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown […]

想要并行运行非线程安全库 – 可以使用多个类加载器来完成吗?

我正在开发一个项目,在这个项目中,我们使用一个不保证线程安全(并且不是)的库和Java 8流场景中的单线程,它可以按预期工作。 我们希望使用并行流来获得低悬挂可扩展性的成果。 不幸的是,这导致库失败 – 很可能是因为一个实例干扰了与另一个实例共享的变量 – 因此我们需要隔离。 我正在考虑为每个实例(可能是本地线程)使用单独的类加载器,据我所知,这应该意味着,出于所有实际目的,我需要隔离,但我不熟悉为此目的故意构建类加载器。 这是正确的方法吗? 为了获得适当的生产质量,我该怎么做? 编辑:我被要求提供有关触发问题的情况的其他信息,以便更好地理解它。 问题仍然是关于一般情况,而不是修复图书馆。 我可以完全控制库创建的对象( https://github.com/veraPDF/ ) org.verapdf validation-model 1.1.6 使用项目maven存储库来存在工件。 true vera-dev Vera development http://artifactory.openpreservation.org/artifactory/vera-dev 目前,强化图书馆是不可行的。 编辑:我被要求显示代码。 我们的核心适配器大致是: public class VeraPDFValidator implements Function { private String flavorId; private Boolean prettyXml; public VeraPDFValidator(String flavorId, Boolean prettyXml) { this.flavorId = flavorId; this.prettyXml = prettyXml; VeraGreenfieldFoundryProvider.initialise(); } @Override […]

如何确定已加载类的绝对路径(如果有)?

是否有(兼容的,如果可能的话)确定加载类的绝对路径的方法? 当然,这并不总是可行的(如果你想到动态创建的类),但如果加载的Class在jar中,如何获取这个jar的绝对路径?

sun.reflect.CallerSensitive注释是什么意思?

@CallerSensitive注释在上面的方法中隐含了什么? 例如,注释存在于Class的getClassLoader方法中 @CallerSensitive public ClassLoader getClassLoader() { // }

Class#getClassLoader何时返回null?

说我有一些Java代码: public class Widget { …whatever } 还有一些代码可以加载Widget : ClassLoader widgetLoader = Widget.class.getClassLoader(); widgetLoader可以为null吗? 为什么/为什么不呢? 如果是这样,在什么情况下呢?

系统类加载器是否加载了类路径中的所有类,即使它们实际上没有被使用?

我正在使用JDK 1.6来运行一个小应用程序。 但是我设置了一个非常庞大的类路径,其中包含很多类。 当我运行应用程序时,即使它们实际上没有在我的应用程序中使用,也会加载类加载器中的所有类? 如果没有,如何强制类加载器这样做,如果是,如何避免它? 谢谢! 例如,我正在使用ant 1.7来运行我的应用程序。 最诚挚的问候,罗伯特吉

覆盖java中的类

假设我有一个项目K. K取决于lib.jar 在lib.jar ,有一个名为xyzFoo的类 如果我在K中创建相同的类xyzFoo ,那么在我创建Foo实例的这个项目中,现在JVM会在K而不是lib.jar使用Foo吗? 如果它不稳定或取决于某些东西,如何确保Foo应该使用K的版本而不是lib.jar ?

在这种情况下,JVM或reflection的新实例是否有用

我之前发过一个问题,但没有明确的解决方案 如何防止JFrame关闭 。 所以我发布的SSCCE可能有助于更好地理解所面临的问题 package myApp; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import javax.swing.JFrame; import App2.Applic2; public class MYApp { @SuppressWarnings({ “unchecked”, “rawtypes” }) public static void main(String arg[]){ JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setTitle(“Application frame 1”); f.setSize(200,200); f.setVisible(true); Class cls = Applic2.class; Object[] actuals = { new String[] { “” } }; Method m = […]