一葉笑天
雄關漫道真如鐵, 而今邁步從頭越。 從頭越, 蒼山如海, 殘陽如血。
BlogJava
首頁
新隨筆
新文章
聯系
聚合
管理
posts - 73,comments - 7,trackbacks - 0
<
2008年6月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
本博客的文章僅供本人學習之用,如果您閱讀后,認為不適合,請默默離開
。 本人不負責連帶責任。
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
留言簿
(4)
給我留言
查看公開留言
查看私人留言
隨筆分類
(65)
Eclipse技術(3)
Hibernate技術
Java EE技術(1)
JAVA技術(29)
Perl技術(2)
Shell技術(6)
Struts技術(3)
個人轉貼(5)
人生感悟(3)
開源技術(12)
網站技術(1)
隨筆檔案
(67)
2011年8月 (1)
2010年3月 (1)
2009年5月 (1)
2009年4月 (3)
2009年3月 (1)
2009年2月 (1)
2009年1月 (3)
2008年12月 (12)
2008年9月 (2)
2008年8月 (11)
2008年7月 (8)
2008年6月 (22)
2005年9月 (1)
鏈接博客
oksonic博客
Struts2
搜索
最新評論
1.?re: 使用AutowiringRequestProcessor整合struts和Spring2.0
1. 這種autowire的注入支持兩種不同的方式,分別是byName和byType,默認是byType。我想這對于絕大多數開發者來說是夠了。
請問怎么配置方式為byName呢?
--AUTOCHECK
2.?re: [轉貼]Spring JTA應用之JOTM配置[未登錄]
請問能夠將dao層的代碼貼出來嗎? 或者直接將源碼掛出來
--111
3.?re: Struts2邊學邊練(3)-Struts2集成Hibernate完成CRUD操作[未登錄]
原微軟大中華區副總出任Teradata大中華區總裁@micheal
--dd
4.?re: Struts2邊學邊練(3)-Struts2集成Hibernate完成CRUD操作[未登錄]
加入你的USER對象要是有100個字段,你的edit頁面怎么處理?
--micheal
5.?re: SCJP-031-055備戰筆記-1.3-Java5中基本數據類型
4:java中的char不屬于整數類型!!!作者是不是搞錯了???
--hdwt
閱讀排行榜
1.?使用Eclipse遠程調試(翻譯)(6004)
2.?[轉貼]Spring JTA應用之Atomikos配置 (4157)
3.?PHPBB3安裝上路(3572)
4.?Maven2新手上路(3243)
5.?Internal error - the selected file is a system file that cannot be modified的解決方法(2878)
評論排行榜
1.?Struts2邊學邊練(3)-Struts2集成Hibernate完成CRUD操作(2)
2.?春(2)
3.?SCJP-031-055備戰筆記-1.3-Java5中基本數據類型(1)
4.?[轉貼]Spring JTA應用之JOTM配置(1)
5.?使用AutowiringRequestProcessor整合struts和Spring2.0(1)
Effective Java (2nd Edition)讀書筆記-Item 6: 清除不用的對象引用
Java語言中給人的印象是不需要考慮內存管理,但是這種理解是不正確的,看下面的簡單stack實現代碼:
1
//
Can you spot the "memory leak"?
2
public
class
Stack
{
3
private
Object[] elements;
4
private
int
size
=
0
;
5
private
static
final
int
DEFAULT_INITIAL_CAPACITY
=
16
;
6
7
public
Stack()
{
8
elements
=
new
Object[DEFAULT_INITIAL_CAPACITY];
9
}
10
11
public
void
push(Object e)
{
12
ensureCapacity();
13
elements[size
++
]
=
e;
14
}
15
16
public
Object pop()
{
17
if
(size
==
0
)
18
throw
new
EmptyStackException();
19
return
elements[
--
size];
20
}
21
22
/** */
/**
23
* Ensure space for at least one more element, roughly doubling the capacity
24
* each time the array needs to grow.
25
*/
26
private
void
ensureCapacity()
{
27
if
(elements.length
==
size)
28
elements
=
Arrays.copyOf(elements,
2
*
size
+
1
);
29
}
30
}
這段代碼看上去沒有什么錯,每次測試的時候都可以成功。但是這里有一個潛在的問題,泛義的講就是程序存在內存泄漏,由于不斷增加的垃圾回收器活動或者增加的內存訪問,而使性能降低被暴露出來。極端情況下,這種內存泄漏會導致磁盤頁面訪問甚至程序出現OutOfMemoryError的錯誤。但是這種錯誤是很少出現的。
當stack增長和收縮時,即使程序不再使用它們,出棧的對象不會被垃圾收集。由于stack維護著這些對象的過時的引用。這種過時的引用是一種不再被重新引用的簡單引用。在這種情況下,任何出了活動區的元素引用都是過時的。活動區包含著一個小于size的元素index。
具有垃圾回收器的語言,也稱為無意的對象保持,內存泄漏是潛在的。如果一個對象是無意的保持,不僅垃圾回收器不能包含他們,而且其他任何對象也不能引用它們。
修改這種錯誤的方法很簡單,一旦他們不再使用,設置它的引用為null。例如stack類,當元素出棧后就會變成不再使用的對性。正確的pop函數應該這樣寫:
1
public
Object pop()
{
2
if
(size
==
0
)
3
throw
new
EmptyStackException();
4
Object result
=
elements[
--
size];
5
elements[size]
=
null
;
//
Eliminate obsolete reference
6
return
result;
7
}
設置過時的對象引用為null的另外一個好處是,如果它們被錯誤的重新引用,程序會立即拋出NullPointerException,而不是靜靜的做錯誤的事情。
當程序員第一次遇到這種問題后,他們可能會過度在每個對象引用后設置為null。這是不需要而且不可取的。設置對象引用為null應該是一個例外,而不是一個準則。消除這種過時對象引用的最好方法是讓包含引用的變量在范圍外訪問時發生錯誤。
設置引用為null的時機是什么?Stack的的那些方面容易遭受內存泄漏?簡單的說就是管理自己的內存。存儲池保持著一個元素列表,這個列表中處于活動區的元素是被分配的。列表中剩余的元素是空閑的。垃圾回收器不知道這些。對于垃圾回收器,所有列表中的元素都是有效的。只有程序員知道列表中不活動的部分是不重要的。程序員只有設置不活動的部分為null時,垃圾回收器才能感知到。
總的來說,任何時候,當一個類管理自己的內存,程序員應該警惕內存泄漏。當元素釋放的時候,包含元素的對象引用應該設置為null。
另外一個內存泄漏的例子是緩存cache。當你把一個對象引用放進cache,很容易遺忘掉在它變為不相關的時候它還在cache中。解決這種問題的方法是將cache表示成為一個WeakHashMap,入口點將會在他們過時的時候自動刪除。記住,WeakHashMap只在當一個期望的cache入口在被外面的引用到key,而不是值的時候才是有用的。
更為常見的是,cache的缺少好的有用生命周期定義。在這種情況下,cache應該在當entry沒有用的時候清除它們。可以通過后臺線程(Timer或者ScheduledThreadPoolExecutor)或者as a side effect of adding new entries to the cache來實現。LinkedHashMap類用removeEldestEntry方法實現了后者方式。對于好的cache,應該直接使用java.lang.ref。
第三種常見的內存泄漏的例子就是監聽器和一些回調listeners and other callbacks.如果你實現一個API,客戶注冊回調但是不顯式的注銷回調,它們就會堆積起來,除非你采取措施。確保回調被垃圾回收的最好方式是存儲weak reference給它們,例如將它們僅僅作為key存儲在WeakHashMap中。
因為內存泄漏是典型的沒有明顯的錯誤特征,它們可能在一個系統中保持數年。但是它們可以被仔細的代碼檢查或者heap profiler這樣的調試工具發現。因此,需要預知這些問題而且避免它們的發生。
posted on 2008-06-23 10:53
一葉笑天
閱讀(379)
評論(0)
編輯
收藏
所屬分類:
JAVA技術
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
樹的遍歷(轉貼)
轉貼:java類加載內幕
[轉貼]用Java Socket開發小型服務器收藏
[轉貼]Java調用dos命令
轉貼:全世界所有程序員都會犯的錯誤-蔡學鏞
SCJP-031-055備戰筆記-4.1-Java5中基本類型的轉換
SCJP-031-055備戰筆記-4.4-Java5中引用類型的轉型
SCJP-031-055備戰筆記-4.3-Java5中引用類型的轉換
SCJP-031-055備戰筆記-4.2-Java5中基本類型的轉型
SCJP-031-055備戰筆記-3.5-Java5中的strictfp,synchronized,transient修飾符
Copyright ©2025 一葉笑天 Powered By
博客園
模板提供:
滬江博客
主站蜘蛛池模板:
亚洲一级特黄特黄的大片
|
美女视频黄免费亚洲
|
国产高清对白在线观看免费91
|
a级片免费在线观看
|
亚洲视频人成在线播放
|
免费国产高清毛不卡片基地
|
国产中文字幕免费
|
特黄特色的大片观看免费视频
|
亚洲AV无码乱码在线观看性色扶
|
国产av无码专区亚洲av毛片搜
|
免费人成在线观看播放国产
|
成人无码视频97免费
|
亚洲免费人成在线视频观看
|
中文字幕日本人妻久久久免费
|
亚洲AV永久无码区成人网站
|
中文字幕亚洲日韩无线码
|
WWW免费视频在线观看播放
|
亚洲AV综合色区无码一区爱AV
|
久久精品国产影库免费看
|
亚洲码一区二区三区
|
亚洲视频在线观看视频
|
免费观看无遮挡www的视频
|
亚洲日韩中文字幕无码一区
|
免费人成无码大片在线观看
|
91成人免费福利网站在线
|
亚洲综合色丁香麻豆
|
全免费一级毛片在线播放
|
水蜜桃视频在线观看免费
|
亚洲国产天堂在线观看
|
好男人www免费高清视频在线
|
免费视频精品一区二区
|
久久精品视频亚洲
|
国产大片51精品免费观看
|
永久免费A∨片在线观看
|
亚洲av一本岛在线播放
|
亚洲国产精品成人AV无码久久综合影院
|
免费网站观看WWW在线观看
|
亚洲日本VA午夜在线电影
|
亚洲欧洲日产国码无码网站
|
亚洲成在人线aⅴ免费毛片
|
国产97视频人人做人人爱免费
|