Java7的新特性

RicMcReynol 8年前發布 | 35K 次閱讀 Java7 JRE Java開發

來自: https://segmentfault.com/a/1190000004417830

Java語言特性系列

</div>

本文主要講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);
         }
     }
    

    } }</pre>

    2、捕獲多個異常( 新語法 )

    public void handle() {

     ExceptionThrower thrower = new ExceptionThrower();
     try {
         thrower.manyExceptions();
     } catch (ExceptionA | ExceptionB ab) {
         System.out.println(ab.getClass());
     } catch (ExceptionC c) {
     }
    

    }</pre>

    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();
     }
    

    } }</pre>

    實現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();
     }
    

    } }</pre>

    4、JSR341-Expression Language Specification( 新規范 )

    public static void main(String[] args){

     ELProcessor el = new ELProcessor();
     assert (el.eval("Math.random()") instanceof Double);
    

    }</pre>

    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(); } }</pre>
      • filechannel

      </ul>

      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(); } }</pre>

        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_);
        
        } } }</pre>
        • 調用

        </ul>

        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); } }</pre>

          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();
         }
        

        } }</pre>

        • 自動關閉

        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();
         }
        

        } }</pre>

        • 自動映射

        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();
         }
        

        } }</pre>

        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(); } }</pre>

          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(); } }</pre>

          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(); } }</pre>

          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(); } }</pre>

          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

        參考

 本文由用戶 RicMcReynol 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!