«Java-frame» GC түбірі сілтемесін jvisualvm-ге үйінділерді тастаған кезде Runnable-ге қалай жоюға болады?

Қолданбамдағы жадтың ағып кетуін тексеру үшін jvisualvm пайдаланамын. Қоқыс төгіндісін жасаған кезде, кейде қоқыс жиналған болуы керек, бірнеше нысан ашылды.

When I do a "Show Nearest GC Root" command on them, it shows me that the root is a class which I defined which implements the interface Runnable. The reference is listed as (java frame), which I know has something to do with threading. When I expand the tree for this node, it opens up and shows . So it seems pretty clear that this is not a reference I'm keeping open, but something internal to Java.

Jvisualvm ішінде тізімделген GC Root нысаны AnalyticNode торапты кеңейтеді , ол торабы Runnable іске асырады . Бұл түбірлік объект «AWT», «Swing» немесе «ауыр» салмақты пайдаланушы интерфейсінің құрамдас бөліктеріне қарамастан, «кадр» сөзіне қарамастан ештеңе жоқ. Бұл жағдайда «кадр» сөзі дәнекерлеуді білдіреді.

Сонымен, Java осы ашық өткізетін болар еді соңғы Runnable сілтемесі бар ма? Яғни Java-ді бұл сілтемемен босату үшін айта аламын ба, сонда ол қоқыс төгу үшін дұрыс қоқыс жиналуы мүмкін бе?

Мұнда не болып жатыр?

3
«Даналар» панелінде сіз жинаған дұрыс деп санайтын дананы таңдауға, тінтуірдің оң жағын басып, контекстік мәзірден «Көрсеткіштерде көрсету» пәрменін таңдауға бола ма? Егер солай болса, ол не дейді?
қосылды автор erickson, көзі

2 жауаптар

Бұл тұрғыда «кадр» стека кадрға жатады. Бұл Runnable сияқты жұмыс істейді, оның орнына орындалатын ағынның мақсаты болып табылатын (немесе қосымша) орындалатын жіптің стексіндегі жергілікті айнымалы мәнде сақталады. Жиынға байланысты әдіс қайтарылатын кезде ол жинауға рұқсат етіледі.


Кейінгі түсініктемелерге сүйене отырып, менің ойымша, сіздің реттелетін тақырыптық пулында Runnable тағайындалған жергілікті айнымалы мән бар. Мүмкін, бұл ауқымның ауқымы (циклдің сыртында) және циклдің әрбір итерациясынан кейін тазаланбайды ( null тағайындалады).

Мен жұмысшы ағынында осындай кодпен сипатталғанға сәйкес келетін жағдайды ойната аламын:

Runnable target = null;
while (true) {
  target = queue.take();
  target.run();
}

target туралы декларацияны тазалаңыз, ол бұл цикл ішіндегі мәселені шешеді.

Мен негізгі Java-ден Орындаушы енгізуді ауыстыруды немесе түзету қажет болса, реттелетін жұмыс ағыны пулын тиісті кодын орналастыруды ұсынамын.

4
қосылды
@ErickRobertson Сіз JSE-ден Орындаушы қолданасыз ба? Қандай ендіру класы?
қосылды автор erickson, көзі
Егер бұл жергілікті ядро ​​айнымалы Java ядросында сақталған болса, онда ол jvisualvm үйіндісінде пайда болмайды ма? Жүйедегі кез-келген басқа нысанның барлығына сілтемелердің толық тізбесі бар. Сондықтан осы объектке кез-келген сілтеме үйдің сыртында орналасқан деп ойлаймын.
қосылды автор Erick Robertson, көзі
Бинго! Бұл бірдей үлгі емес еді, бірақ бұл дәл солай болды. Сілтеме ағымдық стекке жергілікті айнымалы мәнде болды, ол басқа Runnable күтіп тұрған кезде әлі де ұсталып тұрды. Үлкен жауап үшін рақмет!
қосылды автор Erick Robertson, көзі
Айтпақшы, мен Executor қызметіне де қараймын. Мен оны алғаш рет қарап шыққан кезде, мен оны толығымен толтырдым, мен оның ерекшеліктерінің көпшілігіне мұқтаж емеспін. Енді мен оған қараймын, өте қарапайым. Ауыстыруға және тестілеуге арналған бірнеше код сызығы ғана көрінеді, сондықтан ол менің фондық жобалар тізімінде. Оны екі жолмен теңестіріп, жақсы шешім қабылдауға оңай болады. Көмектесуіңізге және оқуыңызға рахмет.
қосылды автор Erick Robertson, көзі

Сіз жасаған нысанмен не істедік? Сіз оны жасайсыз ба? Бұл жағдайда жүгірістің орындалуын аяқтауға мүмкіндік беретін жіптің тоқтағанына көз жеткізіңіз.

1
қосылды
Нысан жұмыс ағыны пулына, ол қажет болғанда, беріледі. Жібітуге тыйым салынған күйде, нысан толығымен сілтеме жасалмады және ағымдық пул жұмыс істемейді. Бұл нысанға кодта қалған сілтемелер жоқ. Соңғы жүгіріс ол соңғы нұсқаға жүгіріп өтуге болатын ішкі сілтемесін сақтап қалды ма еді?
қосылды автор Erick Robertson, көзі
Бұл, әрине, мүмкін. Әрине, бұл болмауы керек. Эксперимент ретінде сіз шынайы Runnable-ге делегирленген және сіз шынымен жүгіргіштің сілтемесіндегі нақты жүгірткіге қолмен алып тастайтын орамалы Runnable жасай аласыз. Runnable GCed алады ма және қабық қалды?
қосылды автор Sarel Botha, көзі
Сондай-ақ, орындаушыны тоқтатқан кезде не болады және егер сіз басқа іске қосылса, не болады? Бұл босатылған ба?
қосылды автор Sarel Botha, көзі