My Profile Photo

Mehmet Cem Yücel


Technical Writings.
Architecture, Security, Java, Golang, Devops, Microservices, Spring Boot, Kafka, Distributed Systems and Blockchain


  1. JVM Memory Usage OutOfMemoryError

    Önce bazı temel bilgiler :) Java programlarını çalıştırırken JVM kendisine belirli bir miktar bellek alokasyonu yapar. Bir java programını çalıştırırken JVM’e …


  2. Java Daemon Thread

    Bir java uygulamanın sonlanması için main thread’in sonlanması ve başka hiçbir aktif user thread’in olmaması gerekir. Bu sonlanmayı main thread sonlandırıldığında aktifleşen DestroyJavaVM isimli thread yönetir. DestroyJavaVM uygulamayı sonlandırmak için user threadlerinin sonlanmasını bekler. Threadler sonlanır sonlanmaz uygulama JVM’de sonlandırılır. Ancak uygulamanın başlattığı aktif threadler bulunuyorsa uygulama sonlanamayacaktır. DestroyJavaVM thread’inin göz ardı ettiği bazı threadler vardır ki bu threadler uygulamanın sağlıklı bir şekilde çalışmasından sorumlu sistem threadleridir. Örneğin Finalizer isimli thread finalize metodu çalıştırılacak objeleri alır ve bu çağırımları gerçekleştirir. Başka bir örnek, Signal Dispatcher thread’i JVM ile OS arasındaki native çağırımlardan sorumlu sistem threadidir. Bir thread’i daemon olarak tanımladığımız zaman uygulamanın sonlanması için engel oluşturmayan bir thread oluşturduğumuzu ifade ederiz. Bu thread’imiz çalışan başka hiçbir thread kalmadığında işini henüz tamamlamamış olsa dahi uygulamamız sonlanacaktır. Bu tarz threadleri genellikle yarattığımız diğer threadleri kontrol eden kod parçalarını çalıştırmak için kullanırız. Örneğin sistemdeki aktif olan threadleri dinleyen bir izleme thread’i gibi. KOD; İki adet thread sınıfından extend olmuş sınıfımız var. Birisi(DaemonThread sınıfı) while ile sonsuz döngüde 3er saniyelik aralıklarla ekrana çıktı veriyor. Bu thread dışarıdan bir müdahale olmadığı sürece sonsuza kadar çalışacak bir thread. …


  3. Eclipse Conditional Breakpoint

    Genelde kodda değişiklik yaparak çözme yoluna gittiğimiz ama aslında hazır bir özellikle işin içinden kolayca çıkabileceğimiz bir özelliği paylaşmak istiyorum. Örneğin bir kodunuz var. Kodun içerisindeki bir değişken, istediğiniz spesifik bir değere eşit olduğunda debug etmek istiyorsunuz. Aşağıda 13. satırdaki System.out.println metoduna bir breakpoint koymak istiyorum ama sadece i değeri 59 olduğu zaman işlemlerimi gözlemlemek istiyorum. Kodumuzu …


  4. Java Final Keyword ve Performans Etkileri

    Bugün zaten bildiğimiz final anahtar kelimesine biraz farklı açılardan bakacağız. Hatırlamak için; final anahtar kelimesi kullanıldığı …


  5. Chain Of Responsibility Design Pattern

    Bugün behavioral(davranışsal) bir design pattern(tasarım şablonu) olan Chain of Responsibility(Sorumluluk Zinciri) inceliyor ve örnek yapıyor olacağız. Şablonu kısaca özetlememiz gerekirse, belirli fonksiyonları ardı sıra gerçekleştirmesini beklediğimiz sınıflarımıza bu yetenekleri sağlamak istediğimizde Sorumluluk Zinciri tasarım şablonunu kullanırız. Kalıtım hiyerarşisinde farklı davranışlar sergileyen subtype(alt tip)’ler için gayet kullanışlı ve genişleyebilir bir altyapı sunmaktadır. Örnek üzerinden ilerlemek daha verimli olacaktır diye düşünüyorum. O zaman hadi başlayalım. Senaryomuz bir araç yıkamacılarında geçiyor. Müşteriler araçlarını getirip yıkanması üzere yıkamacıya bırakıyor. Gelen her aracın tipine göre bazı farklı yıkanma adımları olacaktır, örneğin bir motosikletin iç yıkaması olmayacağı gibi bir otobüsün bagaj temizliği de herhangi bir arabanın bagaj temizliğinden farklı olacaktır. Peki bu farklı tipleri nasıl ayırt edecek sonrasında nasıl davranışlarımızı gerçekleştireceğiz? Hemen modellerimizi yaratarak işe başlayalım. Abstract bir Arac sınıfı ve bu sınıfı kalıtan Otobus, Araba ve Motosiklet sınıfları yaratıyorum. İlk adımda görüntümüz aşağıdaki şekilde; …


  6. Statik Kod Analiz Araçları

    İyi kod yazmak için dikkat edilmesi gereken bir çok detay var. Bazı zamanlar gereksiz döngülerde zaman harcarız kimi zaman da normalde yapmayacağımız hatalı kodlar yazarız. Hatta zaman zaman o hatalı kodlarımız çalışır, ta ki o kodun çalışmayacağı case gerçekleşene kadar. Bu hataları ve best practise’leri yakalayabilmek için 2. hatta 3. bir göz tarafından code review yaparız. Bizim gözümüzden kaçanları başkaları yakalar, kodu optimize ederiz. Ama hepimiz insanız, kimi küçük ayrıntıları gözümüzden kaçırabiliriz. Bu durumlarda kod analiz araçları imdadımıza yetişiyor. Kimi dinamik, kimi statik kurallarla çalışıyor. Kimisi best practice’leri, kimisi hatalı kodları, kimisi ise performans ölçümleri için iyi sonuçlar veriyor. Java için best practice ve hatalı kodları uyarmak için bulduğum kullanışlı bir tool örneği vereyim, FindBugs. Eclipse için plugini de bulunuyor, size uyarılar ve sebeplerini veriyor. Daha profesyonel bir çözüm için de SonarQube inceleyebilirsiniz. Ayrıca aşağıdaki adreste birçok dil ve ide için toolların bir listesi de bulunuyor. Kodunuzun kalitesini bu toollarla artırabilirsiniz. http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis …


  7. Mutable - Immutable Types

    Bugün bir çoğumuzun bildiği ama çoğu zaman dikkat etmediğimiz bir konuya dikkat çekmek istiyorum. Mutable(değişebilir) ve immutable(değişemez) tipler. Hangi veri tiplerimiz niçin bu özellikte, performansa etkileri ne şekilde bunlar üzerinde yorumlar yapacağız. Örneklerim java üzerinden olacak. Ufak bir örnekle başlamadan önce String tipinin aslında bir karakterler dizisi olduğunu, bu veri tipinin primitive(ilkel) bir tipi olmadığını hatırlatma gereksinimi duyuyorum. Bu örneğimizde string bir değişkenimize defalarca concatenating(bağlama) işlemi yapacağız. Iterasyon(tekrarlama) sayısını yüksek tuttum ki fark daha net anlaşılsın. Örnekte 100.000 kez, varolan bir stringin sonuna bir değer ekleme işlemi yapıyoruz. Bu işlem arasında geçen süreyi hesaplıyoruz. …


  8. java.lang.OutOfMemoryError

    Programlar bilgisayarlarımıza ilk kurulduklarında hangi argümanlara göre çalışacaklarına kendileri karar verirler. Default olarak gelen bu değerler her zaman uygulamamızın doğasına uygun olmayabilir. Örneğin enterprise uygulamalar üzerinde çalışıyorsak bu bu başlangıç değerleri projemizin isteğini karşılamıyor olabilir. Daha fazla bellek alanı tahsis etmemiz, işlemciyi isteklerimize uygun olarak kullanmak isteyebiliriz. Hatta belirlediğimiz uygulamaların bu kaynakları ne şekillerde paylaşacaklarını ayarlamamız da gerekebilir. Böyle durumlarda programların default olan değerlerini ihtiyacımıza göre değiştirmemiz gerekecektir. Bu gerek veritabanı, gerek uygulama çatısı olsun platformlar üzerindeki yönetimizi kolaylaştıran unsurlardır. Uygulamanızı uygulama sunucusunda deploy ederken, veya uygulamamız runtime’da iken bellek yetersizliği ile ilgili hatalar almış olabilirsiniz. Böyle durumlarda sunucuda kullanıma açılan bellek alanının yetersizliğinden dolayı uygulamamız kendisine gerekli olan alanı yaratamaz. Heap alanındaki aşırı doluluk durumu Garbage Collection ın temizliği sonrasında hafifletilebilmektedir. Ancak PermGen alanının statik olması uygulamaların ihtiyacı olan bellek alanının tahsis edilemediği durumlarda “ java.lang.OutOfMemoryError “ hatasına sebep olmaktadır. Java Sanal Makinası-JVM e dair bu bilgileri anlık kullanım verilerini elde etmek için JDK nızın içerisinde bulunan Java Virtual VM uygulamasını kullanabilirsiniz. C:/Program Files/Java/[ilgili jdk klasörü]/bin/jvisualvm altıdna uygulamaya erişebilirsiniz. Bilgisayarımdaki heap ve permgen kullanımınlarına dair görüntü aşağıdaki gibi. …


  9. C# ile DNS Degistirme Uygulaması

    Bildiğiniz gibi Youtube video paylaşım sitesine erişim ülkemizde engellendikten sonra bu kervana Google servisleri de eklenmişti. Bu durum elbette site ve servislere erişebilmeyeceğimiz anlamına gelmiyor. Erişebilmek için yöntemler de zaten birçoğumuz tarafından biliniyor. Bunlardan birisi tünel kavramı. Bazı siteler bizim ilgili siteyle kendi üzerinden bağlanmamız konusunda yardımcı oluyor. Bu sitelerden en popüler olanlarından birisi KTunnel mesela. Bir başka yol bilgisayarımızın sunucu dosyasını düzenlemekten geçiyor. Bizim bugün değineceğimiz yöntem ise DNS adresimizin değiştirilmesiyle alakalı. DNS’in ne olduğu ve bu sistemin nasıl çalıştığı hakkında bahsetmeyeceğim, isteyenler olursa buradan detaylı bilgi sahibi olabilir. Biz bilgisayarımızda bu adreslerin programatik olarak nasıl değiştirilebileceği üzerisinde duracağız. Kullandığımız dil C# olacak ve bir WPF uygulaması yaratacağız. Yavaş yavaş uygulamamıza giriş yapalım. Öncelikle bir bilgisayarda programatik olarak DNS değiştirmek için neler yapmak gereklidir? Internette epeyce araştırdıktan sonra bunun için iki farklı yöntemin olduğunu öğrendim. WMI (Windows Management Instrumentation) kullanarak yapılabildiği gibi bilgisayarımızda Registry ayarlarında oynamalar yaparak da bu işlemi gerçekleştirebiliyoruz. Biz 2. yöntemi tercih edeceğiz. Artık işin zevkli kısıma, kodlamaya, yavaştan giriş yapabiliriz. Programımızın arayüzü bu şekilde. Ağ bağdaştırıcısı seçildikten sonra var olan DNS IP’leri içerisinden istediğimizi seçerek DNS adresimizi değiştirebiliyoruz. İstersek bu adres listesine kendi istediğimiz sunucuların IP’lerini de aşağıdaki kısımdan ekleyebiliyoruz. Böylece kullanımı esnek bir yapıya taşımış oluyoruz. …


  10. Transaction marked as RollbackOnly

    Programlar bilgisayarlarımıza ilk kurulduklarında hangi argümanlara göre çalışacaklarına kendileri karar verirler. Default olarak gelen bu değerler her zaman uygulamamızın doğasına uygun olmayabilir. Örneğin enterprise uygulamalar üzerinde çalışıyorsak bu bu başlangıç değerleri projemizin isteğini karşılamıyor olabilir. Daha fazla bellek alanı tahsis etmemiz, işlemciyi isteklerimize uygun olarak kullanmak isteyebiliriz. Hatta belirlediğimiz uygulamaların bu kaynakları ne şekillerde paylaşacaklarını ayarlamamız da gerekebilir. Böyle durumlarda programların default olan değerlerini ihtiyacımıza göre değiştirmemiz gerekecektir. Bu gerek veritabanı, gerek uygulama çatısı olsun platformlar üzerindeki yönetimizi kolaylaştıran unsurlardır. Uygulamanızı uygulama sunucusunda deploy ederken, veya uygulamamız runtime’da iken bellek yetersizliği ile ilgili hatalar almış olabilirsiniz. Böyle durumlarda sunucuda kullanıma açılan bellek alanının yetersizliğinden dolayı uygulamamız kendisine gerekli olan alanı yaratamaz. Heap alanındaki aşırı doluluk durumu Garbage Collection ın temizliği sonrasında hafifletilebilmektedir. Ancak PermGen alanının statik olması uygulamaların ihtiyacı olan bellek alanının tahsis edilemediği durumlarda “ java.lang.OutOfMemoryError “ hatasına sebep olmaktadır. Java Sanal Makinası-JVM e dair bu bilgileri anlık kullanım verilerini elde etmek için JDK nızın içerisinde bulunan Java Virtual VM uygulamasını kullanabilirsiniz. C:/Program Files/Java/[ilgili jdk klasörü]/bin/jvisualvm altıdna uygulamaya erişebilirsiniz. Bilgisayarımdaki heap ve permgen kullanımınlarına dair görüntü aşağıdaki gibi. …