Java基礎學習(一)

来源:https://www.cnblogs.com/BRE49/archive/2018/01/12/java-1.html
-Advertisement-
Play Games

JAVA工作方式 源程式(myProgram.java) – > 編譯(javac myProgram.java) -> JAVA位元組碼(myProgram.class) ->運行(java myProgram) 指令: 編譯時:javac(compiler) + 文件名 運行時:java +文件名 ...


JAVA工作方式

      源程式(myProgram.java) – > 編譯(javac myProgram.java) -> JAVA位元組碼(myProgram.class) ->運行(java myProgram)

                         

 

指令:

  • 編譯時:javac(compiler) + 文件名
  • 運行時:java +文件名

 

JAVA的程式結構

  源文件>類>方法>語句(source file > class > method > statement)

  

  import java.lang.String;   import java.lang.System;     public class MyFirstApp {       public void main(String[] args){           System.out.print("Hello World!");       }   }  

註意:

  • 文件名MyFirstApp一定要文件內class的名稱相同,大小寫敏感。
  • 使用javac指令編譯時,大小寫不敏感。
  • 使用java指令運行時,大小寫敏感。
  • import java.lang 可省略
  • 程式啟動時會去找main()方法,main()是程式的起點
  • 1個程式有且至於1個mian()方法
  • 1個JAVA程式至少有1個類,但是同時可以是多個
  • JAVA是強類型,條件測試結果一定要是boolean值

 

JDK、JRE、JVM的區別:

  • JVM(Java Virtual Machine):JAVA虛擬機
  • JDK(Java Developer’s Kit):Java開發工具包
  • JRE(Java runtime environment):Java 運行環境

編程語言的分類(按程式的執行方式):

  1.編譯型語言:指使用專門的編譯器,針對特定的操作系統將源程式代碼一次性翻譯成電腦能識別的機器指令。如C、C++

   2.解釋型語言:指使用專門的解釋器,將源程式代碼逐條地解釋成特定的機器指令,解釋一句執行一句,類似於同聲翻譯。如ASP、PHP。

 

JVM初識及工作原理:

  

    JVM主要包括四個部分:

      1.類載入器(ClassLoader):在JVM啟動時或者在類運行時將需要的class載入到JVM中。

      2.執行引擎:負責執行class文件中包含的位元組碼指令

      3.記憶體區(也叫運行時數據區):是在JVM運行的時候操作所分配的記憶體區。運行時記憶體區主要可以劃分為5個區域,如圖:

 

        

      

  • 方法區(Method Area):用於存儲類結構信息的地方,包括常量池、靜態變數、構造函數等。雖然JVM規範把方法區描述為堆的一個邏輯部分, 但它卻有個別名non-heap(非堆),所以大家不要搞混淆了。方法區還包含一個運行時常量池。
  • java堆(Heap):存儲java實例或者對象的地方。這塊是GC的主要區域(後面解釋)。從存儲的內容我們可以很容易知道,方法區和堆是被所有java線程共用的。
  • java棧(Stack):java棧總是和線程關聯在一起,每當創建一個線程時,JVM就會為這個線程創建一個對應的java棧。在這個java棧中又會包含多個棧幀,每運行一個方法就創建一個棧幀,用於存儲局部變數表、操作棧、方法返回值等。每一個方法從調用直至執行完成的過程,就對應一個棧幀在java棧中入棧到出棧的過程。所以java棧是現成私有的。
  • 程式計數器(PC Register):用於保存當前線程執行的記憶體地址。由於JVM程式是多線程執行的(線程輪流切換),所以為了保證線程切換回來後,還能恢復到原先狀態,就需要一個獨立的計數器,記錄之前中斷的地方,可見程式計數器也是線程私有的。
  • 本地方法棧(Native Method Stack):和java棧的作用差不多,只不過是為JVM使用到的native方法服務的

    4.本地方法介面:主要是調用C或C++實現的本地方法及返回結果。

 

  JVM在整個JDK中處於最底層,負責與操作系統的交互,用來屏蔽操作系統環境,提供一個王正的Java運行環境,因此也稱為虛擬電腦。操作系統裝入JVM是通過JDK中的java.exe來實現,主要以下幾步:

    1.創建jvm裝載環境和配置

    2.裝載jvm.dll

    3.初始化jvm.dll

    4.調用JNIEnv實例裝載並處理class類

    5.運行java程式

 

什麼是GC,GC的工作原理是什麼:  Garbage Collection,垃圾回收

  1.垃圾收集器一般必須完成兩件事:檢測出垃圾;回收垃圾。怎麼檢測出垃圾?一般有以下幾種方法:

      引用計數法:給一個對象添加引用計數器,每當有個地方引用它,計數器就加1;引用失效就減1。

     可達性分析演算法:以根集對象為起始點進行搜索,如果有對象不可達的話,即是垃圾對象。這裡的根集一般包括java棧中引用的對象、方法區常量池中引用的對       象,本地方法中引用的對象等。

  2.為什麼要運用分代垃圾回收策略?

    在java程式運行的過程中,會產生大量的對象,因每個對象所能承擔的職責不同所具有的功能不同所以也有著不一樣的生命周期,有的對象生命周期較長,比如Http請求中的Session對象,線程,Socket連接等;有的對象生命周期較短,比如String對象,由於其不變類的特性,有的在使用一次後即可回收。試想,在不進行對象存活時間區分的情況下,每次垃圾回收都是對整個堆空間進行回收,那麼消耗的時間相對會很長,而且對於存活時間較長的對象進行的掃描工作等都是徒勞。因此就需要引入分治的思想,所謂分治的思想就是因地制宜,將對象進行代的劃分,把不同生命周期的對象放在不同的代上使用不同的垃圾回收方式。

  

  3.如何劃分?

    將對象按其生命周期的不同劃分成:年輕代(Young Generation)、年老代(Old Generation)、持久代(Permanent Generation)。其中持久代主要存放的是類信息,所以與java對象的回收關係不大,與回收息息相關的是年輕代和年老代。

 

   4.分代回收的效果圖如下:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前一篇我們探討了關於springboot的配置文件和Controller的使用,本篇我們來一起探討一下關於springboot如何傳遞參數的知識。 參數傳遞我們最常見的就是在url後通過?/&兩個符號來將參數傳遞到後臺,當然springboot也是也一樣,我們可以通過這種方式將參數傳遞到後臺,那麼後 ...
  • 預測模型 1、簡介 預測建模(Predictive modeling)是一種用來預測系統未來行為的分析技術,它由一群能夠識別獨立輸入變數與反饋目標關聯關係的演算法構成。根據觀測值創建一個數學模型,然後用這個模型去預測未來發生的事情。 預測模型是用若幹個可能對系統行為產生影響的特征構建的,當處理系統問題 ...
  • Snake.pro文件 頭文件 allparameter.h mythread.h widget.h 源文件 main.cpp mythread.cpp widget.cpp 界面控制項 最終效果 ...
  • 1. 在項目routes/web.php文件中添加了自定義的路由後,訪問laravel.test.cn/index.php/list (虛擬功能變數名稱詳情見配置),可以正常訪問,但是去掉index.php後,提示404 Not Found 2. 按照Laravel 5.5 文檔Pretty URLs章節, ...
  • 泛型的概念: 簡單地講,就是同一個方法(類),可以接受不同的數據類型並運行得到相對應的結果,不會出現安全問題 上一篇有一段這樣的代碼: 沒有定義集合類型、迭代器類型 這裡會有隱患:如果add(1);,自動裝箱成Integer類型,無法轉換成String,發生類型的轉換異常 java中提出了泛型的概念 ...
  • (一)返回指針值的函數的一般形式 類型名 * 函數名(參數表列) 如:int *a(int x,int y) 調用a函數返回的指針指向整型變數 (二)指針型函數小例子 例子,輸入一個學生序號,然後輸出該學生的所有成績 註意比較*(pointer+n)和(*pointer+n)的區別*(p+n)是某一 ...
  • 吐槽 這個演算法。。 怎麼說........ 學來也就是裝裝13吧。。。。 長得比EK醜 跑的比EK慢 寫著比EK難 思想 大家先來猜一下這個演算法的思想吧:joy: 看看人家的名字——最高標號預留推進 多麼高端大氣上檔次2333333咳咳 從它的名字中我們可以看出,它的核心思想是—推進,而不是找增廣路 ...
  • 子類繼承了父類的各種屬性,而構造方法則相當於把父類給實例化出來,如果你子類實例化的時候不調用父類的構造方法,相當於子類壓根就沒有父親 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...