Как сказать, какие потоки производят весь мусор? - PullRequest
2 голосов
/ 27 мая 2010

У меня есть приложение с около 15 потоков. Большинство занимаются мирскими делами и спят большую часть своей жизни. Другие собирают информацию и кэшируют ее в хэш-картах. Хэшмапы растут до умеренного размера и выравниваются. Количество ключей и размер значения остаются постоянными, но содержимое значений изменяется (в среднем 33 ключа в секунду).

Когда я запускаю свое приложение, я замечаю, что интервал сбора мусора увеличивается от нескольких минут до одного раза в секунду, а количество мусора составляет 700 000+ каждый раз.

На самом деле, когда я писал это, мой телефон перезагружался с ошибкой «Переполнение ссылки».

Вот мой вопрос: есть ли уловки, чтобы определить, какие потоки производят мусор, или даже узнать больше о том, какой мусор они производят?

05-26 22:08:57.052 W/dalvikvm( 1031): ReferenceTable overflow (max=512)
05-26 22:08:57.052 W/dalvikvm( 1031): Last 10 entries in JNI local reference table:
05-26 22:08:57.052 W/dalvikvm( 1031):   502: 0x449904a8 cls=Ljava/lang/String; (28 bytes)
05-26 22:08:57.052 W/dalvikvm( 1031):   503: 0x4494fda8 cls=Ljava/lang/String; (28 bytes)
05-26 22:08:57.052 W/dalvikvm( 1031):   504: 0x44a172c8 cls=Ljava/lang/String; (28 bytes)
05-26 22:08:57.052 W/dalvikvm( 1031):   505: 0x448c7900 cls=Ljava/lang/String; (28 bytes)
05-26 22:08:57.052 W/dalvikvm( 1031):   506: 0x44842b18 cls=Ljava/lang/String; (28 bytes)
05-26 22:08:57.052 W/dalvikvm( 1031):   507: 0x448e9eb8 cls=Ljava/lang/String; (28 bytes)
05-26 22:08:57.052 W/dalvikvm( 1031):   508: 0x449c6ae0 cls=Ljava/lang/String; (28 bytes)
05-26 22:08:57.052 W/dalvikvm( 1031):   509: 0x44998138 cls=Ljava/lang/String; (28 bytes)
05-26 22:08:57.052 W/dalvikvm( 1031):   510: 0x44961ae0 cls=Ljava/lang/String; (28 bytes)
05-26 22:08:57.052 W/dalvikvm( 1031):   511: 0x448ee470 cls=Ljava/lang/String; (28 bytes)
05-26 22:08:57.060 W/dalvikvm( 1031): JNI local reference table summary (512 entries):
05-26 22:08:57.060 W/dalvikvm( 1031):   487 of Ljava/lang/String; 28B (487 unique)
05-26 22:08:57.060 W/dalvikvm( 1031):    25 of Ljava/lang/String; 36B (25 unique)
05-26 22:08:57.060 W/dalvikvm( 1031): Memory held directly by native code is 14536 bytes
05-26 22:08:57.068 E/dalvikvm( 1031): Failed adding to JNI local ref table (has 512 entries)
05-26 22:08:57.068 I/dalvikvm( 1031): "BT EventLoop" prio=5 tid=81 RUNNABLE
05-26 22:08:57.068 I/dalvikvm( 1031):   | group="main" sCount=0 dsCount=0 s=N obj=0x447cd620 self=0x4d7b38
05-26 22:08:57.068 I/dalvikvm( 1031):   | sysTid=1138 nice=0 sched=0/0 cgrp=default handle=4210840
05-26 22:08:57.068 I/dalvikvm( 1031):   at dalvik.system.NativeStart.run(Native Method)
05-26 22:08:57.068 I/dalvikvm( 1031): 
05-26 22:08:57.068 E/dalvikvm( 1031): VM aborting
05-26 22:08:57.185 I/DEBUG   (  990): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

1 Ответ

1 голос
/ 27 мая 2010

Существует Отслеживание распределения .

Еще одна вещь, которую стоит рассмотреть, пытались ли вы использовать WeakReferences в своих хэш-картах?

...