Java 类在退出应用程序时未卸载(Web start)?

Java 类在退出应用程序时未卸载(Web start)?,java,multithreading,classloader,java-web-start,Java,Multithreading,Classloader,Java Web Start,我在一个客户端-服务器应用程序(web start)中工作,该应用程序由url http:\[ip of server]:[port]启动。它在浏览器中加载index.html,主应用程序在另一个窗口中弹出,这里我们有几个选项可以查看/执行状态/操作 最近我遇到了一个服务器状态显示为未知的问题,这是默认的,但在加载应用程序后应该加载它。我找到了它的原因,该方法显示服务器在启动时执行的状态,所以我使用while循环检查应用程序是否加载,然后我执行了该方法。成功了 但如果我退出弹出窗口(主应用程序)

我在一个客户端-服务器应用程序(web start)中工作,该应用程序由url http:\[ip of server]:[port]启动。它在浏览器中加载index.html,主应用程序在另一个窗口中弹出,这里我们有几个选项可以查看/执行状态/操作

最近我遇到了一个服务器状态显示为未知的问题,这是默认的,但在加载应用程序后应该加载它。我找到了它的原因,该方法显示服务器在启动时执行的状态,所以我使用while循环检查应用程序是否加载,然后我执行了该方法。成功了

但如果我退出弹出窗口(主应用程序)并刷新主浏览器窗口中的url,应用程序将成功弹出,但没有服务器状态,服务器状态无关。这让我想到,在剪切弹出窗口时,serverStatus类并没有卸载

我试图了解类加载器,但没有得到任何信息,也无法在应用程序源代码中找到任何关于类加载/卸载的信息

请有人指导或参考一种可以解决我问题的学习材料

请原谅,如果我问不清楚确切的问题,请询问是否需要更多信息。提前谢谢

更改后的代码如下:

@Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException
    {
 PrintWriter out = new PrintWriter(
                new OutputStreamWriter(response.getOutputStream(), "UTF-8"));

synchronized(this){
while(!notCompleted){
Thraed.sleep(100)}
out.println("<LABEL><B>" + discoveryStatusLabel_ +
                        "&nbsp;:</B></LABEL>&nbsp;<SPAN ID='DiscoveryStatus'>" +
                        discoveryStatus_ + "</SPAN>");}
}
@覆盖
public void doGet(HttpServletRequest请求、HttpServletResponse响应)
抛出IOException、ServletException
{
PrintWriter out=新的PrintWriter(
新的OutputStreamWriter(response.getOutputStream(),“UTF-8”);
已同步(此){
而(!未完成){
Thraed.睡眠(100)}
out.println(“+discoveryStatusLabel\u+
" : " +
发现状态“+”);}
}
其中我添加了while循环,notCompleted是变量,用于检查应用程序是否已完全加载。
注意:除此之外,
doGet()
synchronized block
中还有更多的代码

您的运行时没有结束,因此实际上无法保证类是由GC卸载的——即使您调用
System.GC()
(尽管SUN JRE GC确实在这里收集)。此外,一个类(及其类加载器)只有在没有强引用指向该类加载器加载的类的情况下才有资格进行垃圾收集-因此,如果您有单例或枚举,它们很可能会阻止卸载它们正在引用的类(以及它们自己)和类加载器是的,事实上是这样的,因为我可以看到java控制台仍在打开,它显示了大量内存消耗,即使主应用程序退出,但主浏览器仍加载index.html。若我也退出主浏览器窗口,那个么当应用程序作为新的应用程序启动并具有适当的服务器状态时,问题就解决了。此外,我可以看到代码中使用的许多枚举以及静态枚举。我认为它没有问题吗?浏览器本身并不是问题,因为它只存储一个“静态”页面,它可能包含脚本,以便与服务器或应用程序“动态”交互。您应该澄清您所说的
是什么意思,即使主应用程序退出了
——那么java进程已经完成了吗?要检测内存泄漏,请使用VisualVM、JProfiler或Eclipse内存分析器等配置文件,在不同的“步骤”创建堆转储并相互比较。接下来,我认为您的代码片段没有显示任何有用的内容。您的睡眠方法是浪费CPU时间的-使用Java提供的一种锁定机制,使用
wait()
notify()
或更好的方法,我们既不知道变量是如何定义的,也不知道这些值来自何处。