java etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
java etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

4 Nisan 2020 Cumartesi

Java Memory Yönetimi

Selamlar :) 

    Temel prensipleri ile Java'nın Memory yönetimini açıklayacağım. Yorum ve soru ve yönlendirmeleriniz ile içeriği zenginleştirebiliriz. 

   Yazdığımız her bir kod satırı Memory problemleri oluşturmaya adaydır. Öncelikle bu durumu kabullenip olası problemleri, açık kaynaklı ürünler ile nasıl çözümleyebileceğimizi değerlendireceğiz. 

   Öncelikle Java'da memory yönetimi nasıl yapılır kısaca ele alalım.


Java Memory

  • Nasıl Çalışır?(Stack ve Heap)
     Oluşturduğumuz her bir Obje Memory de tutulmaktadır. Memory ise Stack ve Heap olarak iki parçadan oluşmaktadır.


Stack(256kB to ≤ Heap Size): 

Yaygın olarak kullanılan Memory alanıdır. Her bir thread'e özel Stack oluşturulur. Stack JVM(Java Virtual Machine)   tarafından kullanılan en verimli memory parçacığıdır. Stack'in en önemli yönü ise JVM'in  Stack'de konumlandırılan verinin ne zaman silineceğini tam olarak bilmesidir.

  • Çalışma Prensibi:
     Stack'e yeni bir veri eklendiğinde ilgili veri stack'in en üst satırında konumlandırılır. 
Yeni bir veri eklenir ise ilk veri bir satır aşağı kaydırılır. Silme adımında ise sıralama en üstten başlar, son eklenen veri ilk silinen verirdir. 

Kısaca LIFO(Last in First Out) mantığı ile çalışır. 
Primitive Değişkenler ve Obje Referansları(Kendisi değil) Stack'de tutulur.


.  En temelde çalıştırabilir methodlara main method denir. Her bir main method bir thread'e bağlıdır. 
    Main method oluştuğunda String tipinde 
bir dizi oluşur. Dizi String'den oluştuğu için heap'de konumlanır ve memory referansı stack ile paylaşılır. args dizisinde yapılan her bir değişiklik heap'e yansır. 


Main method tetiklendiğinde öncelikle sırasıyla value Stack'de oluşur. value'a yeni değer atanması için calculate methodu çağırılır. calculate methodunun parametre olarak aldığı data değeri value'nin kopyası olarak oluşturulur ve stack de konumlanır. 

    Sırasıyla tempValue ve newValue oluşturulur ve return ile son değer main methoda aktarılır. Method görevini tamamladığında içerisinde tanımlı bütün primitive tipler silinir.
value yeni değerini almıştır. Yeni bir işlem olmadığı için stack'de bulunan tüm data silinir. 

Main method ile ilişkili thread'in yaşamına JVM tarafından son verilir :) Mutlu son...

Stack sadece Primitive Type'lar için kullanılır....


Heap(2 MB to ≤ ∞);

     Jvm tarfinden yönetilen diğer memory katmanı ise Heap'dir. Heap yaşam döngüsü method yada fonksiyon scobe'larından uzun olan Objeleri barındırır. Stackler arasında veri paylaşımı yapabilir. Örneklendirmek gerekir ise veri tutmak için fiziksel memory'nin izin verdiği kadar büyük bir alana sahibiz. 

    Primitive Type'lar haricindeki herşey (ki bunlar Objedir) Heap'de tutulur.

Method içerinde bir obje oluşturulduğunda, ilgili obje heap'de konumlanır ve obje referansı Stack'de konumlandırılır.

Methodun görevi bittiğinde primitive type silinir. name isimli referans silinir fakat Heap'de konumlanan değişken silinmez. Heap'deki değişkenleri eğer değişkenlerin aktir referansları yok ise Garbage Collector siler. 

Heap'de konumlanan değişkenlerin yaşam döngüsü Stack'den daha fazladır.












28 Eylül 2014 Pazar

JAX-RS Web Service Hk.


Rest web sevice SOA mimarisinin uygulandığı projeler için oldukça esnek ve hafif bir çözüm olabilir. HTTP üzerinden çalışması geliştirme sürecinin kısa olması ve Web Service den dönen cevabın sade ve boyut olarak daha az olması sebebiyle kullanılmaktadır. Diğer yapılara göre 1.3 kat daha hızlı çalışması sebebiyle mobil uygulamalarda da kullanılmaktadır.

Projeye ait video ve kaynak kodları paylaşıyorum.

                                                       JAX-RS WEB SERVICE



12 Eylül 2014 Cuma

JAVA WEB SERVICE VE CLIENT 1 (JAX-WS)

                             JAX- WS(Java Api for Xml Web Services) Nedir ?

Web Service geliştirmede kullanılan JEE 5 itibariyle kullanılmaya başlanan bir javanın XML tabanlı web service yapısıdır. Kullanımı oldukça kolaydır.

Herhangi bir class'ı web service olarak açmak için class tanımının başına  @WebService annotation' ını yazmamız yeterli. Böylece Class'ın web service olarak kullanılacağını belirtiyoruz.


@WebService Kullanımı


10 Eylül 2014 Çarşamba

JDBC CONNECTION, DAO VE TRANSACTION

                                                              JDBC Nedir?
     Açılımı Java Veritabanı Bağlantısı (Java Database Connectivity) olan JDBC Java ile veri tabanına bağlanmamızı ve sql scriptlerimizi çalıştırmamızı sağlayan bir katmandır. Bu katmanı kullanabilmemiz için her bir veri tabanına özel olarak yayınlanan veri tabanı kütüphanelerini(jar dosyaları) nı projemize eklememiz gerekmektedir.

Jdbc Ara yüzleri:

1. Connection : Veri tabanı bağlantısını sağladığımız ara yüzdür. Driver Manager üzerinden oluşturulur yada uygulama sunucusundan alınabilir. Biz örneğimizde Driver Manager'ı MySQL DB kütüphanesini kullanacağız.

İlk iş MySQL kütüphanesindeki driver classını belirtmek ve connection'ımızı olusturmak olacak.

  
Connection aldığımız class ve methodu

9 Eylül 2014 Salı

MAVEN REPOSITORY JAR EKLEME

Oracle DB jarları yada IBM' e özel jarlar, Kendi yazdığınız utiller,veya webservice clientlarını maven repository sine ekleyerek istediğiniz uygulamada kullanabilirsiniz. Bunun için

mvn install:install-file -Dfile=JARIN-BULUNDUGU-DIZIN\jarAdı.jar -DgroupId=com.KENDI-VERECEGIN-ISIM -DartifactId=JAR-ADI -Dversion=VERSIYONU -Dpackaging=jar

tanımıyla yapabiliriz.

Örneğin : 

Jar ın bulunduğu dizini kopyaladım.

mvn install:install-file -Dfile=C:\PROJELER\NetBeansProjects\maven-batch-programs\target\maven-batch-programs-1.0-SNAPSHOT.jar -DgroupId=com.beytullahc -DartifactId=maven-batch -Dversion=1.0 -Dpackaging=jar

Yukarıdaki script'i cmd de çalıştırmamız yeterli.

SONUÇ :

jarı projeye dahil etmek için ise aşağıdaki dependency tanımını pom.xml e eklemeniz yeterli.

      
            YAZDIGINIZ-GROUPID
            YAZDIGINIZ-ARTIFACTID
            YAZDIGINIZ-VERSION

     



İyi çalışmalar :)

Jar Dosyası Çalıştırma (MAVEN DEPENDENCY PLUGIN)

Farklı kütüphaneler kullandığımız java uygulamalarında projenin bağımlı olduğu jarları görebilmesi için manifest.mf dosyasına yada .sh dosyasında jarlar tanımlanır ve uygulama yada içindeki main class java -jar komutuyla çalıştırılır.

Proje Paket Yapısı



5 Eylül 2014 Cuma

MAVEN + SPRING ANOTASYON CONFIG

       Ölçek olarak küçük java uygulamalarında Spring yada EJB (EJB UYG. SUNUCUSU GEREKTIRIR) kullanmak yazılımcıyı yavaşlatır, gereksiz efor sarfetmesine neden olur. Paylaşacağım uygulamada temel Spring konfigürasyonu nasıl yapılır, context'ten bean nasıl çağırılır vb Spring'e ait en temel konulara değindim.
   
      

Interface Nedir?


      Interface temel Java da aktif olarak kullanılan bir yapıdır. Proje Analisti olarakta görebiliriz :) Özellikle kurumsal java uygulamalarında classlar arasındaki sıkı bağları kopartmamızı sağlar. İçerisinde sadece method tanımlarını bulunur. Methodlar body ( {...} ) içermez. Örn :
   
Interface tanımı

4 Eylül 2014 Perşembe

JAVA SMB/SAMBA Protokolü ile Dosya Transferi(Sadece IP ile Dosya Transferi)

FTP ve SFTP ile dosya aktarımı yapabilmemiz için serverin 22 nolu portunu kullanma yetkimiz olması gerekiyor. Bu tarz durumlarda eğer kullanıcı adı ve şifremiz var ise SMB protokolü ile sadece IP,kullanıcı adı ve şifre  ile server'a bağlanıp dosya aktarımı yada indirme işlemi yapabiliriz. SMB Hakkında kısaca kısaca bilgi vermek gerekirse:

SMB kavramı İngilizce "Server Message Block" kelimelerinin kısaltmasıdır. İlk olarak IBM tarafından kullanılmıştır.

SMB protokolü bir bilgisayarda uygulamaları okuma ve dosyalara yazma ve bir bilgisayar ağı sunucu programlarından hizmet talep etmek için izin veren bir ağ dosya paylaşım protokolüdür.
SMB protokolü TCP / IP protokolü veya diğer ağ protokolleri üstünde kullanılabilir. SMB protokolü, bir uygulama   uzak bir sunucuda dosya veya diğer kaynaklara erişebilir.

Linux tarafında SMB karşılığı SAMBA olarak geçmektedir. Protokol aynı fakat isimler farklıdır. Bizim uygulamamız platform bağımsız çalışaçak. Kodlar aşağıdaki gibidir

 
Maven projesi genel yapısı


3 Eylül 2014 Çarşamba

JAVA ve SFTP ILE REMOTE SERVER DA DOSYA TRANSFER İŞLEMLERİ

Secure FTP (Güvenli Dosya Taşıma Protokolü) , yani SFTP, SSH kullanarak dosya transferi yapan bir dosya aktarım protokolüdür. SSH'ın sağladığı güvenlik özellikleri, FTP'den farklı olarak SFTP'yi güvenli hale getirir.FTP'nin RSA ile güçlendirilmiş halidir. TCP üzerinden çalışır.

Döküman yükleme ve İndirme kodları aşağıdaki gibidir.

Weblogic Console Açılma ve Local Dil Sorunu ( weblogic render error )

Weblogic uygulama sunucusunu, local dil ayarı Türkçe olan bir makinaya kurduğunuzda localhost:7001/console adresinden weblogic konsolunu açamazsınız. Bunun sebebi Java options parametrelerinden kaynaklanmaktadır.Makinanın dil ayarlarını değiştirmekte bir çözümdür.
Fakat daha kolay ve hızlı sonuç alabileceğiniz bir yol daha var.


1 Eylül 2014 Pazartesi

Xml Parse Java Object(Maven and XSD)

SOAP tabanlı Web Servisler Xml veri tipiyle haberleşme sağlamaktadır. Ayrıca Database tarafından data xml olarak dönebilir,uygulama içerisinde xml oluşturulabilir. Bu tarz işlemlerde IDE Web Servisler için wsdl'i pars eder ve içinden servise ait değişkenleri ve objeleri xsd yardımıyla çıkartır. Uygulamamıza anında dahil eder. Fakat DB'den dönen bir xml düşünün objeye pars etmeniz gerekiyor. Tek tek Stringler içinde boğuşup değişken tiplerini bir birine çevirebilirsiniz....


Yada gelen xml örneğini free xml formatter ile formatlayıp free xsd generator ile xsd'nizi oluşturabilirsiniz. Bundan sonrasını Jax-b methodları sizin için yapıyor. Xml uzunluğu ne olursa olsun 5 dakikada objeniz yada listeniz hazır :) pom.xml'i incelemenizi ayrıca öneririm. Ben Oracle DB için geliştirme yaptım. Proje içerisinde istenen jarları oracle sitesinden indirip maven reponuza eklerseniz uyulama hazır olacaktır. Maalesef jar paylaşamıyoruz. Link  xdb6 jarını indir :)

Kaynak kod aşağıda. İyi çalışmalar.

Java ile Uzak Masaüstü Komut Satırında İşlemler

Bazı durumlarda bir batch program ile server'a bağlanıp belli komutlar çalıştırmamız gerekebilir. Kopyalama, backup alma vb işlemleri otomatize etmenizde faydalı olacaktır.

Aşağıdaki ekran çıktısında linux server'a bağlanıp örnek olarak 'ls' komutunu çalıştırdım. Uygulamayı jar olarakta projenize dahil edebilirsiniz. İşletim sistemi bağımsız olarak kullanabilirsiniz. 

Ejb 3.1 Schedule Job(Zamanlanmış Görev 2)


Ejb ile gelen @Schedule anotasyonu bize oldukça esnek bir yapı sunuyor. Her yılın belli bir tarihideki saat dakika saniye tanımı yapılarak, Her ayın son cuma günü, her perşembe vb. tanımladığımız business methodun çalışmasını sağlayabiliriz. Ejb'nin çalışabilmesi için uygulama sunucusunun EJB CONTAINER'ı bulunması gerekiyor. Ben uygulamayı Weblogic 12C üzerinde çalıştıracağım. Örnek kod aşağıdaki gibidir...


28 Ağustos 2014 Perşembe

Weblogic Schedule Job (Zamanlanmış Görev)

        Schedule Job java nın runnable kütüphanesiyle yazılabileceği ve bir jar dosyası olarak tetiklenebileceği gibi, web uygulaması olarak oluşturulup timer kütüphanesi ile de yazılabilmektedir. Burada amaç  Schedule Jobların uygulama sunucusu (Bende Weblogic)
üzerinde çalıştırılması, yönetiminin kolaylaştırılmasını sağlamaktır. Özellikle entegrasyon uygulamalarında SAP gibi sistemler karşılarında bir jar değilde kurumsal java uygulama sunucularının bulunmasını ister. START ve STOP işlemleri kolaylaşır, Herhangi bir bug ile karşılaştığınızda sunucu desteği alabilirsiniz, Loglar sunucu tarafından düzenli bir şekilde tutulur ...vb. Farkında olmasakta bir hataya müdahale ederken okadar çok 'ls','dir','pwd' gibi komutlarla dizin dizin geziyoruz, hatanın tekrar oluşmasını bekliyoruz yada uygulamanın durduğunu ertesi gün öğrenebiliyoruz. Bu yükleri sunucuya bırakmak yada JMX dünyasına girmekten başka şansımız kalmıyor :)

       Ben bütün projelerimde maven paket yapısını kullanıyorum. İleride bu konuyada ayrıca deyineceğim.


Önce Maven Web App oluşturmalı ve Aşağıdaki işlemleri izlemeliyiz.

Java Mail Api Hk.

MailSender.java

                                                       JAVA MAIL API ISLEMLERI

                          Java ile mail gönderme - Mail Subjectlerini okuma

Mail server host'u mail adresi ve şifre bilgilerinizi ilgili alanlara girmeniz yeterli. Kod ve jarlar için maven projesinin pom.xml'ine ekleyeceğiniz dependency'ler aşağıdaki gibi.

İyi çalışmalar.

>
        >
            >log4j>
            >log4j>
            >1.2.17>
            >jar>
        >
        >
            >javax>
            >javaee-web-api>
            >6.0>
            >provided>
        >
        >
            >javax.mail>
            >mail>
            >1.4.7>
            >jar>
        >
        >
   >org.apache.commons>
   >commons-collections4>
   >4.0>
        >
    >

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.mail.FetchProfile;
import javax.mail.Flags;
import javax.mail.Flags.Flag;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
import javax.mail.UIDFolder.FetchProfileItem;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.search.FlagTerm;
import org.apache.commons.lang3.StringUtils;

/**
 *
 * @author BeytullahC
 *
 * Simple demonstration of using the javax.mail API.
 *
 * Run from the command line. Please edit the implementation to use correct
 * email addresses and host name.
 */

public final class MailSender {

    public static void main(String... aArguments) {

        try {
            sendMail("senderMailAddress", "password", "smtpHost", new String[]{"toMail1", "toMail2"});
        } catch (Exception ex) {
            Logger.getLogger(MailSender.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static ArrayList readMailsImap(String host, String mail, String password) throws Exception {
        Properties props = new Properties();
        props.setProperty("mail.store.protocol", "imaps");
        props.setProperty("mail.imaps.ssl.trust", host);
        props.setProperty("mail.imaps.connectionpoolsize", "10");
        try {
            Session session = Session.getInstance(props, null);
            Store store = session.getStore();
            store.connect(host, mail, password);
            Folder inbox = store.getFolder("INBOX");
            inbox.open(Folder.READ_ONLY);
            FetchProfile profile = new FetchProfile();
            profile.add(FetchProfileItem.CONTENT_INFO);
            profile.add("X-mailer");
            Message msg[] = inbox.search(new FlagTerm(
                    new Flags(Flag.SEEN), false));
            ArrayList list = new ArrayList<>();
            SimpleDateFormat formatter2 = new SimpleDateFormat("HH:mm:ss dd/MM/yy", Locale.ENGLISH);
            inbox.fetch(msg, profile);
            for (Message message : msg) {
                Multipart PART = new MimeMultipart();
                MessageDetail detail = new MessageDetail(StringUtils.join(message.getFrom(), ", "), message.getSubject(), formatter2.parse(formatter2.format(message.getSentDate())));
                list.add(detail);
            }
            return list;
        } catch (MessagingException mex) {
            throw new Exception(mex.getMessage());
        }
    }

    public static void sendMail(final String username, final String password, final String host, final String[] toMail) {
        // Recipient's email ID needs to be mentioned.
        String to = StringUtils.join(toMail, ",");
        // Sender's email ID needs to be mentioned
        String from = username;//change accordingly
        // Assuming you are sending email through relay.jangosmtp.net
        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.port", "587");

        // Get the Session object.
        Session session = Session.getInstance(props,
                new javax.mail.Authenticator() {
                    @Override
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(username, password);
                    }
                });

        try {
            // Create a default MimeMessage object.
            Message message = new MimeMessage(session);

            // Set From: header field of the header.
            message.setFrom(new InternetAddress(from));

            // Set To: header field of the header.
            message.setRecipients(Message.RecipientType.TO,
                    InternetAddress.parse(to));

            // Set Subject: header field
            message.setSubject("Testing Subject");
            // Now set the actual message
            message.setText("Hello, this is sample for to check send "
                    + "email using JavaMailAPI ");

            // Send message
            Transport.send(message);

            System.out.println("Sent message successfully....");

        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }
}


import java.util.Date;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author BeytullahC
 */
@XmlRootElement(name = "messageDetail")
public class MessageDetail {

    public MessageDetail() {
    }

    public MessageDetail(String subject, Date sendDate) {
        this.subject = subject;
        this.sendDate = sendDate;
    }

    public MessageDetail(String from, String subject, Date sendDate) {
        this.from = from;
        this.subject = subject;
        this.sendDate = sendDate;
    }

    private String from;
    private String subject;
    private Date sendDate;


    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public Date getSendDate() {
        return sendDate;
    }

    public void setSendDate(Date sendDate) {
        this.sendDate = sendDate;
    }

    public String getFrom() {
        return from;
    }

    public void setFrom(String from) {
        this.from = from;
    }

}