Java7的新特性
来自: https://segmentfault.com/a/1190000004417830
Java语言特性系列
序
本文主要讲Java7的新特性,相对于Java6而言,Java7增加了一些重要的特性,比如NIO2,不像Java6那么鸡肋,也算是一个重要的版本。
特性列表
-
suppress异常( 新语法 )
-
捕获多个异常(新语法)
-
try-with-resources(新语法)
-
JSR341-Expression Language Specification(新规范)
-
JSR203-More New I/O APIs for the Java Platform(新规范)
-
JSR292与InvokeDynamic
-
支持JDBC4.1规范
-
Path接口、DirectoryStream、Files、WatchService
-
jcmd
-
fork/join framework
-
Java Mission Control
1、suppress异常( 新语法 )
/** * 记录异常,不被淹没 * addSuppressed */ class ReadFile { public void read(String filename) throws BaseException { FileInputStream input = null; IOException readException = null; try { input = new FileInputStream(filename); } catch (IOException ex) { readException = ex; } finally { if (input != null) { try { input.close(); } catch (IOException ex) { if (readException == null) { readException = ex; }else{ //使用java7的 readException.addSuppressed(ex); } } } if (readException != null) { throw new BaseException(readException); } } } }
2、捕获多个异常( 新语法 )
public void handle() { ExceptionThrower thrower = new ExceptionThrower(); try { thrower.manyExceptions(); } catch (ExceptionA | ExceptionB ab) { System.out.println(ab.getClass()); } catch (ExceptionC c) { } }
3、try-with-resources( 新语法 )
/** * try-with-resource * 不需要使用finally来保证打开的流被正确关闭 * 这是自动完成的。 * @author patterncat * @created 2014-07-21 */ public class ResourceBasicUsage { public String readFile(String path) throws IOException { try (BufferedReader reader = new BufferedReader(new FileReader(path))) { StringBuilder builder = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { builder.append(line); builder.append(String.format("%n")); } return builder.toString(); } } }
实现AutoCloseable
/** * @author patterncat * @created 2014-07-21 */ public class CustomResource implements AutoCloseable { public void close() throws Exception { System.out.println("进行资源释放。"); } public void useCustomResource() throws Exception { try (CustomResource resource = new CustomResource()) { System.out.println("使用资源。"); } } public static void main(String[] args) { try { new CustomResource().useCustomResource(); } catch (Exception ex) { ex.printStackTrace(); } } }
4、JSR341-Expression Language Specification( 新规范 )
public static void main(String[] args){ ELProcessor el = new ELProcessor(); assert (el.eval("Math.random()") instanceof Double); }
5、JSR203-More New I/O APIs for the Java Platform( 新规范 )
-
bytebuffer
public class ByteBufferUsage { public void useByteBuffer() { ByteBuffer buffer = ByteBuffer.allocate(32); buffer.put((byte)1); buffer.put(new byte[3]); buffer.putChar('A'); buffer.putFloat(0.0f); buffer.putLong(10, 100L); System.out.println(buffer.getChar(4)); System.out.println(buffer.remaining()); } public void byteOrder() { ByteBuffer buffer = ByteBuffer.allocate(4); buffer.putInt(1); buffer.order(ByteOrder.LITTLE_ENDIAN); buffer.getInt(0); //值为16777216 } public void compact() { ByteBuffer buffer = ByteBuffer.allocate(32); buffer.put(new byte[16]); buffer.flip(); buffer.getInt(); buffer.compact(); int pos = buffer.position(); } public void viewBuffer() { ByteBuffer buffer = ByteBuffer.allocate(32); buffer.putInt(1); IntBuffer intBuffer = buffer.asIntBuffer(); intBuffer.put(2); int value = buffer.getInt(); //值为2 } /** * @param args the command line arguments */ public static void main(String[] args) { ByteBufferUsage bbu = new ByteBufferUsage(); bbu.useByteBuffer(); bbu.byteOrder(); bbu.compact(); bbu.viewBuffer(); } }
-
filechannel
public class FileChannelUsage { public void openAndWrite() throws IOException { FileChannel channel = FileChannel.open(Paths.get("my.txt"), StandardOpenOption.CREATE, StandardOpenOption.WRITE); ByteBuffer buffer = ByteBuffer.allocate(64); buffer.putChar('A').flip(); channel.write(buffer); } public void readWriteAbsolute() throws IOException { FileChannel channel = FileChannel.open(Paths.get("absolute.txt"), StandardOpenOption.READ, StandardOpenOption.CREATE, StandardOpenOption.WRITE); ByteBuffer writeBuffer = ByteBuffer.allocate(4).putChar('A').putChar('B'); writeBuffer.flip(); channel.write(writeBuffer, 1024); ByteBuffer readBuffer = ByteBuffer.allocate(2); channel.read(readBuffer, 1026); readBuffer.flip(); char result = readBuffer.getChar(); //值为'B' } /** * @param args the command line arguments */ public static void main(String[] args) throws IOException { FileChannelUsage fcu = new FileChannelUsage(); fcu.openAndWrite(); fcu.readWriteAbsolute(); } }
6、JSR292与InvokeDynamic
JSR 292: Supporting Dynamically Typed Languages on the JavaTM Platform,支持在JVM上运行动态类型语言。在字节码层面支持了InvokeDynamic。
-
方法句柄MethodHandle
public class ThreadPoolManager { private final ScheduledExecutorService stpe = Executors .newScheduledThreadPool(2); private final BlockingQueue<WorkUnit<String>> lbq; public ThreadPoolManager(BlockingQueue<WorkUnit<String>> lbq_) { lbq = lbq_; } public ScheduledFuture<?> run(QueueReaderTask msgReader) { msgReader.setQueue(lbq); return stpe.scheduleAtFixedRate(msgReader, 10, 10, TimeUnit.MILLISECONDS); } private void cancel(final ScheduledFuture<?> hndl) { stpe.schedule(new Runnable() { public void run() { hndl.cancel(true); } }, 10, TimeUnit.MILLISECONDS); } /** * 使用传统的反射api */ public Method makeReflective() { Method meth = null; try { Class<?>[] argTypes = new Class[]{ScheduledFuture.class}; meth = ThreadPoolManager.class.getDeclaredMethod("cancel", argTypes); meth.setAccessible(true); } catch (IllegalArgumentException | NoSuchMethodException | SecurityException e) { e.printStackTrace(); } return meth; } /** * 使用代理类 * @return */ public CancelProxy makeProxy() { return new CancelProxy(); } /** * 使用Java7的新api,MethodHandle * invoke virtual 动态绑定后调用 obj.xxx * invoke special 静态绑定后调用 super.xxx * @return */ public MethodHandle makeMh() { MethodHandle mh; MethodType desc = MethodType.methodType(void.class, ScheduledFuture.class); try { mh = MethodHandles.lookup().findVirtual(ThreadPoolManager.class, "cancel", desc); } catch (NoSuchMethodException | IllegalAccessException e) { throw (AssertionError) new AssertionError().initCause(e); } return mh; } public static class CancelProxy { private CancelProxy() { } public void invoke(ThreadPoolManager mae_, ScheduledFuture<?> hndl_) { mae_.cancel(hndl_); } } }
-
调用
public class ThreadPoolMain { /** * 如果被继承,还能在静态上下文寻找正确的class */ private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); private ThreadPoolManager manager; public static void main(String[] args) { ThreadPoolMain main = new ThreadPoolMain(); main.run(); } private void cancelUsingReflection(ScheduledFuture<?> hndl) { Method meth = manager.makeReflective(); try { System.out.println("With Reflection"); meth.invoke(hndl); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { e.printStackTrace(); } } private void cancelUsingProxy(ScheduledFuture<?> hndl) { CancelProxy proxy = manager.makeProxy(); System.out.println("With Proxy"); proxy.invoke(manager, hndl); } private void cancelUsingMH(ScheduledFuture<?> hndl) { MethodHandle mh = manager.makeMh(); try { System.out.println("With Method Handle"); mh.invokeExact(manager, hndl); } catch (Throwable e) { e.printStackTrace(); } } private void run() { BlockingQueue<WorkUnit<String>> lbq = new LinkedBlockingQueue<>(); manager = new ThreadPoolManager(lbq); final QueueReaderTask msgReader = new QueueReaderTask(100) { @Override public void doAction(String msg_) { if (msg_ != null) System.out.println("Msg recvd: " + msg_); } }; ScheduledFuture<?> hndl = manager.run(msgReader); cancelUsingMH(hndl); // cancelUsingProxy(hndl); // cancelUsingReflection(hndl); } }
7、支持JDBC4.1规范
-
abort方法
public class AbortConnection { public void abortConnection() throws SQLException { Connection connection = DriverManager .getConnection("jdbc:derby://localhost/java7book"); ThreadPoolExecutor executor = new DebugExecutorService(2, 10, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()); connection.abort(executor); executor.shutdown(); try { executor.awaitTermination(5, TimeUnit.MINUTES); System.out.println(executor.getCompletedTaskCount()); } catch (InterruptedException e) { e.printStackTrace(); } } private static class DebugExecutorService extends ThreadPoolExecutor { public DebugExecutorService(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); } public void beforeExecute(Thread t, Runnable r) { System.out.println("清理任务:" + r.getClass()); super.beforeExecute(t, r); } } public static void main(String[] args) { AbortConnection ca = new AbortConnection(); try { ca.abortConnection(); } catch (SQLException e) { e.printStackTrace(); } } }
-
自动关闭
public class SetSchema { public void setSchema() throws SQLException { try (Connection connection = DriverManager .getConnection("jdbc:derby://localhost/java7book")) { connection.setSchema("DEMO_SCHEMA"); try (Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM author")) { while (rs.next()) { System.out.println(rs.getString("name")); } } } } public static void main(String[] args) { SetSchema ss = new SetSchema(); try { ss.setSchema(); } catch (SQLException e) { e.printStackTrace(); } } }
-
自动映射
public class UseSQLData { public void useSQLData() throws SQLException { try (Connection connection = DriverManager .getConnection("jdbc:derby://localhost/java7book")) { Map<String,Class<?>> typeMap = new HashMap<String,Class<?>>(); typeMap.put("java7book.Book", Book.class); try (Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM book")) { while (rs.next()) { System.out.println(rs.getObject(1, Book.class)); } } } } public static void main(String[] args) { UseSQLData usd = new UseSQLData(); try { usd.useSQLData(); } catch (SQLException e) { e.printStackTrace(); } } }
8、Path接口( 重要接口更新 )
public class PathUsage { public void usePath() { Path path1 = Paths.get("folder1", "sub1"); Path path2 = Paths.get("folder2", "sub2"); path1.resolve(path2); //folder1\sub1\folder2\sub2 path1.resolveSibling(path2); //folder1\folder2\sub2 path1.relativize(path2); //..\..\folder2\sub2 path1.subpath(0, 1); //folder1 path1.startsWith(path2); //false path1.endsWith(path2); //false Paths.get("folder1/./../folder2/my.text").normalize(); //folder2\my.text } /** * @param args the command line arguments */ public static void main(String[] args) { PathUsage usage = new PathUsage(); usage.usePath(); } }
9、DirectoryStream
public class ListFile { public void listFiles() throws IOException { Path path = Paths.get(""); try (DirectoryStream<Path> stream = Files.newDirectoryStream(path, "*.*")) { for (Path entry: stream) { //使用entry System.out.println(entry); } } } /** * @param args the command line arguments */ public static void main(String[] args) throws IOException { ListFile listFile = new ListFile(); listFile.listFiles(); } }
10、Files
public class FilesUtils { public void manipulateFiles() throws IOException { Path newFile = Files.createFile(Paths.get("new.txt").toAbsolutePath()); List<String> content = new ArrayList<String>(); content.add("Hello"); content.add("World"); Files.write(newFile, content, Charset.forName("UTF-8")); Files.size(newFile); byte[] bytes = Files.readAllBytes(newFile); ByteArrayOutputStream output = new ByteArrayOutputStream(); Files.copy(newFile, output); Files.delete(newFile); } /** * @param args the command line arguments */ public static void main(String[] args) throws IOException { FilesUtils fu = new FilesUtils(); fu.manipulateFiles(); } }
11、WatchService
public class WatchAndCalculate { public void calculate() throws IOException, InterruptedException { WatchService service = FileSystems.getDefault().newWatchService(); Path path = Paths.get("").toAbsolutePath(); path.register(service, StandardWatchEventKinds.ENTRY_CREATE); while (true) { WatchKey key = service.take(); for (WatchEvent<?> event : key.pollEvents()) { Path createdPath = (Path) event.context(); createdPath = path.resolve(createdPath); long size = Files.size(createdPath); System.out.println(createdPath + " ==> " + size); } key.reset(); } } /** * @param args the command line arguments */ public static void main(String[] args) throws Throwable { WatchAndCalculate wc = new WatchAndCalculate(); wc.calculate(); } }
12、jcmd utility
jcmd是为了替代jps出现了,包含了jps的大部分功能并新增了一些新的功能。
-
jcmd -l列出所有的Java虚拟机,针对每一个虚拟机可以使用help列出它们支持的命令。
jcmd -l 15308 org.eclipse.jetty.xml.XmlConfiguration /tmp/start4070493346048555702.properties /opt/educat/apps/conf/jetty8.xml 5624 sun.tools.jcmd.JCmd -l 20967 org.apache.flume.node.Application --no-reload-conf -f /opt/educat/flume_agent/conf/flume.conf -n log_agent
-
jcmd pid help
jcmd 15308 help 15308: The following commands are available: VM.commercial_features ManagementAgent.stop ManagementAgent.start_local ManagementAgent.start Thread.print GC.class_histogram GC.heap_dump GC.run_finalization GC.run VM.uptime VM.flags VM.system_properties VM.command_line VM.version help For more information about a specific command use 'help <command>'.
-
jcmd pid VM.flags查看启动参数
jcmd 15308 VM.flags 15308: -XX:+DisableExplicitGC -XX:ErrorFile=/var/patterncat/logs/catapp.vmerr.log.201505071655 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/patterncat/logs/catapp.heaperr.log.201505071655 -XX:InitialHeapSize=5368709120 -XX:+ManagementServer -XX:MaxGCPauseMillis=100 -XX:MaxHeapSize=5368709120 -XX:MaxPermSize=268435456 -XX:+PrintAdaptiveSizePolicy -XX:+PrintCommandLineFlags -XX:+PrintGC -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -XX:StringTableSize=49999 -XX:+UnlockExperimentalVMOptions -XX:+UseCompressedOops -XX:+UseG1GC
-
jcmd pid GC.heap_dump D:\d.dump 导出堆信息
-
jcmd pid GC.class_histogram查看系统中类的统计信息
-
jcmd pid VM.system_properties查看系统属性内容
-
jcmd pid Thread.print 打印线程栈
-
jcmd pid VM.uptime 查看虚拟机启动时间
-
jcmd pid PerfCounter.print 查看性能统计
jcmd 15308 PerfCounter.print 15308: java.ci.totalTime=79326405 java.cls.loadedClasses=19977 java.cls.sharedLoadedClasses=0 java.cls.sharedUnloadedClasses=0 java.cls.unloadedClasses=1443 java.property.java.class.path="/opt/educat/apps/server/jetty-distribution-8.1.9.v20130131/lib/jetty-xml-8.1.9.v20130131.jar:/opt/educat/apps/server/jetty-distribution-8.1.9.v20130131/lib/servlet-api-3.0.jar:/opt/educat/apps/server/jetty-distribution-8.1.9.v20130131/lib/jetty-http-8.1.9.v20130131.jar:/opt/educat/apps/server/jetty-distribution-8.1.9.v20130131/lib/jetty-continuation-8.1.9.v20130131.jar:/opt/educat/apps/server/jetty-distribution-8.1.9.v20130131/lib/jetty-server-8.1.9.v20130131.jar:/opt/educat/apps/server/jetty-distribution-8.1.9.v20130131/lib/jetty-security-8.1.9.v20130131.jar:/opt/educat/apps/server/jetty-distribution-8.1.9.v20130131/lib/jetty-servlet-8.1.9.v20130131.jar:/opt/educat/apps/server/jetty-distribution-8.1.9.v20130131/lib/jetty-webapp-8.1.9.v20130131.jar:/opt/educat/apps/server/jetty-distribution-8.1.9.v20130131/lib/jetty-deploy-8.1.9.v20130131.jar:/opt/educat/apps/server/jetty-distribution-8.1.9.v20130131/lib/jetty-servlets-8.1.9.v20130131.jar:/opt/educat/apps/server/jetty-distribution-8.1.9.v20130131/l" java.property.java.endorsed.dirs="/usr/local/jdk1.7.0_21/jre/lib/endorsed" java.property.java.ext.dirs="/usr/local/jdk1.7.0_21/jre/lib/ext:/usr/java/packages/lib/ext" java.property.java.home="/usr/local/jdk1.7.0_21/jre" java.property.java.library.path="/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib" java.property.java.version="1.7.0_21" java.property.java.vm.info="mixed mode" java.property.java.vm.name="Java HotSpot(TM) 64-Bit Server VM" java.property.java.vm.specification.name="Java Virtual Machine Specification" java.property.java.vm.specification.vendor="Oracle Corporation" java.property.java.vm.specification.version="1.7" java.property.java.vm.vendor="Oracle Corporation" java.property.java.vm.version="23.21-b01" java.rt.vmArgs="-javaagent:/opt/educat/apps/lib/jolokia-jvm-1.1.0-agent.jar=port=23061 -Xloggc:/var/patterncat/logs/catapp.gc.log.201505071655 -XX:ErrorFile=/var/patterncat/logs/catapp.vmerr.log.201505071655 -XX:HeapDumpPath=/var/patterncat/logs/catapp.heaperr.log.201505071655 -Xmx5g -Xms5g -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -XX:+PrintCommandLineFlags -XX:+PrintAdaptiveSizePolicy -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:StringTableSize=49999 -Djetty.home=/opt/educat/apps/server/jetty-distribution-8.1.9.v20130131 -Dapp.port=8061 -Dmedis_environment=online -Dcore.step=app -DSTOP.PORT=38061 -Djetty.port=8061 -Dcom.sun.management.jmxremote.authenticate=false -Dapp.logdir=/var/patterncat/logs -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -Dapp.ip=10.64.28.207 -Dapp.cont" java.rt.vmFlags="" java.threads.daemon=72 java.threads.live=128 java.threads.livePeak=129 java.threads.started=1444 sun.ci.compilerThread.0.compiles=2595 sun.ci.compilerThread.0.method="" sun.ci.compilerThread.0.time=1290 sun.ci.compilerThread.0.type=1 sun.ci.compilerThread.1.compiles=2802 sun.ci.compilerThread.1.method="" sun.ci.compilerThread.1.time=1413 sun.ci.compilerThread.1.type=2 sun.ci.lastFailedMethod="" sun.ci.lastFailedType=0 sun.ci.lastInvalidatedMethod="" sun.ci.lastInvalidatedType=0 sun.ci.lastMethod="org/codehaus/groovy/classgen/VariableScopeVisitor checkVariableNameForDeclaration" sun.ci.lastSize=2184 sun.ci.lastType=1 sun.ci.nmethodCodeSize=12188576 sun.ci.nmethodSize=24492688 sun.ci.osrBytes=196694 sun.ci.osrCompiles=156 sun.ci.osrTime=8521713 sun.ci.standardBytes=2072839 sun.ci.standardCompiles=5241 sun.ci.standardTime=70804692 sun.ci.threads=2 sun.ci.totalBailouts=0 sun.ci.totalCompiles=5397 sun.ci.totalInvalidates=0 sun.classloader.findClassTime=358334873 sun.classloader.findClasses=507 sun.classloader.parentDelegationTime=30062667 sun.cls.appClassBytes=63743816 sun.cls.appClassLoadCount=58098 sun.cls.appClassLoadTime=9843833 sun.cls.appClassLoadTime.self=5288490 sun.cls.classInitTime=2617049 sun.cls.classInitTime.self=1088905 sun.cls.classLinkedTime=4605704 sun.cls.classLinkedTime.self=541928 sun.cls.classVerifyTime=4055324 sun.cls.classVerifyTime.self=2423448 sun.cls.defineAppClassTime=3206202 sun.cls.defineAppClassTime.self=386302 sun.cls.defineAppClasses=16465 sun.cls.initializedClasses=14546 sun.cls.isUnsyncloadClassSet=0 sun.cls.jniDefineClassNoLockCalls=94 sun.cls.jvmDefineClassNoLockCalls=4405 sun.cls.jvmFindLoadedClassNoLockCalls=32671 sun.cls.linkedClasses=16465 sun.cls.loadInstanceClassFailRate=0 sun.cls.loadedBytes=43314456 sun.cls.lookupSysClassTime=87247 sun.cls.methodBytes=34262690 sun.cls.nonSystemLoaderLockContentionRate=133 sun.cls.parseClassTime=3099390 sun.cls.parseClassTime.self=2670584 sun.cls.sharedClassLoadTime=9647 sun.cls.sharedLoadedBytes=0 sun.cls.sharedUnloadedBytes=0 sun.cls.sysClassBytes=12986737 sun.cls.sysClassLoadTime=503885 sun.cls.systemLoaderLockContentionRate=0 sun.cls.time=15382336 sun.cls.unloadedBytes=5087120 sun.cls.unsafeDefineClassCalls=1555 sun.cls.verifiedClasses=16383 sun.gc.cause="No GC" sun.gc.collector.0.invocations=85 sun.gc.collector.0.lastEntryTime=24164511065 sun.gc.collector.0.lastExitTime=24164628388 sun.gc.collector.0.name="G1 incremental collections" sun.gc.collector.0.time=7628099 sun.gc.collector.1.invocations=1 sun.gc.collector.1.lastEntryTime=24543200515 sun.gc.collector.1.lastExitTime=24544107869 sun.gc.collector.1.name="G1 stop-the-world full collections" sun.gc.collector.1.time=907355 sun.gc.generation.0.agetable.bytes.00=0 sun.gc.generation.0.agetable.bytes.01=4294976 sun.gc.generation.0.agetable.bytes.02=2014880 sun.gc.generation.0.agetable.bytes.03=5406352 sun.gc.generation.0.agetable.bytes.04=4875176 sun.gc.generation.0.agetable.bytes.05=2865952 sun.gc.generation.0.agetable.bytes.06=4374048 sun.gc.generation.0.agetable.bytes.07=2058664 sun.gc.generation.0.agetable.bytes.08=3574376 sun.gc.generation.0.agetable.bytes.09=6923448 sun.gc.generation.0.agetable.bytes.10=1541088 sun.gc.generation.0.agetable.bytes.11=1347376 sun.gc.generation.0.agetable.bytes.12=735888 sun.gc.generation.0.agetable.bytes.13=402632 sun.gc.generation.0.agetable.bytes.14=713272 sun.gc.generation.0.agetable.bytes.15=728688 sun.gc.generation.0.agetable.size=16 sun.gc.generation.0.capacity=4510973976 sun.gc.generation.0.maxCapacity=5368709144 sun.gc.generation.0.minCapacity=24 sun.gc.generation.0.name="young" sun.gc.generation.0.space.0.capacity=4510973960 sun.gc.generation.0.space.0.initCapacity=1128267784 sun.gc.generation.0.space.0.maxCapacity=5368709128 sun.gc.generation.0.space.0.name="eden" sun.gc.generation.0.space.0.used=580911104 sun.gc.generation.0.space.1.capacity=8 sun.gc.generation.0.space.1.initCapacity=8 sun.gc.generation.0.space.1.maxCapacity=8 sun.gc.generation.0.space.1.name="s0" sun.gc.generation.0.space.1.used=0 sun.gc.generation.0.space.2.capacity=8 sun.gc.generation.0.space.2.initCapacity=8 sun.gc.generation.0.space.2.maxCapacity=5368709128 sun.gc.generation.0.space.2.name="s1" sun.gc.generation.0.space.2.used=0 sun.gc.generation.0.spaces=3 sun.gc.generation.1.capacity=857735176 sun.gc.generation.1.maxCapacity=5368709128 sun.gc.generation.1.minCapacity=8 sun.gc.generation.1.name="old" sun.gc.generation.1.space.0.capacity=857735176 sun.gc.generation.1.space.0.initCapacity=4240441352 sun.gc.generation.1.space.0.maxCapacity=5368709128 sun.gc.generation.1.space.0.name="space" sun.gc.generation.1.space.0.used=155730608 sun.gc.generation.1.spaces=1 sun.gc.generation.2.capacity=138412032 sun.gc.generation.2.maxCapacity=268435456 sun.gc.generation.2.minCapacity=20971520 sun.gc.generation.2.name="perm" sun.gc.generation.2.space.0.capacity=138412032 sun.gc.generation.2.space.0.initCapacity=20971520 sun.gc.generation.2.space.0.maxCapacity=268435456 sun.gc.generation.2.space.0.name="perm" sun.gc.generation.2.space.0.used=138212560 sun.gc.generation.2.spaces=1 sun.gc.lastCause="Heap Inspection Initiated GC" sun.gc.policy.collectors=1 sun.gc.policy.desiredSurvivorSize=264241152 sun.gc.policy.generations=3 sun.gc.policy.maxTenuringThreshold=15 sun.gc.policy.name="GarbageFirst" sun.gc.policy.tenuringThreshold=15 sun.gc.tlab.alloc=0 sun.gc.tlab.allocThreads=0 sun.gc.tlab.fastWaste=0 sun.gc.tlab.fills=0 sun.gc.tlab.gcWaste=0 sun.gc.tlab.maxFastWaste=0 sun.gc.tlab.maxFills=0 sun.gc.tlab.maxGcWaste=0 sun.gc.tlab.maxSlowAlloc=0 sun.gc.tlab.maxSlowWaste=0 sun.gc.tlab.slowAlloc=0 sun.gc.tlab.slowWaste=0 sun.management.JMXConnectorServer.0.authenticate="false" sun.management.JMXConnectorServer.0.remoteAddress="service:jmx:rmi:///jndi/rmi://edu-cat02.lf.patterncat.com:8199/jmxrmi" sun.management.JMXConnectorServer.0.ssl="false" sun.management.JMXConnectorServer.0.sslNeedClientAuth="false" sun.management.JMXConnectorServer.0.sslRegistry="false" sun.management.JMXConnectorServer.address="service:jmx:rmi://127.0.0.1/stub/rO0ABXNyAC5qYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5ybWkuUk1JU2VydmVySW1wbF9TdHViAAAAAAAAAAICAAB4cgAaamF2YS5ybWkuc2VydmVyLlJlbW90ZVN0dWLp/tzJi+FlGgIAAHhyABxqYXZhLnJtaS5zZXJ2ZXIuUmVtb3RlT2JqZWN002G0kQxhMx4DAAB4cHc3AAtVbmljYXN0UmVmMgAADDEwLjY0LjI4LjIwNwAAhbjWmVwaDwiNg3l3YeUAAAFNLZX68oACAHg=" sun.os.hrt.frequency=1000000 sun.os.hrt.ticks=24580753795 sun.perfdata.majorVersion=2 sun.perfdata.minorVersion=0 sun.perfdata.overflow=0 sun.perfdata.size=32768 sun.perfdata.timestamp=259316 sun.perfdata.used=17792 sun.property.sun.boot.class.path="/usr/local/jdk1.7.0_21/jre/lib/resources.jar:/usr/local/jdk1.7.0_21/jre/lib/rt.jar:/usr/local/jdk1.7.0_21/jre/lib/sunrsasign.jar:/usr/local/jdk1.7.0_21/jre/lib/jsse.jar:/usr/local/jdk1.7.0_21/jre/lib/jce.jar:/usr/local/jdk1.7.0_21/jre/lib/charsets.jar:/usr/local/jdk1.7.0_21/jre/lib/jfr.jar:/usr/local/jdk1.7.0_21/jre/classes" sun.property.sun.boot.library.path="/usr/local/jdk1.7.0_21/jre/lib/amd64" sun.rt._sync_ContendedLockAttempts=297851 sun.rt._sync_Deflations=438863 sun.rt._sync_EmptyNotifications=0 sun.rt._sync_FailedSpins=0 sun.rt._sync_FutileWakeups=349651 sun.rt._sync_Inflations=438971 sun.rt._sync_MonExtant=16256 sun.rt._sync_MonInCirculation=0 sun.rt._sync_MonScavenged=0 sun.rt._sync_Notifications=1580811 sun.rt._sync_Parks=1935145 sun.rt._sync_PrivateA=0 sun.rt._sync_PrivateB=0 sun.rt._sync_SlowEnter=0 sun.rt._sync_SlowExit=0 sun.rt._sync_SlowNotify=0 sun.rt._sync_SlowNotifyAll=0 sun.rt._sync_SuccessfulSpins=0 sun.rt.applicationTime=24559855809 sun.rt.createVmBeginTime=1430988913170 sun.rt.createVmEndTime=1430988913429 sun.rt.internalVersion="Java HotSpot(TM) 64-Bit Server VM (23.21-b01) for linux-amd64 JRE (1.7.0_21-b11), built on Apr 4 2013 04:03:29 by "java_re" with gcc 4.3.0 20080428 (Red Hat 4.3.0-8)" sun.rt.interruptedBeforeIO=0 sun.rt.interruptedDuringIO=0 sun.rt.javaCommand="org.eclipse.jetty.xml.XmlConfiguration /tmp/start4070493346048555702.properties /opt/educat/apps/conf/jetty8.xml" sun.rt.jvmCapabilities="1000000000000000000000000000000000000000000000000000000000000000" sun.rt.jvmVersion=387252225 sun.rt.safepointSyncTime=2333795 sun.rt.safepointTime=15955181 sun.rt.safepoints=18365 sun.rt.threadInterruptSignaled=0 sun.rt.vmInitDoneTime=1430988913232 sun.threads.vmOperationTime=9516621 sun.urlClassLoader.readClassBytesTime=958824201 sun.zip.zipFile.openTime=72163038 sun.zip.zipFiles=3838
13、fork/join
Java7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。
14、Java Mission Control
在JDK7u40里头提供了Java Mission Control,这个是从JRockit虚拟机里头迁移过来的类似JVisualVm的东东。
15、其他
-
Binary Literals支持
-
Numeric Literals的下划线支持
-
Strings in switch Statements