Java 7 – New Features Svetlin Nakov Bulgarian Association of Software Developers Egyptian Java User Group (EGJUG) Cairo, 2 May 2010 www.devbg.org About the Speaker • Svetlin Nakov • 15+ years software engineering experience • PhD in computer science from Sofia University • Chairman of the Bulgarian Association of Software Developers (BASD) – www.devbg.org • Author of 6 books about Java, .NET and software engineering • Web site: www.nakov.com Table of Contents • Java 7 – Introduction and Chronology • Dynamic Languages in JVM • Java Modularity – Project Jigsaw • Language Enhancements (Project Coin) • Closures for Java • JSR 203: NIO 2 • Other new features: • Compressed 64-bit oops, Garbage-First GC, Upgraded Class-Loaders, URLClassLoader. close(), Unicode 5.1, SCTP and SDP Introduction and Chronology OpenJDK • JDK7 is the second JDK done via the OpenJDK effort • OpenJDK is free, open-source and GPL licensed • A lot of the improvements of JDK7 are separate projects on OpenJDK • Some say that projects go under the cap of OpenJDK to avoid the cumbersome and slow JCP process Java 7 – Milestones • Began in August 2006 • First supposed to be 7 milestones • Mark Reinhold extended them to 10 • Current status: M7 finished, presentation made with build89 • M10 expected to finish 09.09.2010 “The last scheduled milestone cycle will be followed by a test and stabilization period of indeterminate length, after which the final release will be declared” There’s No JSR Yet • A Java 7 JSR is supposed to be formed • Java SE 6 was under the 'Umbrella' JSR 270 • JDK7 is in Eclipse’s low priority list because a lack of container JSR • JDK7 cannot be finalized without a JSR • There are some functionalities that also lack a JSR • While doing this presentation we used the term JSR TBD in lieu of the missing JSR Source Control System • Official SCM is SVN, still >svn co https://jdk7.dev.java.net/svn/jdk7/trunk • Note: it takes a 'while' (e.g. one night) • Unofficial Mercurial forest repositories available since November 2007 >hg fclone http://hg.openjdk.java.net/ • Note: this also takes a 'while' Currently Supported IDEs • Eclipse • Both Eclipse 3.6M6 and E4 do not support JDK7’s syntax • … or I couldn’t figure it out • Strangely enough the option is there: • Source compatibility: 1.7 • NetBeans • 6.9 Beta supports JDK7 • Compiles successfully the M7 syntax Dynamic Languages in JVM The Da Vinci Machine Project Da Vinci: a multi-language renaissance for the Java Virtual Machine architecture • Prototype a number of extensions to the JVM • A.k.a. Multi Language Virtual Machine – http://openjdk.java.net/projects/mlvm/ • Allows non-Java dynamic languages to run efficiently in the JVM • Emphasis is on general purpose extensions • Hosted on OpenJDK Dynamic Languages in JVM • Da Vinci Machine sub-projects include: • Dynamic invocation • Continuations • Tail-calls • And interface injection • JSR 292: Supporting Dynamically Typed Languages on the Java Platform • The standard behind Da Vinci Machine • Natural continuation of JSR 223: Scripting for the Java Platform implemented in JDK 6 Dynamic Languages in JVM (2) • New JVM instruction invokedynamic • Allows extremely fast dynamic method invocation through method handles • Will enable JRuby, Jython, Groovy and other dynamic and scripting languages to call dynamic methods natively at bytecode level • Method handles • Lightweight references to a method – java.dyn.MethodHandle • Anonymous classes in the JVM Dynamic Languages in JVM (3) • Autonomous methods • Methods that can be dynamically attached to an existing class at runtime • Interface injection • Acquiring base interfaces and method implementations at runtime • Continuations and stack introspection • Suspend / resume thread's execution stack • Tail calls and tail recursion Dynamic Languages in JVM (4) • Runtime support for closures • Closure is a lambda-expression bound (closed) to its environment • Multimethods • Dispatch a method overload depending on the actual arguments at runtime • Faster reflection and faster interface invocation based on dynamic invocation • Symbolic freedom for identifier names Dynamic Invoke – Example static void greeter(String x) { System.out.println("Hello, " + x); } static MethodHandle greeterMethodHandle = MethodHandles.lookup().findStatic( DynamicInvocation.class, "greeter", MethodType. methodType(void.class, String.class)); static { Linkage.registerBootstrapMethod( "bootstrapDynamic"); } Dynamic Invoke – Example (2) private static CallSite bootstrapDynamic( Class caller, String name, MethodType type) { if (type.parameterCount() == 1 && name == "hail") { MethodHandle target = MethodHandles. convertArguments(greeterMethodHandle, type); CallSite site = new CallSite(caller, name, type); site.setTarget(target); System.out.println("Set the CallSite target to " + greeterMethodHandle); return site; } } public static void main(String... args) { InvokeDynamic.hail("dynamic invocation"); } Java Modularity Project Jigsaw Modularization – Introduction • The JDK and the JRE, have always been delivered as massive, indivisible artifacts • The growth of the platform has thus inevitably led to the growth of the basic JRE download • which now stands at well over 14MB • despite heroic engineering efforts such as the Pack200 class file compression format • Java Kernel and Quickstarter features do improve download time and startup time, at least for Windows users The Real Solution • The most promising way to improve the key metrics of • Download time • Startup time • And memory footprint • Is to attack the root problem head-on: • Divide the JDK into a set of well specified and separate, yet interdependent, modules • A side effect is that JAR format has to reworked Alan Bateman: It’s Difficult • Suppose you are using the Logging API • Logging requires NIO (for file locking) • And JMX (as loggers are managed) • JMX requires JavaBeans, JNDI, RMI and CORBA (JMX remote API mandates that the RMI connector support both JRMP and IIOP) • JNDI requires java.applet.Applet (huh?) and JavaBeans has dependencies on AWT, Swing • Not satisfied with this, JavaBeans has persistent delegates that create dependencies on JDBC and more How to Do It? • Modularizing the JDK requires a module system capable of supporting such an effort • It requires, in particular, a module system whose core can be implemented directly within the Java virtual machine • Modularizing is best done with a module system that’s tightly integrated with the Java language • Otherwise the compile-time module environment can differ dramatically from the run-time module environment Which Module System? • JSR 277 proposes the JAM module system • Some of its rich, non-declarative features would be impossible to implement its core functionality directly within the JVM • Therefore Sun halted the development • JSR 294 is chartered to extend the language and JVM to support modular programming • Well received for its simplicity and its utility to existing module systems such as OSGi Which Module System? (2) • OSGi • May 2007: OSGi 4.1 standardized as JSR-291 • Reasonably mature, stable, and robust • Implemented within Apache Harmony JVM • Not at all integrated with the Java language • Jigsaw created to modularize JDK7 • Will not be an official part of the Java SE 7 Platform Specification and might not be supported by other SE 7 implementations Status and Examples • Probably JSR 294 will be chosen • There are issues, JSR 294 is inactive (paused) • Not implemented yet (b89), java.lang.module • Example (may, and probably will, change) module M1@1.0 provides M2@2.0, M3@3.0 { requires M4@4.0, M5@5.0; permits M6; // only M6 can depend on M1 } module M; package P; public class Foo {...} JSR 308: (Extended) Annotations on Java Types JSR 308 – Introduction • Java SE 6 permits annotations only on declarations • JSR 308 extends Java’s annotation system so that annotations may appear on nearly any use of a type • JSR 308 is backward-compatible and continues to permit those annotations • Two new types of annotations (target wise): • ElementType.TYPE_USE • ElementType.TYPE_PARAMETER JSR 308: Examples public static void main() { //for generic type arguments in a generic method JSR308Example2.<@NonNull String>method("..."); //for type parameters and type parameter bounds: Collection<@Long ? super @Existing File> c = null; //for class inheritance: class UnmodifiableList<T> implements @Readonly List<@Readonly T> { } } //for throws clauses: void monitorTemperature() throws @Critical Exception {} //for method receivers: public String toString() @Readonly { return null; } // helper only public static <T> T method(String s) {return null;} Small Language Enhancements (Project Coin) Project Coin – Introduction • Project Coin unites all language changes to the Java Lang Specification (JLS) to be added to JDK 7 • Open call for proposals • From February 27, 2009 • Through March 30, 2009 • 70 proposal forms • 9 were chosen • No Milestone selected yet (so not all features are available) The Chosen Ones • Strings in Switch • By Joseph D. Darcy • Automatic Resource Management • By Joshua Bloch • Improved Type Inference for Generic Instance Creation • By Jeremy Manson • Simplified Varargs Method Invocation • By Bob Lee The Chosen Ones (2) • Collection Literals • By Joshua Bloch • Indexing access syntax for Lists and Maps • By Shams Mahmood • Language support for JSR 292 • By John Rose • Binary Literals • Underscores in numbers • By Derek Foster 1. Strings in Switch Strings in Switch • Syntactic sugar // Finally! - strings in switch String s = ""; switch (s) { case "Edno": out.println("1"); break; case "Dve": out.println("2"); break; default: out.println("Unknown BG number."); break; } 2. Automatic Resource Management (ARM) ARM – The Problem • A resource is as an object that must be closed manually • InputStream, Reader, Writer, DB connection • Manual resource termination has proven ugly and error prone • Even good programmers get it wrong • Resource leaks or even outright failures, which may be silent • If an exception is thrown in the try block, and in the finally block, the second supplants the first ARM – The Problem (2) • Where’s the problem with this code? BufferedWriter br = new BufferedWriter(new FileWriter(path)); try { br.write("Text"); } finally { br.close(); } • If an exception is thrown in the try block, and in the finally block, the second supplants the first • Was "Text" written successfully? How It’s Done (One Resource) • Try-finally – with one resource: BufferedWriter br = new BufferedWriter(new FileWriter(path)); try { // This exception is more important br.write("Text"); } finally { try { // ... than this one br.close(); } catch(IOException ioe) {} } How It’s Done (Two Resources) static void copy(String src, String dest) throws IOException { InputStream in = new FileInputStream(src); try { OutputStream out = new FileOutputStream(dest); try { byte[] buf = new byte[8 * 1024]; int n; while ((n = in.read(buf)) >= 0) out.write(buf, 0, n); } finally { try { out.close(); } catch(IOException ioe) {} } } finally { try { in.close(); } catch(IOException ioe) {} } } ARM Syntax – Two Resources static void copy(String src, String dest) throws IOException { try (InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dest)) { byte[] buf = new byte[8192]; int n; while ((n = in.read(buf)) >= 0) out.write(buf, 0, n); } } • Code is now 4 lines • Removed the boring nested try, catch, finally, close() clauses • The first exception is thrown if a problem occurs, the close() exception is hidden Automatic Resource Management • ARM statement is a form of the try statement that declares one or more resources • The scope of these resource declarations is limited to the statement • When the statement completes, whether normally or abruptly, all of its resources are closed automatically • As of b89 ARM is not yet available, but definitely going to be inside JDK7 An Interface Must be Chosen • A class must implement a designated interface to make it eligible for automatic resource management package java.io; import java.io.IOException; public interface Closeable { public void close() throws IOException; } • An obvious choice would be Closeable • close() method throws IOException • What about general purpose resources? An Interface Must be Chosen (2) • It is possible to retrofit Closeable with a parameterized superinterface package java.lang; public interface Disposable<X extends Throwable> { void close() throws X; } • Disposable would become: package java.io; import java.io.IOException; public interface Closeable extends Disposable<IOException> { void close() throws IOException; } ARM – Notes • No interface is chosen, nor implemented yet • As of b89 • Migration • Any resource that must be closed manually should be retrofitted to implement the Disposable interface • In the JDK, this includes: • Closeable (all streams implement it) • Connection, Statement, and ResultSet Suppressed Exceptions • ARM discards suppressed exceptions • Proposal implies they can be saved by adding them in suppressing exception via two new methods to Throwable: • void addSuppressedException(Throwable) • Throwable[]getSuppressedExceptions() • As of b89 not implemented and it’s not clear whether they will be 3. Improved Type Inference for Generic Instance Creation What is the Fuss All About? • Simply this: Map<String, List<String>> anagrams = new HashMap<String, List<String>>(); • … becomes: Map<String, List<String>> anagrams = new HashMap<>(); • <> is called the ‘diamond‘ • Cannot be omitted because no difference can be made between raw HashMap and a parameterized one • [Ctrl+Shift+F] fails on diamond in NetBeans 6.9 • Implemented in b89 Diamond <>: Advanced Example • This is supposed to work: public class AdvancedExample { public static void main() { method("", new ArrayList<>(), new ArrayList<>()); } public static <T> T method( T a, List<T> b, List<Map<T, T>> c) { return a; } } • …but does not yet (as of b89) 4. Simplified Varargs Method Invocation Simplified Varargs Method… • The compiler currently generates an "unsafe operation" warning • When a programmer tries to invoke a varargs method with a non-reifiable varargs type • JDK 7 will move the warning from the call site to the method declaration • Major advantages • Reduces the total number of warnings reported to and suppressed by programmers A Picture is Worth a 1000 Words /** NOT WORKING in b89, no change with jdk1.6.0_20 */ public static void main() { Callable<String> t = null; //OLD: Warning: "uses unchecked or unsafe operations“ List<Callable<String>> merged = asList(t); System.out.println(merged); } // NEW: Warning: "unchecked generic array creation" private static <T> List<T> asList(T... elements ) { return Arrays.asList(elements); } Simplified Varargs – Example interface Sink<T> { void add(T... a); } /** NOT WORKING in b89, no change with jdk1.6.0_20 */ interface BrokenSink<T> extends Sink<T> { // OLD: no warning // NEW: Warning: "Overriddes non-reifiable varargs type with array" void add(T[] a); } /** NOT WORKING in b89, no change with jdk1.6.0_20 */ class StringSink implements Sink<String> { // OLD: no warning // NEW: Warning: "override generates a more specific varargs type erasure" public void add(String... a) {} } 5. Collection Literals Collection Literals • Again a syntax sugar /** NOT WORKING in b89 */ public static void main(String... args) { List<String> list = ["One", "Two"]; Set<String> set = {"One", "Two", "Three"}; Map<String, Integer> map = {"One" : 1, "Two" : 2}; // Note: Object s = { }; // empty set; Object m = {:}; // empty map; } • Not yet available, so no demo 6. Indexing Access Syntax for Lists and Maps Collection Indexers • Syntax sugar /** NOT WORKING in b89 */ public static void main(String... args) { List<String> list = Arrays.asList(new String[]{"a", "b", "c"}); Map<Integer, String> map = new HashMap<Integer, String>(4); // THE OLD WAY String firstElement = list.get(0); map.put(1, "One"); // THE NEW WAY (NOT IMPLEMENTED YET) String firstElement = list[0]; map[1] = "One"; } 7. Language Support for JSR 292 JSR 292 Support in javac • java.dyn.InvokeDynamic will accept any method call and turn it into an invokedynamic instruction • The type java.dyn.MethodHandle will accept any argument and return types • Bytecode names acceptable to the JVM can be spelled from Java code, using #" " • java.dyn.InvokeDynamic serves as a bare reference type: anything implicitly converts to it • It can be cast to anything, but it is not a subtype of java.lang.Object JSR 292 – Example // Works in b89 // type (Object, int) -> boolean boolean z = java.dyn.InvokeDynamic.<boolean>myEquals(x, y); // Works in b89 MethodHandle hndl = MethodHandles.lookup().findVirtual( PrintStream.class, "println", MethodType.methodType( void.class, String.class)); hndl.invokeGeneric(System.out, "Merhaba"); // Works in b89 String #"g 1 $!$#%" = "Text"; System.out.println(#"g 1 $!$#%"); 9. Underscores in Numbers Underscores in Numbers • Too much sugar can cause diabetes • May seem useless, but don’t judge too quickly /** WORKING in b89 */ public static void main(String... args) { // THE OLD WAY int oldBillion = 1000000000; // THE NEW WAY int newBillion = 1_000_000_000; out.println(oldBillion); out.println(newBillion); } 10. Binary Literals Binary Literals • The syntax is 0b11110000; • See where underscores come in handy? /** WORKING in b89 public static void // THE OLD WAY int oldBinary1 = int oldBinary2 = */ main(String... args) { 153; 128 ^ 0 ^ 0 ^ 16 ^ 8 ^ 0 ^ 0 ^ 1; // THE NEW WAY int newBinary = 0b1001_1001; out.println(oldBinary1); out.println(oldBinary2); out.println(format("[0b1001_1001] is {0}", newBinary)); } Closures in Java First-class Functions, Function Types and Lambda Expressions What are Closures? • Closures – definition • Closures are functions that are evaluated in an environment containing one or more bound variables [Wikipedia] • In English: a little snippet of code (function) that can be passed as argument of some method for subsequent execution • Closures come from functional programming languages like Lisp • Limited support for closures since JDK 1.1, in the form of anonymous classes First-class and Anonymous Functions • First-class functions are programming paradigm that supports • Data structure holding a function with its parameters and return type • Passing functions as arguments to other functions and invoking them • Returning functions as result • Anonymous functions • Functions without name (lambda functions) • Take some parameters and return a value Lambda Expressions • Lambda calculus • A formal mathematical system for function definition, function application and recursion • Typed and untyped lambda calculus • Lambda expressions • Anonymous functions that take parameters and return values, e.g. • x → x*x • (x, y) → x*x + y*y • A.k.a. lambda functions Project Lambda • Project Lambda • Goals • To formulate a proposal to add first-class functions, function types, and lambda expressions (informally, "closures") to Java • To implement a prototype suitable for inclusion in JDK 7 • Official Web Site • http://openjdk.java.net/projects/lambda/ • Status • Straw-man proposal, still no JSR Lambda Expressions in Java • Lambda expressions in Java use the # syntax • Function with no arguments, returns 42: #()(42) • Function with int argument: #(int x)(x + x) • Function with two int arguments: #(int x, int y)(x * y) Lambda Expressions with Code Block • Lambda expressions can have body • A Java code block: #(int x, int y) { int z = (int)Math.sqrt(x*x + y*y); if (z < 10) return x; else if (z > 10) return y; else return 0; } Function Types • Function types are data types that hold a reference to lambda function or method: #int() fortyTwo = #()(42); #int(int) triple = #(int x)(3*x); #int(int,int) mult = #(int x, int y)(x * y); • Functions stored in variable of function type can be invoked like any other function: System.out.println(fortyTwo()); int result = triple(5); int multResult = mult(3, 5); Functions as Arguments • Lambda functions can be passed as arguments to a method public long sum(int[] arr, #int(int) fn) { long sum = 0; for (int element : arr) sum += fn(element); return sum; } int[] arr = new int[] {1, 2, 3, 4}; long squaresSum = sum(arr, #(int x)(x*x)); System.out.println(squaresSum); // 30 Functions as Return Value • Lambda functions can be returned as result of method execution: public #int(int) adder(int c) { return #(int x)(x + c); } #int(int) a42 = adder(42); System.out.println(a42(2)); // 44 Function Conversions • Lambda functions can be converted to abstract class / interface defining a single method: Thread th = new Thread(new Runnable() { public void run() { doSomeStuff(); doMoreStuff(); } }); Thread th = new Thread(#(){ doSomeStuff(); doMoreStuff(); } ) Variable Capture • We can share local state between the body of a lambda expression and its enclosing scope • A new keyword shared is introduced shared int comparisonsCount = 0; Collections.sort(data, #(String a, String b) { comparisonsCount++; return a.compareTo(b); }); System.out.println(comparisonsCount); Instance Capture • The this reference of the enclosing class could be accessed in a lambda expression: class CountingSorter { private int comparisonsCount = 0; Collections.sort(data, #(String a, String b) { comparisonsCount++; return a.compareTo(b); } ); Extension Methods • Extension methods allow the author of an existing interface to add methods to that interface while preserving compatibility • For example, we need to add a method for filtering members from any collection by given Boolean condition: Set<Integer> set = new Set<Integer>(new int[] {1,2,3,4,5}); Set<Integer> filteredSet = set.filter(#boolean(int x)(x < 3)); Extension Methods (2) • Defining extension methods: class Collections { … static <T> Set<T> filter( Set<T> s, #boolean(T) pred) { … } static <S,T> Set<S> map( Set<T> s, #S(T) func) { … } } interface Set<T> extends Collection<T> { … Set<T> filter(#boolean(T)) import static Collections.filter; <S> map(#S(T)) import static Collections.map; } Extension Methods (3) • Using extension methods: int ints = new int[] { 1, 2, 3, 4, 5 }; int[] transformedInts = s.filter(#(int x)(x % 2 == 0)) .map(#(int x)(x + 3)); // transformedInts = { 5, 7 } int[] transformedInts = Collections.map( Collections.filter(s, #(int x)(x % 2 == 0)), #(int x)(x + 3) ); Parallel Arrays API • ParallelArray<T> is ideal candidate for extension methods • Can utilize efficiently multi-core / multiprocessor systems • The class ParallelArray<T> allows parallel aggregate operations over a collection • Apply transformation to each element • Map each element to a new element • Select subset of the elements by predicate • Reduce elements to a single value (e.g. sum) JSR 203: More New I/O APIs for the Java Platform (NIO.2) NIO2 – Introduction • New I/O or non-blocking I/O, usually called NIO • Collection of Java APIs that offer features for intensive I/O operations • It was introduced with the J2SE 1.4 • NIO was developed under the Java Community Process as JSR 51 • As of 2006, an extension to NIO, called NIO2, is being developed under JSR 203 • JSR 203 is scheduled to be included in JDK 7 Cool New Things: resolve() • resolve() – resolves a relative path public static void resolve() { FileSystem fileSystem = FileSystems.getDefault(); Path currentDir = fileSystem.getPath("."); Path srcDir = fileSystem.getPath("src"); Path file1 = fileSystem.getPath("./Test.java"); Path file2 = fileSystem.getPath(“../Copy.java"); System.out.println( "file2: " + currentDir.resolve(srcDir).resolve(file2)); } Cool New Things: relativize() • relativize() – makes path relative public static void relativize() { FileSystem fileSystem = FileSystems.getDefault(); Path source = fileSystem.getPath("."); Path temp = fileSystem.getPath("/temp"); Path relativeSource = source.toAbsolutePath(). relativize(temp.toAbsolutePath()); System.out.println(relativeSource); } How to Copy a File • Up to Java 6 (w/o channels) it looks like this: try { from = new FileInputStream(fromFile); to = new FileOutputStream(toFile); byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = from.read(buffer)) != -1) to.write(buffer, 0, bytesRead); // write } finally { // Close the streams "to" and "from" } • Familiar? • Most developers write this incorrectly How to Copy a File (2) • java.io.File is used to represent a file • @since 1.0 • Is there a way to copy metadata? • JDK7: java.io.File -> java.nio.file.Path FileSystem local = FileSystems.getDefault(); Path from = local.getPath(FileName); Path to = local.getPath(toFileName); from.copyTo(to); • java.io.File won’t be deprecated, but should • Path is a better name (might be a dir, right?) // java.io.File -> java.nio.filePath Path p = new File("/foo/bar.txt").toPath(); Upgrade ClassLoader Architecture The Problem • Bug ID: 4670071 • Submit Date: 17-APR-2002 • Release Fixed: 7 (b47) • Means: Fixed in JDK7 (build 47) • b47 got released Q1 2009 • The bug is about a classloader deadlock • deadlocks as caused by non-interceptible loadClassInternal() calls • How many of you know about the existence of bug 4670071? Compressed 64-bit Object Pointers What is an oop? • An "oop", or "ordinary object pointer" in the JVM is a managed object pointer • It is normally the same size as a native machine pointer • 64 bits on an 64-bit OS • 32 bits on an 32-bit OS • 32-bit JVM can address less than 4GB • 64-bit JVM can address all the available RAM • But this costs a lot of memory lost in oops Compressed oops • Compressed oops allow to address up to 32 GB RAM with 32-bit pointers • The address space is mapped using a 64-bit base and 32-bit oop • This allows applications to address up to four billion objects (not bytes) • Java heap can grow up to 32 GB Garbage-First GC (G1) Garbage-First GC (G1) • G1 (garbage-first) garbage collector • Improved performance and less freeze time • Server-style garbage collector • Targeted for multi-processors with large memories • Meets a soft real-time goal with high probability • Added in Milestone1 (02.01.2009) • Released in Java 6 update 6u14 Method to close a URLClassLoader URLClassLoader.close() • URLClassLoader has new method called close() /** @since 1.7 */ urlClassLoader.close(); • since b48 of JDK 7 • Closes any JAR files that were open by the loader • Allows the application to delete/replace these files and if necessary to create new loaders • Invalidates the loader, so that no new classes can be loaded from it Unicode 5.1 Unicode 5.1 in Java 7 • Java 6 is Unicode 4.0 compliant • Java 7 will be Unicode 5.1 compliant • Most up-to-date version of Unicode is 5.2 (October 2009) • What's new in Unicode 5 ? • Unicode 5.0 will include 1,369 new characters and 9 new blocks (~alphabets) • Unicode 5.1 will have 1,624 additional char’s making a grand total of 100,713 breaking the 100K mark for the first time SCTP (Stream Control Transmission Protocol) SCTP • Stream Control Transmission Protocol (SCTP) is a Transport Layer protocol • serving in a similar role as TCP and UDP • Features of SCTP include: • Multihoming support: both endpoints of a connection can consist of more than one IP • Chunks delivered within independent streams • Protect against flooding attacks • No Windows supports SCTP JDK7: The SCTP Project • The goal of this Project is: • To develop an API for the Stream Control Transport Protocol (SCTP) • And a corresponding OpenJDK prototype • The API is implementation agnostic • Included in build 56 • Could be hacked to work with JDK6 • Currently only Solaris is supported SDP (Sockets Direct Protocol) SDP • The Sockets Direct Protocol (SDP) is a networking protocol originally defined by the InfiniBand Trade Association • Transport agnostic protocol for Remote Direct Memory Access (RDMA) • RDMA is a direct memory access from one computer’s memory into another’s without involving either one's operating system • JDK7’s SDP implementation works, unfortunately, only on Solaris Java 7 New Features Questions? Resources – Java Chronology • JDK 7 – Features • http://openjdk.java.net/projects/jdk7/featu res/ • JDK 7 – Milestones • http://openjdk.java.net/projects/jdk7/miles tones/ Resources – Dynamic Langs • New JDK 7 Feature: Support for Dynamically Typed Languages in the Java Virtual Machine • http://java.sun.com/developer/technicalArti cles/DynTypeLang/ • John Rose's weblog at Sun Microsystems • http://blogs.sun.com/jrose/ • JSR 292: Supporting Dynamically Typed Languages on the Java Platform • http://jcp.org/en/jsr/detail?id=292 Resources – Project Jigsaw • Project Jigsaw: Language changes for Modules • http://openjdk.java.net/projects/jigsaw/doc /language.html • Project Jigsaw – Mark Reinhold’s Blog • http://blogs.sun.com/mr/entry/jigsaw • Is the JDK Losing its Edge(s)? • http://blogs.sun.com/alanb/entry/ is_the_jdk_losing_its Resources – JSR 308 • Type Annotations Specification (JSR 308) • http://types.cs.washington.edu/jsr308/speci fication/java-annotation-design.html • Type Annotations FAQ (JSR 308) • http://types.cs.washington.edu/jsr308/js r308-faq.html • The Checker Framework: Custom Pluggable Types for Java • http://types.cs.washington.edu/checkerframework/current/checkers-manual.html Resources – Project Coin • Project Coin • http://wikis.sun.com/display/ProjectCoin/20 09ProposalsTOC • http://mail.openjdk.java.net/pipermail/coin -dev/2009-February/000001.html • Strings in switch • http://mail.openjdk.java.net/pipermail/coindev/2009-February/000001.html • Automatic Resource Management • http://mail.openjdk.java.net/pipermail/coindev/2009-February/000011.html Resources – Project Coin (2) • Improved Type Inference for Generic Instance Creation • http://mail.openjdk.java.net/pipermail/coin -dev/2009-February/000009.html • Simplified Varargs Method Invocation • http://mail.openjdk.java.net/pipermail/coin -dev/2009-March/000316.html • Collection Literals • http://mail.openjdk.java.net/pipermail/coin -dev/2009-March/001193.html Resources – Project Coin (3) • Indexing access syntax for Lists and Maps • http://mail.openjdk.java.net/pipermail/coin -dev/2009-March/001108.html • Language support for JSR 292 • http://mail.openjdk.java.net/pipermail/coin -dev/2009-March/001077.html • Binary Literals • http://mail.openjdk.java.net/pipermail/coin -dev/2009-April/001627.html • Underscores in numbers • http://mail.openjdk.java.net/pipermail/coin -dev/2009-March/001208.html Resources – Closures • Project Lambda • http://openjdk.java.net/projects/lambda/ • Project Lambda: Straw-Man Proposal • http://cr.openjdk.java.net/~mr/lambda/straw-man/ • Closures for Java – Mark Reinhold’s Blog • http://blogs.sun.com/mr/entry/closures Resources – NIO2 • Java New I/O • http://en.wikipedia.org/wiki/New_I/O • JSR 203: The Open Road – java.nio.file • http://today.java.net/pub/a/today/2008/07/0 3/jsr-203-new-file-apis.html Resources – Compressed oops • Compressed oops in the Hotspot JVM • http://wikis.sun.com/display/HotSpotInterna ls/CompressedOops • Wikipedia – 64-bit • http://en.wikipedia.org/wiki/64-bit • ILP32, LP64, and LLP64 • http://wiki.wireshark.org/Development/Win64 • C Programming Language • http://en.wikipedia.org/wiki/C_(programming _language) Resources – Garbage Collection • Garbage-First Garbage Collection • http://research.sun.com/jtech/pubs/04-g1paper-ismm.pdf • JavaOne: G1 Garbage Collector • http://tech.puredanger.com/2008/05/09/javaoneg1-garbage-collector • Garbage Collection – Wikipedia • http://en.wikipedia.org/wiki/Garbage_collectio n_(computer_science) • Wikipedia – Hard and Soft Real-time Systems • http://en.wikipedia.org/wiki/Realtime_computing#Hard_and_soft_real-time_systems Resources – Upgrade ClassLoader Architecture • Draft Proposal for ClassLoader Deadlock Fix • http://www.mail-archive.com/core-libsdev@openjdk.java.net/msg00863.html • java.lang.ClassLoader.loadClassInternal(St ring) is Too Restrictive • http://bugs.sun.com/bugdatabase/view_bug.do ?bug_id=4670071 Resources – URL ClassLoader • Closing a URLClassLoader • http://blogs.sun.com/michaelmcm/entry/closi ng_a_urlclassloader • Class URLClassLoader – close() • http://download.java.net/jdk7/docs/api/java /net/URLClassLoader.html#close() Resources – Unicode 5.1 • JDK 7 – Features – Unicode 5.1 • http://openjdk.java.net/projects/jdk7/featu res/#f497 • What's new in Unicode 5.0? • http://babelstone.blogspot.com/2005/11/what s-new-in-unicode-50.html • What's new in Unicode 5.1? • http://babelstone.blogspot.com/2007/06/what s-new-in-unicode-51.html Resources – SCTP • SCTP Project • http://openjdk.java.net/projects/sctp/ Resources – SDP • Understanding the Sockets Direct Protocol • http://java.sun.com/docs/books/tutorial/sdp /sockets/index.html • Sockets Direct Protocol – Wikipedia • http://en.wikipedia.org/wiki/Sockets_Direct _Protocol • Remote Direct Memory Access • http://en.wikipedia.org/wiki/Remote_Direct_ Memory_Access • Zero-copy • http://en.wikipedia.org/wiki/Zero-copy Resources – Authors • Authors of this presentation: • Svetlin Nakov • http://www.nakov.com/blog/ • Mihail Stoynov • http://mihail.stoynov.com/blog/