?
在一個(gè)jvm實(shí)例的內(nèi)部,類型信息被存儲(chǔ)在一個(gè)稱為方法區(qū)的內(nèi)存邏輯區(qū)中。類型信息是由類加載器在類加載時(shí)從類文件中提取出來(lái)的。類(靜態(tài))變量也存儲(chǔ)在方法區(qū)中 如果上面寫的是對(duì)的,那么在我們靜態(tài)變量用多了的情況下,就會(huì)出現(xiàn)java.lang.OutOfMemoryError: PermGen space 所以那個(gè)permSize一直不釋放是合理的,因?yàn)閟tatic變量JVM一般情況下是不會(huì)去回收。我剛才看了一下我們狀態(tài)的所有JAR包也只有一百二十幾M,但是為什么我們?cè)O(shè)年MaxPermSize為占用百分之九十幾?而且一直在往上增長(zhǎng),這就說(shuō)明初始化加載class的時(shí)候加載class字節(jié)碼,meta信息之外,Perm方法區(qū)會(huì)隨著程序的運(yùn)行而不斷增大,這時(shí)候,問(wèn)題就來(lái)了。所以static變量得慎用啊。。。。。
除了上述的內(nèi)容會(huì)存儲(chǔ)在方法存儲(chǔ)區(qū)或永久存儲(chǔ)區(qū)之外(Pernanet Gerneration)
,還有:要加載類的信息(名稱,修飾符等),類中的靜態(tài)變量,類中定義為final
類型的常量,類中的Field信息,類中的方法,當(dāng)開發(fā)人員在程序中通過(guò)Class對(duì)象
的getName,isInterface等方法來(lái)獲取信息時(shí),這些數(shù)據(jù)都來(lái)源瑜方法區(qū),
在一定的條件下也會(huì)被GC,當(dāng)方法區(qū)域要使用的內(nèi)存超過(guò)其允許的大小時(shí),
會(huì)拋出OutOfMemory的錯(cuò)誤信息。
?
?
static成員變量得慎用 有木有? 特別是那種會(huì)一直增加的static成員變量
?
那有的東西必須保存在內(nèi)存中,那怎么辦?除了perm永久方法存儲(chǔ)區(qū)之外,不是不家堆棧嗎?
?
那我們就可以把我們的程序設(shè)置單實(shí)例的,或者搞一個(gè)工廠方法去取這個(gè)類的實(shí)例就OK了。
?
說(shuō)到單實(shí)例,必須說(shuō)明一點(diǎn),我們靠Spring去維護(hù)單實(shí)例不靠譜,Spring的單實(shí)例只限于單個(gè)IOC容器內(nèi),但是一個(gè)JVM中可以存在多個(gè)IOC容器,特別是多人開發(fā),然后又是基于JAR包的作合作時(shí),出出問(wèn)題還搞不清楚到底是哪里的問(wèn)題。所以。。。。利用Spring來(lái)保持程序的單實(shí)例可以,但最好這種單例只有某個(gè)模塊用,而不會(huì)涉及到別的部門會(huì)引用到的情況,比如那個(gè)狀態(tài)中的緩存隊(duì)列用Spring來(lái)維持它的單實(shí)例,從設(shè)計(jì)的角度看,這是不靠譜的,一個(gè)服務(wù)需要單實(shí)例,需要從設(shè)計(jì)的角度讓其去單實(shí)例,而不是基于使用者合理的使用Spring的基礎(chǔ)上去控制其單實(shí)例,如果有一個(gè)人new ApplicationContext(.. ) 創(chuàng)建了一個(gè)IOC怎么辦?那不就造成了上次狀態(tài)造成的OOM了嗎?
?
保證唯一實(shí)例的方法多的去了,工廠行嗎?單實(shí)例行嗎?
?
?
隨感一下。
?
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
