![]() |
1
11
|
![]() |
2
16
正如Ryan指出的,有一个
bug
在JVM中,影响Windows平台。
解决方法很简单:在读取打开的jar文件后关闭它们。然而,为了获得打开的jar文件的句柄,我们需要使用反射,因为我们需要遍历的属性不是公共的。所以我们沿着这条路走
关闭打开的jar文件的代码可以添加到扩展URLClassLoader的类中的close()方法中:
(此代码取自Ryan发布的第二个链接。此代码也发布在错误报告页上。)
然而,有一个陷阱:
为了使这段代码能够工作并能够获得打开的jar文件的句柄来关闭它们,URLClassLoader实现用来从文件中加载类的加载程序必须是
整个类加载代码应该如下所示:
更新:
JRE 7引入了
|
![]() |
3
3
因此,在这种特殊情况下,即使使用Java1.8.0\u74,仍然需要一个hack,下面是我的hack https://github.com/essobedo/application-manager/blob/master/src/main/java/com/github/essobedo/appma/core/util/Classpath.java#L83 我在这里用的 https://github.com/essobedo/application-manager/blob/master/src/main/java/com/github/essobedo/appma/core/DefaultApplicationManager.java#L388 . 即使使用了这种方法,我仍然必须显式地调用GC来完全释放jar文件,正如您在这里看到的那样 https://github.com/essobedo/application-manager/blob/master/src/main/java/com/github/essobedo/appma/core/DefaultApplicationManager.java#L419 |
![]() |
4
1
这是
成功的java 7
我的重装机
关闭并重新启动ClassReloader
然后你可以用新版本重新启动应用程序。
不要将jar包含到基类加载器中”
|
![]() |
5
0
|
![]() |
6
0
更好的解决方案是修改
|
|
ramireeez · Remove方法,从对象数组中移除对象 6 年前 |