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

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