Tuesday, July 3, 2012

Hot Deploy Example

Can be used to build a generic task-execution engine that can be used to load the code supplied by any remote client.


The most important point is to correctly set the parent class loader which is null here .
note: with windows custom urlClassLoader is necessary which is overrides the close method of the base class  (due to a jvm bug{may be fixed in jdk7})


import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;


import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;


public class JarReloader {


public static void main(String[] args) {

Runnable r = new Runnable() {

@Override
public void run() {
while (true) {
reloadJarFile();
watchDirectory();
}
}


private void reloadJarFile() {
try {
System.out.println("Reloading the jar file !");
URLClassLoader cl = null;
   File file = new File("/home/ssunel/jars/reload.jar");
   String classToLoad = "com.freetime.enjoy.ReloadMe";
   URL jarUrl = new URL("file:" + file.getAbsolutePath());
   cl = new URLClassLoader(new URL[] {jarUrl}, null);
   Class loadedClass = cl.loadClass(classToLoad);
   Method method = loadedClass.getMethod("giveAMessage", new Class[] {});
   Object reloadMe = loadedClass.getConstructor().newInstance();
   method.invoke(reloadMe, null);
} catch (Exception e) {
e.printStackTrace();
}
}


private void watchDirectory() {
try {
Path dir = Paths.get("/home/ssunel/jars");
WatchService watchService = FileSystems.getDefault().newWatchService();
dir.register(watchService, ENTRY_CREATE, ENTRY_MODIFY);
WatchKey watchKey = watchService.take();
for (WatchEvent<?> event : watchKey.pollEvents()) {
WatchEvent<Path> ev = (WatchEvent<Path>) event;
Path name = ev.context();
Path child = dir.resolve(name);
System.out.format("%s: %s\n", event.kind().name(), child);
}
Thread.sleep(1000L);
       } catch (Exception x) {
           return;
       }
}


};

startReloader(r);

}


private static void startReloader(Runnable r) {
try {
Thread reloader = new Thread(r);
reloader.start();
reloader.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}


package com.freetime.enjoy;

public class ReloadMe {
private final static String someMessage = "HELLO WORLD AGAIN";
public static void giveAMessage (){
System.out.println(someMessage);
}
}

Directory Change Listener Example


jdk 7 Watch Service Sample Usage
The java.nio.file package provides a file change notification API, called the Watch Service API. This API enables you to register a directory (or directories) with the watch service. When registering, you tell the service which types of events you are interested in: file creation, file deletion, or file modification. When the service detects an event of interest, it is forwarded to the registered process. The registered process has a thread (or a pool of threads) dedicated to watching for any events it has registered for. When an event comes in, it is handled as needed.



import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;


public class DirListener {


public static void main(final String[] args) {
try {
Runnable r = new Runnable() {
@Override
public void run() {
while (true) {
handleDirectoryChangeEvent(args[0]);
}
}
};


Thread t = new Thread(r);
t.start();
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}


private static void handleDirectoryChangeEvent(String path) {
try {
Path dir = Paths.get(path);
WatchService watchService = FileSystems.getDefault().newWatchService();
dir.register(watchService, ENTRY_CREATE, ENTRY_MODIFY);
WatchKey watchKey = watchService.take();
for (WatchEvent<?> event : watchKey.pollEvents()) {
WatchEvent<Path> ev = (WatchEvent<Path>) event;
Path name = ev.context();
Path child = dir.resolve(name);
System.out.format("%s: %s\n", event.kind().name(), child);
}
        } catch (Exception x) {
            return;
        }
}
}



program output...



ENTRY_CREATE: /home/ssunel/jars/reloadtes1.jar
ENTRY_CREATE: /home/ssunel/jars/reloadtest.jar
ENTRY_CREATE: /home/ssunel/jars/zi3iCChW
ENTRY_CREATE: /home/ssunel/jars/Untitled Document
ENTRY_CREATE: /home/ssunel/jars/ss.txt
ENTRY_CREATE: /home/ssunel/jars/.goutputstream-RVZAHW
ENTRY_MODIFY: /home/ssunel/jars/.goutputstream-RVZAHW
ENTRY_MODIFY: /home/ssunel/jars/.goutputstream-RVZAHW
ENTRY_CREATE: /home/ssunel/jars/ss.txt~
ENTRY_MODIFY: /home/ssunel/jars/reload.jar



Monday, February 27, 2012

Finding the top cpu consumer threads with jconsole

1) Download this jar file


2) Open the jconsole using the plugin


ssunel@javabender:$ /usr/java/bin/jconsole -pluginpath /home/ssunel/Downloads/topthreads.jar

Finding top consumer Java Threads with Unix TOP command and JStack

1)ssunel@VTEKPSSUNEL:~$ top -c -b -H -n1 -d1 | head -n 20 | grep 'java\|CPU'

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                    
28763 ssunel    20   0 2893m 821m  10m R  100 10.3   0:38.97 /usr/java/bin/java
28518 ssunel    20   0 2893m 821m  10m S    2 10.3   0:00.30 /usr/java/bin/java
28667 ssunel    20   0 2893m 821m  10m S    2 10.3   0:00.07 /usr/java/bin/java

28733 ssunel    20   0 2893m 821m  10m S    2 10.3   0:00.11 /usr/java/bin/java 

2)Go to : here or use any other converter & convert decimal thread-id(s) [28763  -  28518  -  28667  -  28733 ] to hexedecimal.

Java thread identifiers will be something like that : 
pid    :  nid
28763  : 0x705b
28518 : 0x6f66
28667 : 0x6ffb
28733 : 0x703d

3)ssunel@VTEKPSSUNEL:~$ jstack <pid>

4) Search for the nativeId(s) in the thread dump : nid=0x705b or nid=0x6f66 or nid=0x6ffb or nid=0x703d

Example: 
"SocketListener" daemon prio=10 tid=0x0f474c00 nid=0x705b runnable [0x0386e000]
   java.lang.Thread.State: RUNNABLE
    at java.lang.Throwable.fillInStackTrace(Native Method)
    - locked <0x299364f4> (a java.nio.channels.NotYetBoundException)
    at java.lang.Throwable.<init>(Throwable.java:181)
    at java.lang.Exception.<init>(Exception.java:29)
    at java.lang.RuntimeException.<init>(RuntimeException.java:32)
    at java.lang.IllegalStateException.<init>(IllegalStateException.java:27)
    at java.nio.channels.NotYetBoundException.<init>(NotYetBoundException.java:30)
    at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:139)
    - locked <0x6567a198> (a java.lang.Object)
    at com.mycompany.smppgwsocket.smpp34server.Smpp34ServerSocketListener.run(Smpp34ServerSocketListener.java:08)

Thursday, February 9, 2012

How to display JVM HEAP and PERMGEN using JMAP

ssunel@javabender:/space/bin$ jmap -heap 4028
Attaching to process ID 4028, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 20.4-b02

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 1073741824 (1024.0MB)
   NewSize          = 1048576 (1.0MB)
   MaxNewSize       = 4294901760 (4095.9375MB)
   OldSize          = 4194304 (4.0MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 16777216 (16.0MB)
   MaxPermSize      = 67108864 (64.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 31326208 (29.875MB)
   used     = 9114008 (8.691795349121094MB)
   free     = 22212200 (21.183204650878906MB)
   29.09387564559362% used
From Space:
   capacity = 10944512 (10.4375MB)
   used     = 10937848 (10.431144714355469MB)
   free     = 6664 (0.00635528564453125MB)
   99.93911103574102% used
To Space:
   capacity = 13828096 (13.1875MB)
   used     = 0 (0.0MB)
   free     = 13828096 (13.1875MB)
   0.0% used
PS Old Generation
   capacity = 54329344 (51.8125MB)
   used     = 30716608 (29.29364013671875MB)
   free     = 23612736 (22.51885986328125MB)
   56.5377855473462% used
PS Perm Generation
   capacity = 39321600 (37.5MB)
   used     = 22346712 (21.311485290527344MB)
   free     = 16974888 (16.188514709472656MB)
   56.83062744140625% used


ssunel@javabender:/space/$ jmap -permstat 4028
Attaching to process ID 4028, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 20.4-b02
11313 intern Strings occupying 886336 bytes.
finding class loader instances ..Finding object size using Printezis bits and skipping over...
Finding object size using Printezis bits and skipping over...
Finding object size using Printezis bits and skipping over...
Finding object size using Printezis bits and skipping over...
Finding object size using Printezis bits and skipping over...
done.
computing per loader stat ..done.
please wait.. computing liveness......................................liveness analysis may be inaccurate ...
class_loader classes bytes parent_loader alive? type

<bootstrap> 2784 12492344  null   live <internal>
0xa1655e20 1 1784  null   dead sun/reflect/DelegatingClassLoader@0x6f7a9c30
0x73a52dc8 6 18072 0x7447ada0 live sun/reflect/misc/MethodUtil@0x6fce5a10
0xa1682da8 1 1184 0x7447ada0 dead sun/reflect/DelegatingClassLoader@0x6f7a9c30
0x74406470 1 1184 0x7447ada0 dead sun/reflect/DelegatingClassLoader@0x6f7a9c30
0xa16830d8 1 1184 0x7447ada0 dead sun/reflect/DelegatingClassLoader@0x6f7a9c30
0x73b660b8 1 1184 0x7447ada0 dead sun/reflect/DelegatingClassLoader@0x6f7a9c30
0x7440c5b8 1 1184 0x7447ada0 dead sun/reflect/DelegatingClassLoader@0x6f7a9c30
0x73b66160 1 1184 0x7447ada0 dead sun/reflect/DelegatingClassLoader@0x6f7a9c30
0x74406790 1 1184 0x7447ada0 dead sun/reflect/DelegatingClassLoader@0x6f7a9c30
0x73b66128 1 1216 0x73a52dc8 dead sun/reflect/DelegatingClassLoader@0x6f7a9c30
0x74b86370 1 1184  null   dead sun/reflect/DelegatingClassLoader@0x6f7a9c30
0x74405e30 1 1184 0x7447ada0 dead sun/reflect/DelegatingClassLoader@0x6f7a9c30
0xa15be7c0 1 1992  null   dead sun/reflect/DelegatingClassLoader@0x6f7a9c30
0x73b660f0 1 1184  null   dead sun/reflect/DelegatingClassLoader@0x6f7a9c30
0x73a52e60 1 1824  null   dead sun/reflect/DelegatingClassLoader@0x6f7a9c30
0x7447ade8 85 405928  null   live sun/misc/Launcher$ExtClassLoader@0x6f89e7b0
0x73a52e98 1 1992  null   dead sun/reflect/DelegatingClassLoader@0x6f7a9c30
0x7447ada0 2498 8514496 0x7447ade8 live sun/misc/Launcher$AppClassLoader@0x6f8ead78
0xa1683ad0 1 1808  null   dead sun/reflect/DelegatingClassLoader@0x6f7a9c30
0x73b8f2e0 0 0 0x7447ada0 dead java/util/ResourceBundle$RBClassLoader@0x6fa09738
0xa16834a8 1 1184  null   dead sun/reflect/DelegatingClassLoader@0x6f7a9c30
0x73a52e08 1 1784  null   dead sun/reflect/DelegatingClassLoader@0x6f7a9c30
0xa15beae0 1 2008  null   dead sun/reflect/DelegatingClassLoader@0x6f7a9c30
0x74406150 1 1184 0x7447ada0 dead sun/reflect/DelegatingClassLoader@0x6f7a9c30
0x74407ad0 1 1184 0x7447ada0 dead sun/reflect/DelegatingClassLoader@0x6f7a9c30
0xa16837c8 1 1184  null   dead sun/reflect/DelegatingClassLoader@0x6f7a9c30

total = 27 5395 21461824    N/A     alive=4, dead=23    N/A