1. 程式人生 > 實用技巧 >java保證類不被回收

java保證類不被回收

1.答疑(總結:只有在程序不關閉的情況下類才不會被回收)

問:
  一個web應用中 初始化的時候會給一個類中的靜態成員變數賦值,
然後隔一段時間會改變成員變數中的值,這樣java會自動回收嗎?
如果長時間不改變成員變數的值會給我回收掉嗎?
如果回收的話有什麼辦法可以不讓他回收
?

答:

靜態類本身不會回收,但是如果你的程式執行在容器中(比如web程式),

而容器本身會回收,這種情況相當於關閉了你的程式。

那麼當然這些變數全部都沒有了。

你有兩個辦法,一個是根據容器的約定,阻止它回收。

比如說容器規定,10分鐘沒有使用者訪問,就回收你的程式,

那麼你就每幾分鐘自己撥測下自己,

產生一個響應,這樣就不會回收了。
還有一個辦法就是不斷將這些變數存入資料庫或者檔案中,

並且在啟動的時候載入,這樣就避免回收造成的資料丟失。

答:可以明確告訴你只要程式不結束,類的靜態成員變數是不會回收的

答:靜態變數是不會回收的,除非你的應用(如果是web應用,服務關閉)退出才會回收。

答:java虛擬機器標準,定義的static變數是隨服務主程序一同存在的。

即服務程序在,static變數就不會被回收。。。

通俗點,用tomcat部署的服務,只要服務還在,程式裡面定義的static變數就一直存在。
在你的描述中有“然後隔一段時間會改變成員變數中的值”。

對於全域性靜態變數,你需要在此處做好多執行緒同步問題。

防止資料髒讀髒寫。。。如果你的靜態變數是集合,

請分析情況設計多執行緒併發問題。

如果考慮不清楚,建議使用執行緒安全的集合。

2.程序不關閉

APP開發

linux(總結:這裡的思想是如何重啟程序)

1. 需求

    在實際編寫應用程式的時候,可能會出現如下場景,
你正在開發階段,但是你的上層,可能也要測試,
此時,你的程式不定時的因為某種原因會蹦掉,但其實你不關心,
因為在開發階段,具體原因留待以後解決,
此時,一個保證你程式能自動重啟的機制就需要了。
2. 正文 2.1 保證程序不退出的思路大致是這樣的: (1)用 ps 檢視程序 (2)在程序退出的時候,重啟程序 有了思路,我們還要確認的一點是,多長時間去執行一會這個步驟。假設10s,接下來便是用crontab來每10s檢視一下程序中有沒有ss.out程序,如果沒有,將重新啟動程序。
2.2 程式碼 crontab的設定如下: > crontab -e 這裡可能會提示沒有 /var/spool/cron/crontabs 這個資料夾,我們建立即可 > mkdir -p /var/spool/cron/crontabs 在彈出的編輯器裡輸入如下內容 * * * * * /home/root/retain_program.sh * * * * * sleep 10; /home/root/retain_program.sh * * * * * sleep 20; /home/root/retain_program.sh * * * * * sleep 30; /home/root/retain_program.sh * * * * * sleep 40; /home/root/retain_program.sh * * * * * sleep 50; /home/root/retain_program.sh 【1】crontab設定的意思是沒1分鐘,執行上邊程式碼中的內容,這個的意思就是每10s執行一次 /home/root/retain_program.sh 指令碼 接下來我們編寫 /home/root/retain_program.sh 指令碼 #!/bin/sh cnt=`ps | grep ss.out | grep -v "grep" | wc -l` if [ $cnt -eq 0 ] then echo `date` >> /home/root/1.txt /home/root/ss.out& fi 【1】在每次檢查到沒有 ss.out 程序的時候,把此時的時間追加的形式寫到1.txt中,並且重新啟動程序ss.out 啟動crontab守護程序 > crond

學習來源:

https://ask.csdn.net/questions/157613

//保證程序不關閉的方式

https://blog.csdn.net/lixuce1234/article/details/72866293

//linux中保證程序不退出

https://blog.csdn.net/qqliyunpeng/article/details/81321541

//程序原理

https://blog.csdn.net/qq_27320195/article/details/85236642