Saya melihat masalah sesekali pada netcore 2.2 di mana GC Gen2 bersamaan tampaknya tidak berjalan di utas GC latar belakang, alih-alih berjalan di utas yang memicu pengumpulan.
Ini diamati pada pengembangan Windows 10 saya yang menjalankan aplikasi dalam konfigurasi Rilis pada runtime .NET Core 2.2 64-bit dengan profil GC default (workstation, GC bersamaan diaktifkan, mode latensi interaktif), dan saya dapat mengambil sampel perfview dari kejadian:
Melihat melalui sumber GC, saya pikir mungkin ada masalah yang diperkenalkan di commit ini . Sebelum perubahan, bgc_thread
akan disetel pada saat pembuatan utas, dan dijamin akan disetel pada saat diperiksa di void gc_heap::garbage_collect (int n)
. Setelah perubahan, bgc_thread
sekarang disetel dalam utas baru pada awal eksekusinya, yang sepertinya akan memperkenalkan kondisi balapan di mana bidang itu mungkin tidak disetel pada waktunya untuk melanjutkan GC bersamaan.
ahh, penemuan yang bagus!
@PeterSolMS , @VSadov maukah salah satu dari Anda melihat dan memperbaikinya?
hanya ingin menunjukkan bahwa GC sebenarnya yang dilakukan di sini bukan lagi BGC - itu hanya memperlakukannya karena kami gagal membuat utas BGC jadi kami hanya melakukan GC pemblokiran penuh; acara tersebut menyesatkan (masih mengatakan Latar Belakang) sehingga harus juga diperbaiki jika kita gagal benar-benar melakukan BGC (gagal membuat utas BGC atau karena alasan lain).
untuk lomba setting bgc_thread, sebenarnya kita tidak perlu melakukan setting di bgc_thread_stub
, di CreateSuspendableThread
setelah baris ini
args.Thread = SetupUnstartedThread(FALSE);
objek Thread sudah tersedia - semua logika selanjutnya dalam fungsi ini tidak mengubah Thread yang dibuat.
Komentar yang paling membantu
hanya ingin menunjukkan bahwa GC sebenarnya yang dilakukan di sini bukan lagi BGC - itu hanya memperlakukannya karena kami gagal membuat utas BGC jadi kami hanya melakukan GC pemblokiran penuh; acara tersebut menyesatkan (masih mengatakan Latar Belakang) sehingga harus juga diperbaiki jika kita gagal benar-benar melakukan BGC (gagal membuat utas BGC atau karena alasan lain).