500 MB ve üzeri e-Defter dosyalarını mali mühürle imzalarken Java 'java.lang.OutOfMemoryError: Java heap space' hatası nasıl çözülür, .bat dosyası bellek parametreleri nasıl düzenlenir?
2 Cevap
500 MB ve üzeri devasa boyutlu e-Defter XML dosyalarını yerel masaüstü uygulamalarıyla imzalarken karşılaşılan 'java.lang.OutOfMemoryError: Java heap space' veya 'GC overhead limit exceeded' hatası, tamamen Java Sanal Makinesi'nin (JVM) varsayılan yığın bellek (heap memory) sınırlarının aşılmasından kaynaklanır.
Arka Plandaki Teknik Süreç: 550 MB boyutundaki bir e-Defter XML dosyası doğrudan metin olarak işlenmez. e-Defter imzalama kütüphanesi XML belgesini ayrıştırmak (parsing) için DOM (Document Object Model) ağacını belleğe yükler. DOM yapısı XML etiketlerini hiyerarşik nesnelere dönüştürdüğünde dosya boyutu bellekte yaklaşık 5 ila 8 katına (3 GB - 4.5 GB RAM) katlanır. Ardından XAdES-BES formatında SHA-256 kriptografik hash özetleri çıkarılırken JVM belleği yetersiz kalır ve çöp toplayıcı (Garbage Collector) bellek açamadığı için işlem çöker.
Sorunu kalıcı olarak gidermek için aşağıdaki teknik adımları eksiksiz uygulayınız:
1. Adım: 64-Bit Java Yüklü Olduğundan Emin Olun (Ön Koşul)
Bilgisayarınızda 32 GB fiziksel RAM bulunsa dahi sistemde 32-bit (x86) Java kuruluysa, Windows mimarisi gereği JVM en fazla 1.4 GB - 1.6 GB RAM kullanabilir ve daha fazlasını tahsis etmeye çalıştığınızda Java hiç başlamaz. Komut İstemcisi'ni (cmd) açıp şu komutu yazın:
java -version
Gelen çıktıda '64-Bit Server VM' ibaresini görmelisiniz. Eğer bu ibare yoksa veya 32-bit yazıyorsa, Adoptium Temurin JRE veya Oracle 64-bit Java (sürüm 8 veya 11) indirip kurunuz.
2. Adım: .bat Başlatıcı Dosyasına Yüksek Bellek Parametrelerini Ekleyin
e-Defter programınızın kurulu olduğu dizindeki (örneğin C:\eDefter\bin\edefter.bat veya baslat.bat) çalıştırma dosyasını Not Defteri ile açın. Dosya içerisinde java -jar ... ile başlayan satırı bulun ve aşağıdaki optimize edilmiş JVM bellek argümanları ile güncelleyin:
"C:\Program Files\Java\jre1.8.0_381\bin\java.exe" -Xms4096m -Xmx12288m -XX:+UseG1GC -XX:+UseStringDeduplication -XX:InitiatingHeapOccupancyPercent=45 -jar edefter.jar
Bu parametrelerin teknik işlevleri şunlardır:
- -Xms4096m: Java'nın başlangıç taban belleğini doğrudan 4 GB (4096 MB) olarak rezerve eder, dinamik bellek büyütme gecikmelerini önler.
- -Xmx12288m: Java'ya maksimum 12 GB RAM kullanma yetkisi verir (32 GB RAM'li sisteminiz için bu değer 550 MB'lık defteri bellekte rahatça tutmak için mükemmeldir).
- -XX:+UseG1GC: Büyük bellek alanlarında Garbage Collector duraklamalarını (Stop-the-world pauses) milisaniyelere indiren G1 çöp toplayıcısını aktif eder.
- -XX:+UseStringDeduplication: XML içerisindeki yinelenen etiket dizgelerini (örneğin binlerce kez tekrar eden yevmiye hesap kodları ve XML tag'leri) tekilleştirerek RAM tüketimini %30 oranında düşürür.
3. Adım: e-Defter Tebliğine Uygun Kesin Çözüm: Defteri Parçalayarak Oluşturun
JVM ayarlarını artırarak bu defteri imzalasanız dahi, 550 MB'lık tek bir XML dosyasını GİB e-Defter portalına (uyg.edefter.gov.tr) yüklerken sunucu tarafında HTTP 504 Gateway Timeout veya ağ kesintisi yaşama riskiniz %90'ın üzerindedir.
1 Sıra No'lu Elektronik Defter Genel Tebliği ve GİB Uygulama Kılavuzları uyarınca, defterlerin tek bir devasa dosya olması zorunlu değildir; aksine mükelleflerin defter dosyalarını 100 MB veya azami 200 MB sınırıyla parçalı (Örn: 2026-01-Y-000001, 2026-01-Y-000002 şeklinde) oluşturması açıkça tavsiye edilmektedir. Muhasebe yazılımınızın e-Defter parametrelerinden 'Maksimum Dosya Boyutu' alanını 100 MB olarak belirleyip defteri 5-6 parça halinde yeniden oluşturunuz. Her parça 1-2 dakika içinde bellek şişmesi yaşamadan hızla mühürlenecek ve GİB portalına saniyeler içinde başarıyla yüklenecektir.
Destek Uzmanı C.'nin defter bölme uyarısı hayati bir mevzuat zorunluluğudur. Maliye Bakanlığı denetimlerinde müfettişler defterin tek parça mı yoksa 10 parça mı olduğuna değil, yevmiye madde ve satır numaralarının kesintisiz birbirini takip edip etmediğine bakar. 550 MB'lık tek parça defterin GİB sunucusuna yüklenmesi sırasında oluşacak paket düşmesi veya zaman aşımı, son gün saat 23:59'u geçirmenize ve VUK mükerrer 355. maddesi gereğince yüz binlerce liralık özel usulsüzlük cezasıyla karşılaşmanıza yol açabilir. Bu sebeple defteri muhasebe yazılımından 100 MB parçalara bölerek göndermek en risksiz ve kanuni yoldur.