Java虛擬機(一)

1、Java發展歷程

Java之父,James Gosling博士javascript

 

時間 事件
1991年4月 James Gosling博士領導的Green Project啓動,java語言前身Oak啓動
1995年5月23日 Oak更名爲Java,SunWord大會發布Java 1.0,提出「Write Once,Run Anywhere」的口號
1996年1月23日 JDK1.0發佈,Sun Classic VM
1996年5月 舊金山首屆JavaOne大會
1997年2月19日 JDK 1.1發佈
1998年12月4日 JDK1.2發佈
1999年4月27日 HotSpot虛擬機發布
2000年5月8日 JDK1.3發佈
2002年2月13日 JDK1.4發佈
2004年9月30日 JAVA 5
2006年11月13日 Sun宣佈Java開源
2006年12月11日 JAVA 6
2009年2月19日 JDK 7完成了第一個里程碑版本
2014年3月18日 JAVA 8
2017年9月21日 JAVA 9
2018年3月21日 JAVA 10
2018年9月25日 JJAVA 11


 

JDK Version 1.0

1996-01-23 Oak(橡樹)html

初代版本,偉大的一個里程碑,可是是純解釋運行,使用外掛JIT,性能比較差,運行速度慢。java


JDK Version 1.1

1997-02-19正則表達式

  • JDBC(Java DataBase Connectivity);
  • 支持內部類;
  • RMI(Remote Method Invocation) ;
  • 反射;
  • Java Bean;

JDK Version 1.2

1998-12-08 Playground(操場)算法

  • 集合框架;
  • JIT(Just In Time)編譯器;
  • 對打包的Java文件進行數字簽名;
  • JFC(Java Foundation Classes), 包括Swing 1.0, 拖放和Java2D類庫;
  • Java插件;
  • JDBC中引入可滾動結果集,BLOB,CLOB,批量更新和用戶自定義類型;
  • Applet中添加聲音支持.

JDK Version 1.3

2000-05-08 Kestrel(紅隼)編程

  • Java Sound API;
  • jar文件索引;
  • 對Java的各個方面都作了大量優化和加強;

JDK Version 1.4

2004-02-06 Merlin(隼)安全

  • XML處理;
  • Java打印服務;
  • Logging API;
  • Java Web Start;
  • JDBC 3.0 API;
  • 斷言;
  • Preferences API;
  • 鏈式異常處理;
  • 支持IPV6;
  • 支持正則表達式;
  • 引入Imgae I/O API.

JAVA 5

2004-09-30 Tiger(老虎)服務器

  • 泛型;
  • 加強循環,可使用迭代方式;
  • 自動裝箱與自動拆箱;
  • 類型安全的枚舉;
  • 可變參數;
  • 靜態引入;
  • 元數據(註解);
  • Instrumentation;

JAVA 6

2006-12-11 Mustang(野馬)框架

  • 支持腳本語言;
  • JDBC 4.0API;
  • Java Compiler API;
  • 可插拔註解;
  • 增長對Native PKI(Public Key Infrastructure), Java GSS(Generic Security Service),Kerberos和LDAP(Lightweight Directory Access Protocol)支持;
  • 繼承Web Services;

JAVA 7

2011-07-28 Dolphin(海豚)異步

  • switch語句塊中容許以字符串做爲分支條件;
  • 在建立泛型對象時應用類型推斷;
  • 在一個語句塊中捕獲多種異常;
  • 支持動態語言;
  • 支持try-with-resources(在一個語句塊中捕獲多種異常);
  • 引入Java NIO.2開發包;
  • 數值類型能夠用二進制字符串表示,而且能夠在字符串表示中添加下劃線;
  • 鑽石型語法(在建立泛型對象時應用類型推斷);
  • null值得自動處理;

JAVA 8

2014-03-18 

  • Lambda 表達式 − Lambda容許把函數做爲一個方法的參數(函數做爲參數傳遞進方法中。

  • 方法引用 − 方法引用提供了很是有用的語法,能夠直接引用已有Java類或對象(實例)的方法或構造器。與lambda聯合使用,方法引用可使語言的構造更緊湊簡潔,減小冗餘代碼。

  • 默認方法 − 默認方法就是一個在接口裏面有了一個實現的方法。

  • 新工具 − 新的編譯工具,如:Nashorn引擎 jjs、 類依賴分析器jdeps。

  • Stream API −新添加的Stream API(java.util.stream) 把真正的函數式編程風格引入到Java中。

  • Date Time API − 增強對日期與時間的處理。

  • Optional 類 − Optional 類已經成爲 Java 8 類庫的一部分,用來解決空指針異常。

  • Nashorn, JavaScript 引擎 − Java 8提供了一個新的Nashorn javascript引擎,它容許咱們在JVM上運行特定的javascript應用。

  • 詳細參考:http://www.runoob.com/java/java8-new-features.html


JAVA 9

2017-09-22

  • 模塊系統:模塊是一個包的容器,Java 9 最大的變化之一是引入了模塊系統(Jigsaw 項目)。
  • REPL (JShell):交互式編程環境。
  • HTTP 2 客戶端:HTTP/2標準是HTTP協議的最新版本,新的 HTTPClient API 支持 WebSocket 和 HTTP2 流以及服務器推送特性。
  • 改進的 Javadoc:Javadoc 如今支持在 API 文檔中的進行搜索。另外,Javadoc 的輸出如今符合兼容 HTML5 標準。
  • 多版本兼容 JAR 包:多版本兼容 JAR 功能能讓你建立僅在特定版本的 Java 環境中運行庫程序時選擇使用的 class 版本。
  • 集合工廠方法:List,Set 和 Map 接口中,新的靜態工廠方法能夠建立這些集合的不可變實例。
  • 私有接口方法:在接口中使用private私有方法。咱們可使用 private 訪問修飾符在接口中編寫私有方法。
  • 進程 API: 改進的 API 來控制和管理操做系統進程。引進 java.lang.ProcessHandle 及其嵌套接口 Info 來讓開發者逃離時常由於要獲取一個本地進程的 PID 而不得不使用本地代碼的窘境。
  • 改進的 Stream API:改進的 Stream API 添加了一些便利的方法,使流處理更容易,並使用收集器編寫複雜的查詢。
  • 改進 try-with-resources:若是你已經有一個資源是 final 或等效於 final 變量,您能夠在 try-with-resources 語句中使用該變量,而無需在 try-with-resources 語句中聲明一個新變量。
  • 改進的棄用註解 @Deprecated:註解 @Deprecated 能夠標記 Java API 狀態,能夠表示被標記的 API 將會被移除,或者已經破壞。
  • 改進鑽石操做符(Diamond Operator) :匿名類可使用鑽石操做符(Diamond Operator)。
  • 改進 Optional 類:java.util.Optional 添加了不少新的有用方法,Optional 能夠直接轉爲 stream。
  • 多分辨率圖像 API:定義多分辨率圖像API,開發者能夠很容易的操做和展現不一樣分辨率的圖像了。
  • 改進的 CompletableFuture API : CompletableFuture 類的異步機制能夠在 ProcessHandle.onExit 方法退出時執行操做。
  • 輕量級的 JSON API:內置了一個輕量級的JSON API
  • 響應式流(Reactive Streams) API: Java 9中引入了新的響應式流 API 來支持 Java 9 中的響應式編程。
  • 詳細參考:http://www.runoob.com/java/java9-new-features.html

JAVA 10

2018-03-21

根據官網的公開資料,共有12個重要特性,以下:

  • JEP286,var 局部變量類型推斷。
  • JEP296,將原來用 Mercurial 管理的衆多 JDK 倉庫代碼,合併到一個倉庫中,簡化開發和管理過程。
  • JEP304,統一的垃圾回收接口。
  • JEP307,G1 垃圾回收器的並行完整垃圾回收,實現並行性來改善最壞狀況下的延遲。
  • JEP310,應用程序類數據 (AppCDS) 共享,經過跨進程共享通用類元數據來減小內存佔用空間,和減小啓動時間。
  • JEP312,ThreadLocal 握手交互。在不進入到全局 JVM 安全點 (Safepoint) 的狀況下,對線程執行回調。優化能夠只中止單個線程,而不是停所有線程或一個都不停。
  • JEP313,移除 JDK 中附帶的 javah 工具。可使用 javac -h 代替。
  • JEP314,使用附加的 Unicode 語言標記擴展。
  • JEP317,能將堆內存佔用分配給用戶指定的備用內存設備。
  • JEP317,使用 Graal 基於 Java 的編譯器,能夠預先把 Java 代碼編譯成本地代碼來提高效能。
  • JEP318,在 OpenJDK 中提供一組默認的根證書頒發機構證書。開源目前 Oracle 提供的的 Java SE 的根證書,這樣 OpenJDK 對開發人員使用起來更方便。
  • JEP322,基於時間定義的發佈版本,即上述提到的發佈週期。版本號爲\$FEATURE.\$INTERIM.\$UPDATE.\$PATCH,分別是大版本,中間版本,升級包和補丁版本。

JAVA 11

2018-09-25 

翻譯後的新特性有:

  • 181:Nest-Based訪問控制
  • 309:動態類文件常量
  • 315:改善Aarch64 intrinsic
  • 318:無操做垃圾收集器
  • 320:消除Java EE和CORBA模塊
  • 321:HTTP客戶端(標準)
  • 323:局部變量的語法λ參數
  • 324:Curve25519和Curve448關鍵協議
  • 327:Unicode 10
  • 328:飛行記錄器
  • 329:ChaCha20和Poly1305加密算法
  • 330:發射一列縱隊源代碼程序
  • 331:低開銷堆分析
  • 332:傳輸層安全性(Transport Layer Security,TLS)1.3
  • 333:動做:一個可伸縮的低延遲垃圾收集器 (實驗)
  • 335:反對Nashorn JavaScript引擎
  • 336:反對Pack200工具和API

--------------------- 本文來自 ranyuangang 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/ranyuangang/article/details/82855017?utm_source=copy 

 

2、JVM初體驗

Java技術體系的組成:

  • Java程序語言設計
  • 各類硬件平臺上的JAV虛擬機
  • Class文件格式
  • Japva API類庫
  • 第三方Java類庫

 Java SE API和Java虛擬機這兩部分統稱爲JRE,是支持Java程序運行的標準環境。

 

內存溢出場景模擬

-XX:+HeapDumpOnOutOfMemoryError -Xms20m -Xmx20m

 

 

 內存異常的錯誤

java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid6948.hprof ...
Heap dump file created [27954569 bytes in 0.102 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Unknown Source)
    at java.util.Arrays.copyOf(Unknown Source)
    at java.util.ArrayList.grow(Unknown Source)
    at java.util.ArrayList.ensureExplicitCapacity(Unknown Source)
    at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
    at java.util.ArrayList.add(Unknown Source)
    at com.jiehui.test.Main.main(Main.java:10)

 

很難定位到錯誤

找到塊照java_pid6948.hprof

用Eclipse Memory Analyzer打開

 

 

main有問題

 

 Demo太多了

 

 

 

 

jvm可視化監控工具JConsole

在jdk的bin中找到

package com.jiehui.test;

import java.util.ArrayList;
import java.util.List;

import javax.swing.Box.Filler;

public class JConsoleTest {
    
    public byte[] b1 = new byte[128*1024];
    
    public static void main(String[] args) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
         System.out.println("start...");
         fill(1000);
        }
     public static void fill(int n) {
          List<JConsoleTest> jList = new ArrayList<>();
           for (int i=0; i<n; i++) {
               try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
                jList.add(new JConsoleTest());     
            }
     }
}

打開JConsole,選中

 

堆內存不斷增長

 

 

 

 

 

 

 

 

 

 

 

 

 

package com.jiehui.test;

import java.util.ArrayList;
import java.util.List;

import javax.swing.Box.Filler;

public class JConsoleTest {
    

    public JConsoleTest() {
        byte[] b1 = new byte[128*1024];
    }
    public static void main(String[] args) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
         System.out.println("start...");
         fill(1000);
        }
     public static void fill(int n) {
          List<JConsoleTest> jList = new ArrayList<>();
           for (int i=0; i<n; i++) {
               try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
                jList.add(new JConsoleTest());     
            }
     }
}

改成局部變量,垃圾回收機制

相關文章
相關標籤/搜索