- Bildiğim kadarıyla, Yığın alanı yalnızca örnek değişkenlerle doludur. Bu doğruysa, nesne oluşturma sırasında örnek değişkenler için alan tahsis edildiğinden bir süre iyi çalıştıktan sonra bu hatanın neden oluştuğu.
Bu, uygulamanızda belirli bir süre boyunca sürekli olarak daha fazla nesne oluşturduğunuz anlamına gelir. Yeni nesneler yığın belleğinde depolanacaktır ve yığın belleğindeki büyümenin nedeni budur.
Öbek yalnızca örnek değişkenleri içermez. İlkel olmayan tüm veri türlerini (Nesneler) depolar. Bu nesnelerin yaşam süresi kısa (yöntem bloğu) veya uzun olabilir (uygulamanızda nesneye başvurulana kadar)
- Yığın alanını artırmanın bir yolu var mı?
Evet. Daha fazla ayrıntı için bu oracle makalesine bir göz atın .
Yığın boyutunu ayarlamak için iki parametre vardır:
-Xms:, başlangıç ve minimum yığın boyutunu ayarlar
-Xmx:, maksimum yığın boyutunu ayarlar
- Daha az yığın alanı kaplaması için programımda ne gibi değişiklikler yapmalıyım?
Uygulamanıza bağlıdır.
Maksimum yığın belleğini uygulama gereksiniminize göre ayarlayın
Uygulamanızda bellek sızıntılarına neden olmayın
Uygulamanızda bellek sızıntıları bulursanız, MAT , Visual VM , jconsole vb . Profil oluşturma araçları yardımıyla temel nedeni bulun. Kök nedeni bulduktan sonra sızıntıları giderin.
Oracle makalesinden önemli notlar
Neden: Ayrıntı mesajı Java yığın alanı, nesnenin Java yığınında ayrılamadığını gösterir. Bu hata, mutlaka bir bellek sızıntısı olduğu anlamına gelmez.
Olası nedenler:
- Yanlış konfigürasyon (yeterli hafıza ayırmamak)
- Uygulama istemeden nesnelere referanslar tutuyor ve bu nesnelerin çöp toplanmasını engelliyor
- Sonlandırıcıları aşırı kullanan uygulamalar. Bir sınıfın bir finalize yöntemi varsa, bu türdeki nesnelerin alanları çöp toplama zamanında geri alınmaz. Sonlandırıcı iş parçacığı, sonlandırma kuyruğuna ayak uyduramazsa, Java yığını dolabilir ve bu tür OutOfMemoryError istisnası atılır .
Farklı bir notta, daha iyi Çöp toplama algoritmaları ( CMS veya G1GC ) kullanın
G1GC'yi anlamak için bu soruya bir göz atın