原文出处:xixicat


本文主要讲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异常(新语法)

  1 /**
2 * 记录异常,不被淹没
3 * addSuppressed
4 */
5 class ReadFile {
6 public void read(String filename) throws BaseException {
7 FileInputStream input = null;
8 IOException readException = null;
9 try {
10 input = new FileInputStream(filename);
11 } catch (IOException ex) {
12 readException = ex;
13 } finally {
14 if (input != null) {
15 try {
16 input.close();
17 } catch (IOException ex) {
18 if (readException == null) {
19 readException = ex;
20 }else{
21 //使用java7的
22 readException.addSuppressed(ex);
23 }
24 }
25 }
26 if (readException != null) {
27 throw new BaseException(readException);
28 }
29 }
30 }
31 }

2、捕获多个异常(新语法)

  1 public void handle() {
2 ExceptionThrower thrower = new ExceptionThrower();
3 try {
4 thrower.manyExceptions();
5 } catch (ExceptionA | ExceptionB ab) {
6 System.out.println(ab.getClass());
7 } catch (ExceptionC c) {
8 }
9 }

3、try-with-resources(新语法)

  1 /**
2 * try-with-resource
3 * 不需要使用finally来保证打开的流被正确关闭
4 * 这是自动完成的。
5 * @author patterncat
6 * @created 2014-07-21
7 */
8 public class ResourceBasicUsage {
9 public String readFile(String path) throws IOException {
10 try (BufferedReader reader = new BufferedReader(new FileReader(path))) {
11 StringBuilder builder = new StringBuilder();
12 String line = null;
13 while ((line = reader.readLine()) != null) {
14 builder.append(line);
15 builder.append(String.format("%n"));
16 }
17 return builder.toString();
18 }
19 }
20 }

实现AutoCloseable

  1 /**
2 * @author patterncat
3 * @created 2014-07-21
4 */
5 public class CustomResource implements AutoCloseable {
6 public void close() throws Exception {
7 System.out.println("进行资源释放。");
8 }
9 public void useCustomResource() throws Exception {
10 try (CustomResource resource = new CustomResource()) {
11 System.out.println("使用资源。");
12 }
13 }
14 public static void main(String[] args) {
15 try {
16 new CustomResource().useCustomResource();
17 } catch (Exception ex) {
18 ex.printStackTrace();
19 }
20 }
21 }

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

  1 public static void main(String[] args){
2 ELProcessor el = new ELProcessor();
3 assert (el.eval("Math.random()") instanceof Double);
4 }

5、JSR203-More New I/O APIs for the Java Platform(新规范)

  • bytebuffer

  1 public class ByteBufferUsage {
2 public void useByteBuffer() {
3 ByteBuffer buffer = ByteBuffer.allocate(32);
4 buffer.put((byte)1);
5 buffer.put(new byte[3]);
6 buffer.putChar('A');
7 buffer.putFloat(0.0f);
8 buffer.putLong(10, 100L);
9 System.out.println(buffer.getChar(4));
10 System.out.println(buffer.remaining());
11 }
12 public void byteOrder() {
13 ByteBuffer buffer = ByteBuffer.allocate(4);
14 buffer.putInt(1);
15 buffer.order(ByteOrder.LITTLE_ENDIAN);
16 buffer.getInt(0); //值为16777216
17 }
18 public void compact() {
19 ByteBuffer buffer = ByteBuffer.allocate(32);
20 buffer.put(new byte[16]);
21 buffer.flip();
22 buffer.getInt();
23 buffer.compact();
24 int pos = buffer.position();
25 }
26 public void viewBuffer() {
27 ByteBuffer buffer = ByteBuffer.allocate(32);
28 buffer.putInt(1);
29 IntBuffer intBuffer = buffer.asIntBuffer();
30 intBuffer.put(2);
31 int value = buffer.getInt(); //值为2
32 }
33 /**
34 * @param args the command line arguments
35 */
36 public static void main(String[] args) {
37 ByteBufferUsage bbu = new ByteBufferUsage();
38 bbu.useByteBuffer();
39 bbu.byteOrder();
40 bbu.compact();
41 bbu.viewBuffer();
42 }
43 }
  • filechannel

  1 public class FileChannelUsage {
2 public void openAndWrite() throws IOException {
3 FileChannel channel = FileChannel.open(Paths.get("my.txt"), StandardOpenOption.CREATE, StandardOpenOption.WRITE);
4 ByteBuffer buffer = ByteBuffer.allocate(64);
5 buffer.putChar('A').flip();
6 channel.write(buffer);
7 }
8 public void readWriteAbsolute() throws IOException {
9 FileChannel channel = FileChannel.open(Paths.get("absolute.txt"), StandardOpenOption.READ, StandardOpenOption.CREATE, StandardOpenOption.WRITE);
10 ByteBuffer writeBuffer = ByteBuffer.allocate(4).putChar('A').putChar('B');
11 writeBuffer.flip();
12 channel.write(writeBuffer, 1024);
13 ByteBuffer readBuffer = ByteBuffer.allocate(2);
14 channel.read(readBuffer, 1026);
15 readBuffer.flip();
16 char result = readBuffer.getChar(); //值为'B'
17 }
18 /**
19 * @param args the command line arguments
20 */
21 public static void main(String[] args) throws IOException {
22 FileChannelUsage fcu = new FileChannelUsage();
23 fcu.openAndWrite();
24 fcu.readWriteAbsolute();
25 }
26 }

6、JSR292与InvokeDynamic

JSR 292: Supporting Dynamically Typed Languages on the JavaTM Platform,支持在JVM上运行动态类型语言。在字节码层面支持了InvokeDynamic。

  • 方法句柄MethodHandle

      1 public class ThreadPoolManager {
    2 private final ScheduledExecutorService stpe = Executors
    3 .newScheduledThreadPool(2);
    4 private final BlockingQueue<WorkUnit<String>> lbq;
    5 public ThreadPoolManager(BlockingQueue<WorkUnit<String>> lbq_) {
    6 lbq = lbq_;
    7 }
    8 public ScheduledFuture<?> run(QueueReaderTask msgReader) {
    9 msgReader.setQueue(lbq);
    10 return stpe.scheduleAtFixedRate(msgReader, 10, 10, TimeUnit.MILLISECONDS);
    11 }
    12 private void cancel(final ScheduledFuture<?> hndl) {
    13 stpe.schedule(new Runnable() {
    14 public void run() {
    15 hndl.cancel(true);
    16 }
    17 }, 10, TimeUnit.MILLISECONDS);
    18 }
    19 /**
    20 * 使用传统的反射api
    21 */
    22 public Method makeReflective() {
    23 Method meth = null;
    24 try {
    25 Class<?>[] argTypes = new Class[]{ScheduledFuture.class};
    26 meth = ThreadPoolManager.class.getDeclaredMethod("cancel", argTypes);
    27 meth.setAccessible(true);
    28 } catch (IllegalArgumentException | NoSuchMethodException
    29 | SecurityException e) {
    30 e.printStackTrace();
    31 }
    32 return meth;
    33 }
    34 /**
    35 * 使用代理类
    36 * @return
    37 */
    38 public CancelProxy makeProxy() {
    39 return new CancelProxy();
    40 }
    41 /**
    42 * 使用Java7的新api,MethodHandle
    43 * invoke virtual 动态绑定后调用 obj.xxx
    44 * invoke special 静态绑定后调用 super.xxx
    45 * @return
    46 */
    47 public MethodHandle makeMh() {
    48 MethodHandle mh;
    49 MethodType desc = MethodType.methodType(void.class, ScheduledFuture.class);
    50 try {
    51 mh = MethodHandles.lookup().findVirtual(ThreadPoolManager.class,
    52 "cancel", desc);
    53 } catch (NoSuchMethodException | IllegalAccessException e) {
    54 throw (AssertionError) new AssertionError().initCause(e);
    55 }
    56 return mh;
    57 }
    58 public static class CancelProxy {
    59 private CancelProxy() {
    60 }
    61 public void invoke(ThreadPoolManager mae_, ScheduledFuture<?> hndl_) {
    62 mae_.cancel(hndl_);
    63 }
    64 }
    65 }
  • 调用

      1 public class ThreadPoolMain {
    2 /**
    3 * 如果被继承,还能在静态上下文寻找正确的class
    4 */
    5 private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
    6 private ThreadPoolManager manager;
    7 public static void main(String[] args) {
    8 ThreadPoolMain main = new ThreadPoolMain();
    9 main.run();
    10 }
    11 private void cancelUsingReflection(ScheduledFuture<?> hndl) {
    12 Method meth = manager.makeReflective();
    13 try {
    14 System.out.println("With Reflection");
    15 meth.invoke(hndl);
    16 } catch (IllegalAccessException | IllegalArgumentException
    17 | InvocationTargetException e) {
    18 e.printStackTrace();
    19 }
    20 }
    21 private void cancelUsingProxy(ScheduledFuture<?> hndl) {
    22 CancelProxy proxy = manager.makeProxy();
    23 System.out.println("With Proxy");
    24 proxy.invoke(manager, hndl);
    25 }
    26 private void cancelUsingMH(ScheduledFuture<?> hndl) {
    27 MethodHandle mh = manager.makeMh();
    28 try {
    29 System.out.println("With Method Handle");
    30 mh.invokeExact(manager, hndl);
    31 } catch (Throwable e) {
    32 e.printStackTrace();
    33 }
    34 }
    35 private void run() {
    36 BlockingQueue<WorkUnit<String>> lbq = new LinkedBlockingQueue<>();
    37 manager = new ThreadPoolManager(lbq);
    38 final QueueReaderTask msgReader = new QueueReaderTask(100) {
    39 @Override
    40 public void doAction(String msg_) {
    41 if (msg_ != null)
    42 System.out.println("Msg recvd: " + msg_);
    43 }
    44 };
    45 ScheduledFuture<?> hndl = manager.run(msgReader);
    46 cancelUsingMH(hndl);
    47 // cancelUsingProxy(hndl);
    48 // cancelUsingReflection(hndl);
    49 }
    50 }

7、支持JDBC4.1规范

  • abort方法

      1 public class AbortConnection {
    2 public void abortConnection() throws SQLException {
    3 Connection connection = DriverManager
    4 .getConnection("jdbc:derby://localhost/java7book");
    5 ThreadPoolExecutor executor = new DebugExecutorService(2, 10, 60,
    6 TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
    7 connection.abort(executor);
    8 executor.shutdown();
    9 try {
    10 executor.awaitTermination(5, TimeUnit.MINUTES);
    11 System.out.println(executor.getCompletedTaskCount());
    12 } catch (InterruptedException e) {
    13 e.printStackTrace();
    14 }
    15 }
    16 private static class DebugExecutorService extends ThreadPoolExecutor {
    17 public DebugExecutorService(int corePoolSize, int maximumPoolSize,
    18 long keepAliveTime, TimeUnit unit,
    19 BlockingQueue<Runnable> workQueue) {
    20 super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
    21 }
    22 public void beforeExecute(Thread t, Runnable r) {
    23 System.out.println("清理任务:" + r.getClass());
    24 super.beforeExecute(t, r);
    25 }
    26 }
    27 public static void main(String[] args) {
    28 AbortConnection ca = new AbortConnection();
    29 try {
    30 ca.abortConnection();
    31 } catch (SQLException e) {
    32 e.printStackTrace();
    33 }
    34 }
    35 }
  • 自动关闭

      1 public class SetSchema {
    2 public void setSchema() throws SQLException {
    3 try (Connection connection = DriverManager
    4 .getConnection("jdbc:derby://localhost/java7book")) {
    5 connection.setSchema("DEMO_SCHEMA");
    6 try (Statement stmt = connection.createStatement();
    7 ResultSet rs = stmt.executeQuery("SELECT * FROM author")) {
    8 while (rs.next()) {
    9 System.out.println(rs.getString("name"));
    10 }
    11 }
    12 }
    13 }
    14 public static void main(String[] args) {
    15 SetSchema ss = new SetSchema();
    16 try {
    17 ss.setSchema();
    18 } catch (SQLException e) {
    19 e.printStackTrace();
    20 }
    21 }
    22 }
  • 自动映射

8、Path接口(重要接口更新)

  1 public class PathUsage {
2 public void usePath() {
3 Path path1 = Paths.get("folder1", "sub1");
4 Path path2 = Paths.get("folder2", "sub2");
5 path1.resolve(path2); //folder1\sub1\folder2\sub2
6 path1.resolveSibling(path2); //folder1\folder2\sub2
7 path1.relativize(path2); //..\..\folder2\sub2
8 path1.subpath(0, 1); //folder1
9 path1.startsWith(path2); //false
10 path1.endsWith(path2); //false
11 Paths.get("folder1/./../folder2/my.text").normalize(); //folder2\my.text
12 }
13 /**
14 * @param args the command line arguments
15 */
16 public static void main(String[] args) {
17 PathUsage usage = new PathUsage();
18 usage.usePath();
19 }
20 }

9、DirectoryStream

  1 public class ListFile {
2 public void listFiles() throws IOException {
3 Path path = Paths.get("");
4 try (DirectoryStream<Path> stream = Files.newDirectoryStream(path, "*.*")) {
5 for (Path entry: stream) {
6 //使用entry
7 System.out.println(entry);
8 }
9 }
10 }
11 /**
12 * @param args the command line arguments
13 */
14 public static void main(String[] args) throws IOException {
15 ListFile listFile = new ListFile();
16 listFile.listFiles();
17 }
18 }

10、Files

  1 public class FilesUtils {
2 public void manipulateFiles() throws IOException {
3 Path newFile = Files.createFile(Paths.get("new.txt").toAbsolutePath());
4 List<String> content = new ArrayList<String>();
5 content.add("Hello");
6 content.add("World");
7 Files.write(newFile, content, Charset.forName("UTF-8"));
8 Files.size(newFile);
9 byte[] bytes = Files.readAllBytes(newFile);
10 ByteArrayOutputStream output = new ByteArrayOutputStream();
11 Files.copy(newFile, output);
12 Files.delete(newFile);
13 }
14 /**
15 * @param args the command line arguments
16 */
17 public static void main(String[] args) throws IOException {
18 FilesUtils fu = new FilesUtils();
19 fu.manipulateFiles();
20 }
21 }

11、WatchService

  1 public class WatchAndCalculate {
2 public void calculate() throws IOException, InterruptedException {
3 WatchService service = FileSystems.getDefault().newWatchService();
4 Path path = Paths.get("").toAbsolutePath();
5 path.register(service, StandardWatchEventKinds.ENTRY_CREATE);
6 while (true) {
7 WatchKey key = service.take();
8 for (WatchEvent<?> event : key.pollEvents()) {
9 Path createdPath = (Path) event.context();
10 createdPath = path.resolve(createdPath);
11 long size = Files.size(createdPath);
12 System.out.println(createdPath + " ==> " + size);
13 }
14 key.reset();
15 }
16 }
17 /**
18 * @param args the command line arguments
19 */
20 public static void main(String[] args) throws Throwable {
21 WatchAndCalculate wc = new WatchAndCalculate();
22 wc.calculate();
23 }
24 }

12、jcmd utility

jcmd是为了替代jps出现了,包含了jps的大部分功能并新增了一些新的功能。

  • jcmd -l
    列出所有的Java虚拟机,针对每一个虚拟机可以使用help列出它们支持的命令。

  1 jcmd -l
2 15308 org.eclipse.jetty.xml.XmlConfiguration /tmp/start4070493346048555702.properties /opt/educat/apps/conf/jetty8.xml
3 5624 sun.tools.jcmd.JCmd -l
4 20967 org.apache.flume.node.Application --no-reload-conf -f /opt/educat/flume_agent/conf/flume.conf -n log_agent
  • jcmd pid help

  1 jcmd 15308 help
2 15308:
3 The following commands are available:
4 VM.commercial_features
5 ManagementAgent.stop
6 ManagementAgent.start_local
7 ManagementAgent.start
8 Thread.print
9 GC.class_histogram
10 GC.heap_dump
11 GC.run_finalization
12 GC.run
13 VM.uptime
14 VM.flags
15 VM.system_properties
16 VM.command_line
17 VM.version
18 help
19 For more information about a specific command use 'help <command>'.
  • jcmd pid VM.flags查看启动参数

  1 jcmd 15308 VM.flags
2 15308:
3 -XX:+DisableExplicitGC
4 -XX:ErrorFile=/var/patterncat/logs/catapp.vmerr.log.201505071655
5 -XX:+HeapDumpOnOutOfMemoryError
6 -XX:HeapDumpPath=/var/patterncat/logs/catapp.heaperr.log.201505071655 -XX:InitialHeapSize=5368709120
7 -XX:+ManagementServer
8 -XX:MaxGCPauseMillis=100
9 -XX:MaxHeapSize=5368709120
10 -XX:MaxPermSize=268435456
11 -XX:+PrintAdaptiveSizePolicy
12 -XX:+PrintCommandLineFlags
13 -XX:+PrintGC
14 -XX:+PrintGCApplicationStoppedTime
15 -XX:+PrintGCDateStamps
16 -XX:+PrintGCDetails
17 -XX:+PrintGCTimeStamps
18 -XX:+PrintHeapAtGC
19 -XX:+PrintTenuringDistribution
20 -XX:StringTableSize=49999
21 -XX:+UnlockExperimentalVMOptions
22 -XX:+UseCompressedOops
23 -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 查看性能统计

  1 jcmd 15308 PerfCounter.print
2 15308:
3 java.ci.totalTime=79326405
4 java.cls.loadedClasses=19977
5 java.cls.sharedLoadedClasses=0
6 java.cls.sharedUnloadedClasses=0
7 java.cls.unloadedClasses=1443
8 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"
9 java.property.java.endorsed.dirs="/usr/local/jdk1.7.0_21/jre/lib/endorsed"
10 java.property.java.ext.dirs="/usr/local/jdk1.7.0_21/jre/lib/ext:/usr/java/packages/lib/ext"
11 java.property.java.home="/usr/local/jdk1.7.0_21/jre"
12 java.property.java.library.path="/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib"
13 java.property.java.version="1.7.0_21"
14 java.property.java.vm.info="mixed mode"
15 java.property.java.vm.name="Java HotSpot(TM) 64-Bit Server VM"
16 java.property.java.vm.specification.name="Java Virtual Machine Specification"
17 java.property.java.vm.specification.vendor="Oracle Corporation"
18 java.property.java.vm.specification.version="1.7"
19 java.property.java.vm.vendor="Oracle Corporation"
20 java.property.java.vm.version="23.21-b01"
21 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"
22 java.rt.vmFlags=""
23 java.threads.daemon=72
24 java.threads.live=128
25 java.threads.livePeak=129
26 java.threads.started=1444
27 sun.ci.compilerThread.0.compiles=2595
28 sun.ci.compilerThread.0.method=""
29 sun.ci.compilerThread.0.time=1290
30 sun.ci.compilerThread.0.type=1
31 sun.ci.compilerThread.1.compiles=2802
32 sun.ci.compilerThread.1.method=""
33 sun.ci.compilerThread.1.time=1413
34 sun.ci.compilerThread.1.type=2
35 sun.ci.lastFailedMethod=""
36 sun.ci.lastFailedType=0
37 sun.ci.lastInvalidatedMethod=""
38 sun.ci.lastInvalidatedType=0
39 sun.ci.lastMethod="org/codehaus/groovy/classgen/VariableScopeVisitor checkVariableNameForDeclaration"
40 sun.ci.lastSize=2184
41 sun.ci.lastType=1
42 sun.ci.nmethodCodeSize=12188576
43 sun.ci.nmethodSize=24492688
44 sun.ci.osrBytes=196694
45 sun.ci.osrCompiles=156
46 sun.ci.osrTime=8521713
47 sun.ci.standardBytes=2072839
48 sun.ci.standardCompiles=5241
49 sun.ci.standardTime=70804692
50 sun.ci.threads=2
51 sun.ci.totalBailouts=0
52 sun.ci.totalCompiles=5397
53 sun.ci.totalInvalidates=0
54 sun.classloader.findClassTime=358334873
55 sun.classloader.findClasses=507
56 sun.classloader.parentDelegationTime=30062667
57 sun.cls.appClassBytes=63743816
58 sun.cls.appClassLoadCount=58098
59 sun.cls.appClassLoadTime=9843833
60 sun.cls.appClassLoadTime.self=5288490
61 sun.cls.classInitTime=2617049
62 sun.cls.classInitTime.self=1088905
63 sun.cls.classLinkedTime=4605704
64 sun.cls.classLinkedTime.self=541928
65 sun.cls.classVerifyTime=4055324
66 sun.cls.classVerifyTime.self=2423448
67 sun.cls.defineAppClassTime=3206202
68 sun.cls.defineAppClassTime.self=386302
69 sun.cls.defineAppClasses=16465
70 sun.cls.initializedClasses=14546
71 sun.cls.isUnsyncloadClassSet=0
72 sun.cls.jniDefineClassNoLockCalls=94
73 sun.cls.jvmDefineClassNoLockCalls=4405
74 sun.cls.jvmFindLoadedClassNoLockCalls=32671
75 sun.cls.linkedClasses=16465
76 sun.cls.loadInstanceClassFailRate=0
77 sun.cls.loadedBytes=43314456
78 sun.cls.lookupSysClassTime=87247
79 sun.cls.methodBytes=34262690
80 sun.cls.nonSystemLoaderLockContentionRate=133
81 sun.cls.parseClassTime=3099390
82 sun.cls.parseClassTime.self=2670584
83 sun.cls.sharedClassLoadTime=9647
84 sun.cls.sharedLoadedBytes=0
85 sun.cls.sharedUnloadedBytes=0
86 sun.cls.sysClassBytes=12986737
87 sun.cls.sysClassLoadTime=503885
88 sun.cls.systemLoaderLockContentionRate=0
89 sun.cls.time=15382336
90 sun.cls.unloadedBytes=5087120
91 sun.cls.unsafeDefineClassCalls=1555
92 sun.cls.verifiedClasses=16383
93 sun.gc.cause="No GC"
94 sun.gc.collector.0.invocations=85
95 sun.gc.collector.0.lastEntryTime=24164511065
96 sun.gc.collector.0.lastExitTime=24164628388
97 sun.gc.collector.0.name="G1 incremental collections"
98 sun.gc.collector.0.time=7628099
99 sun.gc.collector.1.invocations=1
100 sun.gc.collector.1.lastEntryTime=24543200515
101 sun.gc.collector.1.lastExitTime=24544107869
102 sun.gc.collector.1.name="G1 stop-the-world full collections"
103 sun.gc.collector.1.time=907355
104 sun.gc.generation.0.agetable.bytes.00=0
105 sun.gc.generation.0.agetable.bytes.01=4294976
106 sun.gc.generation.0.agetable.bytes.02=2014880
107 sun.gc.generation.0.agetable.bytes.03=5406352
108 sun.gc.generation.0.agetable.bytes.04=4875176
109 sun.gc.generation.0.agetable.bytes.05=2865952
110 sun.gc.generation.0.agetable.bytes.06=4374048
111 sun.gc.generation.0.agetable.bytes.07=2058664
112 sun.gc.generation.0.agetable.bytes.08=3574376
113 sun.gc.generation.0.agetable.bytes.09=6923448
114 sun.gc.generation.0.agetable.bytes.10=1541088
115 sun.gc.generation.0.agetable.bytes.11=1347376
116 sun.gc.generation.0.agetable.bytes.12=735888
117 sun.gc.generation.0.agetable.bytes.13=402632
118 sun.gc.generation.0.agetable.bytes.14=713272
119 sun.gc.generation.0.agetable.bytes.15=728688
120 sun.gc.generation.0.agetable.size=16
121 sun.gc.generation.0.capacity=4510973976
122 sun.gc.generation.0.maxCapacity=5368709144
123 sun.gc.generation.0.minCapacity=24
124 sun.gc.generation.0.name="young"
125 sun.gc.generation.0.space.0.capacity=4510973960
126 sun.gc.generation.0.space.0.initCapacity=1128267784
127 sun.gc.generation.0.space.0.maxCapacity=5368709128
128 sun.gc.generation.0.space.0.name="eden"
129 sun.gc.generation.0.space.0.used=580911104
130 sun.gc.generation.0.space.1.capacity=8
131 sun.gc.generation.0.space.1.initCapacity=8
132 sun.gc.generation.0.space.1.maxCapacity=8
133 sun.gc.generation.0.space.1.name="s0"
134 sun.gc.generation.0.space.1.used=0
135 sun.gc.generation.0.space.2.capacity=8
136 sun.gc.generation.0.space.2.initCapacity=8
137 sun.gc.generation.0.space.2.maxCapacity=5368709128
138 sun.gc.generation.0.space.2.name="s1"
139 sun.gc.generation.0.space.2.used=0
140 sun.gc.generation.0.spaces=3
141 sun.gc.generation.1.capacity=857735176
142 sun.gc.generation.1.maxCapacity=5368709128
143 sun.gc.generation.1.minCapacity=8
144 sun.gc.generation.1.name="old"
145 sun.gc.generation.1.space.0.capacity=857735176
146 sun.gc.generation.1.space.0.initCapacity=4240441352
147 sun.gc.generation.1.space.0.maxCapacity=5368709128
148 sun.gc.generation.1.space.0.name="space"
149 sun.gc.generation.1.space.0.used=155730608
150 sun.gc.generation.1.spaces=1
151 sun.gc.generation.2.capacity=138412032
152 sun.gc.generation.2.maxCapacity=268435456
153 sun.gc.generation.2.minCapacity=20971520
154 sun.gc.generation.2.name="perm"
155 sun.gc.generation.2.space.0.capacity=138412032
156 sun.gc.generation.2.space.0.initCapacity=20971520
157 sun.gc.generation.2.space.0.maxCapacity=268435456
158 sun.gc.generation.2.space.0.name="perm"
159 sun.gc.generation.2.space.0.used=138212560
160 sun.gc.generation.2.spaces=1
161 sun.gc.lastCause="Heap Inspection Initiated GC"
162 sun.gc.policy.collectors=1
163 sun.gc.policy.desiredSurvivorSize=264241152
164 sun.gc.policy.generations=3
165 sun.gc.policy.maxTenuringThreshold=15
166 sun.gc.policy.name="GarbageFirst"
167 sun.gc.policy.tenuringThreshold=15
168 sun.gc.tlab.alloc=0
169 sun.gc.tlab.allocThreads=0
170 sun.gc.tlab.fastWaste=0
171 sun.gc.tlab.fills=0
172 sun.gc.tlab.gcWaste=0
173 sun.gc.tlab.maxFastWaste=0
174 sun.gc.tlab.maxFills=0
175 sun.gc.tlab.maxGcWaste=0
176 sun.gc.tlab.maxSlowAlloc=0
177 sun.gc.tlab.maxSlowWaste=0
178 sun.gc.tlab.slowAlloc=0
179 sun.gc.tlab.slowWaste=0
180 sun.management.JMXConnectorServer.0.authenticate="false"
181 sun.management.JMXConnectorServer.0.remoteAddress="service:jmx:rmi:///jndi/rmi://edu-cat02.lf.patterncat.com:8199/jmxrmi"
182 sun.management.JMXConnectorServer.0.ssl="false"
183 sun.management.JMXConnectorServer.0.sslNeedClientAuth="false"
184 sun.management.JMXConnectorServer.0.sslRegistry="false"
185 sun.management.JMXConnectorServer.address="service:jmx:rmi://127.0.0.1/stub/rO0ABXNyAC5qYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5ybWkuUk1JU2VydmVySW1wbF9TdHViAAAAAAAAAAICAAB4cgAaamF2YS5ybWkuc2VydmVyLlJlbW90ZVN0dWLp/tzJi+FlGgIAAHhyABxqYXZhLnJtaS5zZXJ2ZXIuUmVtb3RlT2JqZWN002G0kQxhMx4DAAB4cHc3AAtVbmljYXN0UmVmMgAADDEwLjY0LjI4LjIwNwAAhbjWmVwaDwiNg3l3YeUAAAFNLZX68oACAHg="
186 sun.os.hrt.frequency=1000000
187 sun.os.hrt.ticks=24580753795
188 sun.perfdata.majorVersion=2
189 sun.perfdata.minorVersion=0
190 sun.perfdata.overflow=0
191 sun.perfdata.size=32768
192 sun.perfdata.timestamp=259316
193 sun.perfdata.used=17792
194 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"
195 sun.property.sun.boot.library.path="/usr/local/jdk1.7.0_21/jre/lib/amd64"
196 sun.rt._sync_ContendedLockAttempts=297851
197 sun.rt._sync_Deflations=438863
198 sun.rt._sync_EmptyNotifications=0
199 sun.rt._sync_FailedSpins=0
200 sun.rt._sync_FutileWakeups=349651
201 sun.rt._sync_Inflations=438971
202 sun.rt._sync_MonExtant=16256
203 sun.rt._sync_MonInCirculation=0
204 sun.rt._sync_MonScavenged=0
205 sun.rt._sync_Notifications=1580811
206 sun.rt._sync_Parks=1935145
207 sun.rt._sync_PrivateA=0
208 sun.rt._sync_PrivateB=0
209 sun.rt._sync_SlowEnter=0
210 sun.rt._sync_SlowExit=0
211 sun.rt._sync_SlowNotify=0
212 sun.rt._sync_SlowNotifyAll=0
213 sun.rt._sync_SuccessfulSpins=0
214 sun.rt.applicationTime=24559855809
215 sun.rt.createVmBeginTime=1430988913170
216 sun.rt.createVmEndTime=1430988913429
217 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)"
218 sun.rt.interruptedBeforeIO=0
219 sun.rt.interruptedDuringIO=0
220 sun.rt.javaCommand="org.eclipse.jetty.xml.XmlConfiguration /tmp/start4070493346048555702.properties /opt/educat/apps/conf/jetty8.xml"
221 sun.rt.jvmCapabilities="1000000000000000000000000000000000000000000000000000000000000000"
222 sun.rt.jvmVersion=387252225
223 sun.rt.safepointSyncTime=2333795
224 sun.rt.safepointTime=15955181
225 sun.rt.safepoints=18365
226 sun.rt.threadInterruptSignaled=0
227 sun.rt.vmInitDoneTime=1430988913232
228 sun.threads.vmOperationTime=9516621
229 sun.urlClassLoader.readClassBytesTime=958824201
230 sun.zip.zipFile.openTime=72163038
231 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

参考

Java7的新特性的更多相关文章

  1. Java7语法新特性

    Java7语法新特性: 1. switch中增加对String类型的支持. public String generate(String name, String gender) { String ti ...

  2. Java5、Java6、Java7的新特性

    Java5 Java 5添加了8个语言特性:泛型,类型安全枚举,注解,自动装箱和拆箱,增强的循环,静态导入,可变参数,协变返回类型. 1.泛型 Generics: 引用泛型之后,允许指定集合里元素的类 ...

  3. Java7 switch新特性

    在Java7之前,switch只能匹配整数值,和字符:而Java7添加了字符串的匹配特性. 代码如下: package blog; public class Main { public static ...

  4. java7新特性 java8新特性

    Java 7 的7个新特性 Java7语法新特性 JAVA8 十大新特性详解 http://www.jb51.net/article/48304.htm

  5. Java7 新特性 数值文本表示法

    今天和大家分享下 java7中新特性-数值文本表示法 首先,在原来jdk1.6中 如果需要将一个二进制的数值转换成十进制的话,一般情况下都会以下面的代码方式去实现. public static voi ...

  6. java7 新特性 总结版

    Java7语法新特性: 前言,这是大部分的特性,但还有一些没有写进去,比如多核 并行计算的支持加强 fork join 框架:这方面并没有真正写过和了解.也就不写进来了. 1. switch中增加对S ...

  7. Java最近版本新特性使用介绍

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 在阅读<Thinking in Java>的过程中,并发这一章出现不少新特性,工作中也有 ...

  8. 【Java8新特性】面试官问我:Java8中创建Stream流有哪几种方式?

    写在前面 先说点题外话:不少读者工作几年后,仍然在使用Java7之前版本的方法,对于Java8版本的新特性,甚至是Java7的新特性几乎没有接触过.真心想对这些读者说:你真的需要了解下Java8甚至以 ...

  9. java5、java6、java7、java8的新特性

    Java5: 1.泛型 Generics:        引用泛型之后,允许指定集合里元素的类型,免去了强制类型转换,并且能在编译时刻进行类型检查的好处. Parameterized Type作为参数 ...

随机推荐

  1. Sprint会议2

    昨天:准备查找安卓APP开发的有关资料,安装有关软件 今天:自己制作一个安卓小程序,熟悉一下操作 遇到问题:安装遇到问题,环境配置出现问题

  2. Internet History, Technology and Security (Week8)

    Week 8 This week we start two weeks of Internet Security. It is a little technical but don't worry - ...

  3. Good Time 冲刺 一

    2018/6/14 我们组之前没有开发小程序的经验,所以在尝试中不断探索与学习.在完成小程序的初步注册和界面完善后,我们组开始进行开发任务. 1.1成员简述: 王怡镔:“今天主要学习小程序开发知识及相 ...

  4. [二叉树建树&完全二叉树判断] 1110. Complete Binary Tree (25)

    1110. Complete Binary Tree (25) Given a tree, you are supposed to tell if it is a complete binary tr ...

  5. 获取ios设备的udid

    今天get的第二个技能~~~ UDID指的是设备的唯一设备识别符,ipa包未上架之前如果不添加udid是无法安装成功的.那么如何快速获取ios设备的udid呢? 今天get的方法是用蒲公英,网址:ht ...

  6. [转帖]go 的goroutine 以及 channel 的简介.

    进程,线程的概念在操作系统的书上已经有详细的介绍.进程是内存资源管理和cpu调度的执行单元.为了有效利用多核处理器的优势,将进程进一步细分,允许一个进程里存在多个线程,这多个线程还是共享同一片内存空间 ...

  7. 笔记之分布式文件系统(DFS)

    不知何故,老外都挺喜欢使用DFS,但是国内公司用这个的不多.一个具体的需求就是,备份服务器在国外,所以启用DFS把国内的数据同步一份到国外进行备份.最近有机会接触DFS,把一些心得体会记录一下. 1. ...

  8. Jquery 表单提交后3s禁用

    <form action="${pageContext.servletContext.contextPath}/XXX/###" method="post" ...

  9. Spyder & Python

    Spyder & Python https://pypi.org/project/spyder/ Spyder is a powerful scientific environment wri ...

  10. how install svn client on MacOS

    how install svn client on MacOS svn https://www.smartsvn.com/downloads/smartsvn/smartsvn-macosx-11_0 ...