• Anasayfa
  • Eğitimler
    • JavaScript Eğitimi
    • Angular 2 Eğitimi
    • React.js Eğitimi
    • Java 8 Eğitimi
    • Java EE 7 Eğitimi
    • Spring Framework Eğitimi
    • Git Eğitimi
  • Online Eğitimler
    • Online React.js Eğitimi
    • Online Angular 2 Eğitimi
    • Online Spring Boot Eğitimi
  • Referanslar
  • Hakkında
  • İletişim
KodEdu
  • Anasayfa
  • Eğitimler
    • JavaScript Eğitimi
    • Angular 2 Eğitimi
    • React.js Eğitimi
    • Java 8 Eğitimi
    • Java EE 7 Eğitimi
    • Spring Framework Eğitimi
    • Git Eğitimi
  • Online Eğitimler
    • Online React.js Eğitimi
    • Online Angular 2 Eğitimi
    • Online Spring Boot Eğitimi
  • Referanslar
  • Hakkında
  • İletişim

JVM: JIT ve Interpretation Modlarının Performans Karşılaştırması

  • Posted by Kodedu
  • Categories backend, Genel, Uncategorized, Verimlilik, Yazılar, Yazılım
  • Date 7 Ağustos 2014

JVM (Java Sanal Makinesi) üreticileri, bytecode değerlendirmesi için çeşitli teknikler uygulamaktadır. Bu teknikler genel olarak Pure bytecode interpretation, Static compilation, Total JIT compilation ve Mixed mode interpretation 'dir. Eğer bu kavramlara aşinalığınız henüz bulunmuyorsa, https://kodedu.com/2012/06/jvm-kod-uretme-yaklasimlari/ yazısını okumanızı önermekteyiz.

Hotspot JVM ise bu bayt kod işleme tekniklerinden, Mixed mode interpretation tekniğini varsayılan olarak kullanmaktadır. Yani Hotspot JVM, yeri geldiğinde Interpretation(yorumlama), yeri geldiğinde ise JIT compilation (derleme) ile maksimum performans ve maksimum platform bağımsızlığı elde etmeyi amaçlamaktadır.

Peki varsayılan Mixed mode interpretation (JIT + Interpreted mod) tekniği ile  Pure bytecode interpretation tekniğinin performans karşılaştırmasını hiç merak ettiniz mi?

Bu kıyaslamayı yapabilmek için Hotspot JVM üzerinde varsayılan olarak koşturulan JIT derleyici özelliğini kapatabiliriz. 

DEMO

XintApp sınıfı, "kodedu.com " ifadesini, bir StringBuffer nesnesine döngüsel olarak sürekli eklemektedir. Ekleme işlemini 10'ar kez ve Integer tipinin azami değerinin 1/50 kadarı boyunca eklemektedir. Buradaki maksadımız aslında belirli bir süre tüketen basit bir uygulama oluşturmak.

public class XintApp {

 public static void main(String[] args) {

   long start = System.currentTimeMillis();

   StringBuffer buffer = new StringBuffer();

   for (int j = 0; j < 10; j++) {

	 for (int i = 0; i < (Integer.MAX_VALUE / 50); i++) {
		buffer.append("kodedu.com ");
	 }

	 buffer = new StringBuffer();
   }

   long end = System.currentTimeMillis();

   System.out.format("Süre: %d %n", (end - start));
 }
}

XintApp uygulaması çalıştırıldığında, toplam koşum süresi milisaniye cinsinden çıktılanacaktır.

Şimdi bu uygulamayı normal bir biçimde derleyelim ve koşturalım. Uygulama biraz bellek tükettiği için -Xmx4g parametresi ile azami Heap boyutu 4GB olarak ayarlanmaktadır. Bu değerleri kendi çalıştırma ortamında yeniden düzenleyebilirsiniz.

$ javac XintApp.java
$ java -Xmx4g XintApp

// Süre: 15615

Görüldüğü üzere, JIT + Interpreted mod ile yaklaşık 16 saniyede uygulama koşumu tamamlandı. Peki şimdi, JIT devredışı bırakalım ve ne kadar sürede koştuğuna bakalım. JIT derleyiciyi devredışı bırakmak için, -Xint JVM parametresini kullanmalıyız.

$ javac XintApp.java
$ java -Xmx4g -Xint XintApp

// Süre: 112858 

JIT derleyici devredışı bırakıldığında yani sadece interpreted mod ile uygulama koşumu yaklaşık 2 dakika sürdü. Buradan aradaki farkın XintApp uygulaması için yaklaşık 7 kat olduğunu görebilmekteyiz.

Eğer JIT derleyicinin aktivitelerini süre bazında görmek istiyorsak -XX:+PrintCompilation JVM parametresini komut satırına ekleyebiliriz.

$ javac XintApp.java
$ java -Xmx4g -XX:+PrintCompilation XintApp

// ------

60    1       3       java.lang.Object::<init> (1 bytes)
61    2       3       java.lang.String::length (6 bytes)
61    3       3       java.lang.String::charAt (29 bytes)
61    4       3       java.lang.String::equals (81 bytes)
62    5       1       java.lang.ref.Reference::get (5 bytes)
63    6       3       java.lang.String::indexOf (70 bytes)

...

Süre: 15615

Tekrar görüşmek dileğiyle..

  • Share:
author avatar
Kodedu

Previous post

XSS açıklarına karşı Sanitize işlemi
7 Ağustos 2014

Next post

Zencoding (Emmet) ile Hızlı kod yazın
9 Ağustos 2014

You may also like

api-logo
Swagger Nedir? Neden kullanılır?
10 Ekim, 2018
spring-cli-logo
Spring CLI ile Spring Boot Projeleri Hazırlamak
21 Ağustos, 2017
eureka_architecture
Spring Cloud Netflix ve Eureka Service Discovery
3 Temmuz, 2017

    1 Comment

Leave A Reply Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta listesine kayıt olun!






Gözde yazılar

Java Mimarisiyle Kurumsal Çözümler : Kurumsal Java Kitabı
16Eyl2012
Java API for JSON Processing – Stream bazlı JSON Üretmek ve Tüketmek
06Ağu2013
AsciidocFX projesi Duke’s Choice Award 2015 ödülünü kazandı
28Eki2015
Knockout.js – Hesap Makinesi Örneği
02Şub2013

Son Yazılar

  • Java’da Record’lar 27 Ocak 2020
  • Swagger Nedir? Neden kullanılır? 10 Ekim 2018
  • Spring CLI ile Spring Boot Projeleri Hazırlamak 21 Ağustos 2017
  • Spring Cloud Netflix ve Eureka Service Discovery 3 Temmuz 2017
  • Online React.js Eğitimi ardından (15-25 Mayıs 2017) 31 Mayıs 2017

Son Yorumlar

  • Coupling ve Cohesion Kavramları Nedir? için Hilal
  • Naïve Bayes Sınıflandırma Algoritması için Rahman Usta
  • Naïve Bayes Sınıflandırma Algoritması için Mete
  • YAML Nedir? Neden YAML Kullanmalıyız? için kara
  • JWT (JSON Web Tokens) Nedir? Ne işe yarar? için Furkan

Get Java Software

Arşivler

Bizi takip edin

React.js Eğitimi Başlıyor
11-22 Eylül, 2017
Eğitmen
Rahman Usta
İletişim

merhaba@kodedu.com

  • Hakkında
  • Gizlilik Politikası
  • İletişim
  • Referanslar
Kodedu Bilişim Danışmanlık
Cemil Meriç mah. Çelebi sok.
No:16/3 Ümraniye/İSTANBUL
Tel: 0850 885 38 65
Alemdağ V.D.: 8960484815

KODEDU © Tüm hakları saklıdır.