🔴
Mali Mühür Merkezi TÜBİTAK Kamu SM Başvuru ve Süre Yönetimi Portalı

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?

Yasal sürenin son gününde yüzbinlerce yevmiye kaydı içeren yıllık kapanış e-defter beratlarımızı oluşturup mali mühür ile imzalama aşamasına geçtik. Defter XML dosya boyutu yaklaşık 550 MB seviyesinde ve imzalama butonuna bastıktan 2-3 dakika sonra sistem kilitlenip 'java.lang.OutOfMemoryError: Java heap space' veya 'GC overhead limit exceeded' hatası vererek imzalama sürecini yarıda kesiyor. Kullandığımız e-Defter masaüstü programı arka planda Java tabanlı bir çalıştırıcı (.bat dosyası) üzerinden çalışıyor. Bilgisayarımızda 32 GB RAM bulunmasına rağmen Java varsayılan olarak belleğin sadece küçük bir kısmını kullanabildiği için bu bellek yetersizliği hatasını alıyoruz. .bat dosyası içerisindeki Java başlatma komutlarına (-Xms, -Xmx vb.) hangi parametreleri ekleyerek 64-bit Java ile yüksek bellek tahsis edebilirim ve büyük boyutlu e-defterleri sorunsuz imzalayabilirim?
Durum: Çözüldü Kategori: Soru-Cevap

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.

Yanıtlayan
Destek Uzmanı C.

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.

Yanıtlayan
Denetçi Serdar T.