推 jerryh001: 你有檢查thread結束了嗎? 會不會只是還沒切換到那個th 12/05 20:44
→ jerryh001: read 12/05 20:44
→ stupid0319: 你知道8*1024*1024要多少個分頁嗎 12/05 21:01
我有cat /proc/${pid}/status看過,最後Threads=1。
malloc要多少個分頁會有影響嗎?我設這麼大是想說如果沒free到應該會很明顯。
不過我的程式不會佔到那麼大,這個動作大概做1000次才會多吃1Mib左右的空間。
※ 編輯: Lipraxde (223.136.241.143), 12/05/2017 21:15:24
→ stupid0319: 感覺pthread_detach放的位置很奇怪...是我的錯覺嗎 12/05 21:09
我是看網路上有人這樣用 OwO
※ 編輯: Lipraxde (223.136.241.143), 12/05/2017 21:21:50
→ stupid0319: 假如主線程跑比較多迴圈,而執行緒卡住這種情況呢? 12/05 21:37
不太懂你的意思,我都在pthread_exit前一道指令free的,如果有thread卡住的話剩下的
thread應該不會只有1條。
※ 編輯: Lipraxde (223.136.241.143), 12/05/2017 21:45:44
推 Qbsuran: detach位置沒問題 malloc在某些情況不是thread safe 12/05 21:43
我有對malloc、free加互斥鎖過,結果一樣。(這個example比較單純,應該還好)
※ 編輯: Lipraxde (223.136.241.143), 12/05/2017 21:47:59
→ galic: detach沒問題 他只是改狀態而已 12/05 21:48
→ galic: 先報個環境版本上來吧 glibc kernel等等 12/05 21:49
OK,glibc版本2.26(其他有更新在上面)
→ galic: malloc和free從很早開始就一直都是thead safety 12/05 21:49
推 jasonwu23: 看起來沒問題 有沒有完整一點的程式碼 我想看會一點點 12/05 22:01
→ jasonwu23: 增加的版本 有可能別的地方leak 12/05 22:01
https://ideone.com/SKWT5Q
這個是我把遇到的情況簡化過的,它的確會慢慢變大,for迴圈多跑個幾次就看的出來。
還是你是想看我的作業>///<,已經被我改成在main裡面free了 @w@
※ 編輯: Lipraxde (223.136.241.143), 12/05/2017 22:14:17
→ galic: 我猜啦 你配置的記憶體很大 glibc會改用mmap/munmap 12/05 22:20
→ galic: 這會比小記憶體用的brk/sbrk方法慢上許多 12/05 22:20
→ galic: 你可以用malloc_stats() 觀察 12/05 22:21
用malloc_stats看了之後覺得很奇怪,每次in use bytes都增加1184 bytes,那是啥?
是說我試過配置較小的記憶體了,不過用量還是會慢慢變大...
※ 編輯: Lipraxde (223.136.241.143), 12/05/2017 22:41:25
→ galic: 小是多小? 預設是超過128*1024就會用mmap 12/05 22:46
8個byte~
※ 編輯: Lipraxde (223.136.241.143), 12/05/2017 23:04:45
推 Killercat: valgrind跑一次看看 這個應該抓得出來 12/05 23:11
→ galic: 同樓上 我用相似環境跑沒問題... 用valgrind跑吧 12/05 23:19
→ galic: 然後你所謂的"記憶體用量" 是從哪邊觀察的? 12/05 23:20
用top跟你說的malloc_stats看的,不然我明天用valgrind、換台電腦試試看好了。
(好像在哪邊看到說free不一定會馬上還給系統,不過應該不是這個問題。因為我free完用
malloc可以得到相同的位置,可是還是會越吃越多Q_Q)
※ 編輯: Lipraxde (223.136.241.143), 12/05/2017 23:25:29
推 Bencrie: 都要跑 valgrind 了就直接用它測記憶體用量吧 12/06 10:46
→ Bencrie: google 一下 valgrind massif 12/06 10:47
→ galic: XD 竟然能用top觀察到 這程式跑沒幾秒 12/06 10:56
改成無窮迴圈一直跑就能看到它越來越大隻了。
用valgrind看有時候有still reachable: 1,612 bytes in 4 blocks,有時候又沒有。
偶爾還底下還會出現:ERROR SUMMARY: 1 errors from 1 contexts。
※ 編輯: Lipraxde (140.118.202.43), 12/06/2017 12:05:53
→ galic: still reachable的那個別管他 pthread_create配置的空間 12/06 13:29
→ galic: thread死掉不會歸還 為了效能 下次pthread_create會reuse 12/06 13:30
→ galic: 很多std library實作上都有類似操作 光malloc系列有一大堆 12/06 13:31
→ Lipraxde: pthread會reuse的話應該不會一直無限膨脹阿。 12/06 13:47
→ Lipraxde: 如果是在main裡面用pthread_join把指標接回來free,過一 12/06 13:47
→ Lipraxde: 陣子自己就會變回遠本的大小了。(而且沒有still reachab 12/06 13:47
→ Lipraxde: le) 12/06 13:47
→ Lipraxde: 我之後應該會避免這樣用吧,雖然變大的速度不快但是看起 12/06 13:47
→ Lipraxde: 來真的很不舒服。 12/06 13:47
→ galic: 我的意思是你從valgrind觀察到的still reachable是pthread 12/06 14:00
→ galic: 走detach的話沒辦法free pthread create的空間 但是下次 12/06 14:01
→ galic: pthread create的時候會去reuse 若沒被reuse 整個程式結束 12/06 14:02
→ galic: 後 還是能正確的被OS回收 所以這種std library實作造成的 12/06 14:02
→ galic: 常見的still reachable 並不算是真正的memory leak 12/06 14:02
→ galic: 也不該是造成你程式記憶體不斷膨脹的主因 12/06 14:03
→ Lipraxde: 恩,瞭解了…那真正的問題是出在error發生的時候嗎?那 12/06 14:07
→ Lipraxde: 次的still reachable特別大。 12/06 14:07
→ galic: 下"--leak-check=full --show-leak-kinds=reachable"看看 12/06 14:23
→ galic: 看看特別大的那次是誰造成的 XD 12/06 14:24
→ galic: 你提了之後我才想到 你改成全部由malloc的thread來free之後 12/06 14:25
→ galic: 狀況就不存在 所以問題可能出在由不同thread來malloc和free 12/06 14:25
→ Lipraxde: 我剛剛想到之前用malloc_stats看的時候的確是有一直增加 12/06 14:48
→ Lipraxde: 記憶體用量(每做一次多佔用1184bytes),跟用valgrind得 12/06 14:48
→ Lipraxde: 到的log不太一樣。 12/06 14:48
→ Lipraxde: 那個error是偶然間跑出來的,目前只出現一次QQ 12/06 14:48