簡體   English   中英

戰爭servlet中的泄漏內存與tomcat

[英]Leak memory in war servlet with tomcat

當我嘗試在我的工作servlet中實現一個新函數時,我遇到了一些問題。

現在我有一個手機可以注冊的servlet。 手機使用rest來注冊這個servlet。 它完美無缺。 無論何時嘗試注冊手機,都可以。

但現在,我需要添加一個新功能。 我想將此服務器注冊到我的基礎架構的其他組件。

我希望在開始時完成注冊。 我的意思是,當servlet啟動時,進行注冊並忘記它,就像以前一樣工作。

這是tomcat給我的錯誤:

Grave: The web application [/servletRegister] appears to have started a thread named [Timer-8] but has failed to stop it. This is very likely to create a memory leak.

這是我的開始課程:

@Override
public Set<Class<?>> getClasses() {
    //-------------------------------
    //Set registration here
    //GatewayRegistrationHandler reg = GatewayRegistrationHandler.getInstance(); 
    //reg.registerDevice();
    //-------------------------------
    //register on a new thread due to process time      
    new Thread (new RegisterGatewayOnBackground()).start();

    //Next are the working servlet code
    Set<Class<?>> classes = new HashSet<Class<?>>();
    classes.add(PublicationsResource.class);  /
    classes.add(DeviceResource.class);
    return classes;
}

}

我首先嘗試了注釋行。 然后我得到了內存泄漏,我試圖在一個新的線程中執行它們,試圖避免泄漏。 但行為是一樣的。

后台功能是這樣的:

public class RegisterGatewayOnBackground implements Runnable {
    public RegisterGatewayOnBackground() {
    }   
    public void run() {
        registerDevice();
    }
    private void registerDevice() {         
          GatewayRegistrationHandler reg = GatewayRegistrationHandler.getInstance(); 
          reg.registerDevice();   
    }
}

GatewayRegistrationHandler工作正常,因為當我運行servlet時,它會執行,進行注冊,然后崩潰。 我認為這是一個時間問題,背景會解決它,但我被困在這里,因為背景做同樣的事情。

我不知道有什么方法可以檢查我的內存泄漏位置。 我正在尋找建議或任何可能幫助我解決問題的工具。

當你開始這樣的線程時,它不會被命名為“Timer-x”。 因此,這可能是其他地方開始的一個主題。

tomcat給你的消息表明webapp以某種方式被取消部署(然后它檢查仍然存在的線程,如果存在則進行抱怨)。 我不確定為什么取消部署正在發生,但如果是因為你正在停止webapp,你可能不需要解決這個問題,除非你做(很多)熱部署(在保持tomcat運行的同時部署和取消部署)。 這是因為,如果它在你要殺死進程之前泄漏內存,那么內存泄漏不會有任何傷害,而且修復它會浪費時間。

如果你想修復它,一個簡單的方法是掛鈎一個探查器,看看誰啟動了這個“Timer”線程。

暫無
暫無

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

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