SlideShare a Scribd company logo
Unsafe Java




              Misha Kozik
                @mishadoff
Average C developer
Java is Safe!
          ●   No pointers
          ●   No direct memory allocation
          ●   Compile-time checking
          ●   Platform-independent types
          ●   Checked Exceptions
          ●   Garbage collection
          ●   etc.
Not really...
Not really...

          sun.misc.Unsafe
“API” Overview
Info                           Synchronization
  ●   addressSize                ●   monitorEnter
  ●   pageSize                   ●   tryMonitorEnter
                                 ●   monitorExit
Objects                          ●   compareAndSwapInt
  ●   allocateInstance
                                 ●   putOrderedInt
  ●   objectFieldOffset
                                 ●   park
                                 ●   unpark
Classes
  ●   staticFieldOffset        Memory
  ●   defineClass                ●   allocateMemory
  ●   defineAnonymousClass       ●   copyMemory
  ●   ensureClassInitialized     ●   freeMemory
                                 ●   getAddress
Arrays                           ●   getInt
  ●   arrayBaseOffset            ●   putInt
  ●   arrayIndexScale


                                                         TOTAL: 105
Instantiation
“Trusted” code with bootloader




java -Xbootclasspath:/usr/jdk1.7.0/jre/lib/rt.jar:.
com.mishadoff.magic.UnsafeClient
Reflection
Usage
Avoid Initialization
Memory Corruption
#define TRUE FALSE
Very Unchecked Cast
Dynamic Classes
sizeOf
sizeOf
Shallow Copy
Hide Password
Throw Exception
Fast Serialization

● Serializable (so slooooow)
● Externalizable (requires schema)

● protobuf (dependency)

● kryo (dependency)

● Unsafe
Fast Serialization: Write
Fast Serialization: Read
Fast Serialization: Performance




Benchmarks:   https://github.com/eishay/jvm-serializers/wiki
Super Array
Off-heap Collections

● Not limited to Heap capacity
● Not limited to Integer.MAX_VALUE size

● No boundary checks

● Not under GC management

● Partially available at java.nio.*

● Useful for math computations

● Realtime programming




        “The price of greatness is responsibility.”
                             – Winston Churchill
Concurrency
Concurrency: Client
Concurrency: Stupid Counter
Concurrency: Stupid Counter




               Counter result: 99542945
                Time passed in ms: 679
Concurrency: Sync Counter
Concurrency: Sync Counter




             Counter result: 100000000
             Time passed in ms: 10136
Concurrency: Lock Counter
Concurrency: Lock Counter




             Counter result: 100000000
             Time passed in ms: 8065
Concurrency: Atomic Counter
Concurrency: Atomic Counter




              Counter result: 100000000
              Time passed in ms: 6552
Concurrency: CAS Counter
   CAS = Compare And Swap
Concurrency: CAS Counter
   CAS = Compare And Swap




               Counter result: 100000000
               Time passed in ms: 6454
Lock-free Data Structures
     Intuition
 ● Create a copy of current state
 ● Modify it

 ● CAS

 ● Repeat if it fails




 Problems
 ● Hard to implement.
 ● Problem ABA (DCAS, LL/SC)

 ● Reordering (Memory Barriers)
And finally...
Unsafe.park()

“Block current thread, returning when a balancing
unpark occurs, or a balancing unpark has already
occurred, or the thread is interrupted, or, if not
absolute and time is not zero, the given time
nanoseconds have elapsed, or if absolute, the given
deadline in milliseconds since Epoch has passed, or
spuriously (i.e., returning for no "reason"). Note:
This operation is in the Unsafe class only because
unpark is, so it would be strange to place it
elsewhere.”
                                        – Javadoc
Disclaimer
● May be removed/changed
● Not portable

● Depends on architecture

● Depends on JVM implementation

● Depends on major/minor JVM

● Never use it in production




             Gentle reminder:
             One error may cause
             JVM crash
Projects

Project Lambda
Project Jigsaw
Links
●   Javadoc http://www.docjar.com/docs/api/sun/misc/Unsafe.html
●   My Blog http://mishadoff.github.com/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/
●   Tricks with Direct Memory Access
    http://highlyscalable.wordpress.com/2012/02/02/direct-memory-access-in-java/

●   StackOverflow http://stackoverflow.com/questions/5574241/interesting-uses-of-sun-misc-unsafe
●   Native C/C++ Like Performance For Java Object Serialisation
    http://mechanical-sympathy.blogspot.de/2012/07/native-cc-like-performance-for-java.html

●   Big Arrays in Java http://www.omsn.de/blog/big-arrays-in-java
●   Lock-Free Wait-Free Hash Table
    http://www.azulsystems.com/about_us/presentations/lock-free-hash

●   Java theory and practice: Going atomic
    www.ibm.com/developerworks/java/library/j-jtp11234/

●   Fast multipurpose serialization (RU) http://www.javaspecialist.ru/2012/07/blog-post.html
Thanks!
 Q?

More Related Content

Unsafe Java