1. 程式人生 > >關於JVM和Java的一些基礎

關於JVM和Java的一些基礎

結合jvm筆記和java底層筆記

一、Java中JRE JVM JDK的區別

JVM:Java虛擬機器,是整個Java實現跨平臺的最核心部分 編譯.class檔案

JRE:Java執行環境 僅有JVM不能執行.class 解釋class時JVM需呼叫解釋類庫lib ,裡面有bin和lib 可以認為bin就是jvm jvm和lib合起來成為JRE

JDK:jdk真正執行Java時起作用的是bin include lib jre
bin:最主要的是編譯器
include:Java和JVM互動用的標頭檔案
lib:類庫
jre:Java執行環境

總結:正常執行程式只需要jre就夠 如果要編譯執行Java程式就需要jdk bin目錄下編譯工具

二、Java快取機制Cache

快取:將程式或系統經常要呼叫的物件存在記憶體中,可在使用時進行快速呼叫,不必建立新的重複的例項。這樣做可以減少系統開銷,提高效率

兩大分類:
1.通過檔案快取,資料儲存在磁碟上 不管是一XML格式,序列化檔案DAT格式或者其他格式;
2.記憶體快取,也就是實現一個類中靜態Map 對這個Map進行常規的增刪改
程式碼另一個檔案

三、Redis快取

作用:通過redis快取資料 目的是減少資料庫的負擔不是加快查詢速度

解釋:redis是一個key-value儲存系統。和Memcached類似 它支援儲存的value型別相對較多,包括string list set zset(有序集合) hash。 這些操作都是原子性的 在此基礎上 redis支援各種不同的排序方式 和memcached一樣 為了保證效率 資料快取在記憶體中 。最大區別是redis會週期性的吧更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並在此基礎上實現了maste-slave(主從)

redis快取資料 記憶體佔滿解決辦法:
1.加記憶體
2.搭建叢集
3.縮短資料過期時間 以釋放記憶體

四、SpringMVC(是一種設計模式)

MVC設計思想:MVC即Model-View-Controller 把一個應用的輸入、處理、輸出流程按照Model、View、Controller的方式進行分離、這樣一個應用被分成三個層——模型層、檢視層、控制層
MVC是一種複合模式,結合了觀察者模式、策略模式、組合模式、介面卡模式。
模型使用觀察者模式,一遍觀察者更新,同時保持兩者之間的解耦。
控制器是檢視的策略,檢視使用組合模式實現使用者介面。
介面卡模式用來將模型適配成符合現有檢視和控制器的需要的模型
這些模式合作把MVC模式的三層解耦。

檢視層:代表使用者互動介面,對於Web應用,可以是HTML 也可能是jsp、XML和Applet。一個應用有很多不同的檢視,MVC設計模式對於檢視的處理僅限於檢視上資料的採集和處理,以及使用者的請求,二不包過在檢視上的雨霧流程的處理。業務流程的處理交於模型層(model)處理。
它只是作為一種輸出資料並允許使用者操縱的方式

模型類:是業務的處理以及業務規則的制定。模型接受檢視請求的資料,並返回最終的處理結果。業務模型的設計師MVC最主要的核心。MVC設計模式告訴我們 把應用的模型按一定的規則抽取出來,抽取的層次很重要,抽象與具體不能隔得太遠,也不能太近。MVC並沒有提供模型的設計方法,而只是組織管理這些模型,以便於模型的重構和提高重要性。
業務模型還有一個很重要的模型那就是資料模型。資料型別主要是指實體物件的資料儲存(持續化)
減少了程式碼的重複性

控制層:是應用程式中處理使用者互動的部分。通常控制器負責從檢視讀取資料,控制使用者輸入,並向模型傳送資料。
控制器本身不輸出任何東西和做任何處理。它只是接收請求並決定呼叫哪個模型構件去處理請求,然後再確定用哪個檢視來顯示返回的資料

MVC分層有助於管理複雜的應用程式,因為可以在一個時間內只關注一個方面
MVC分層同時也簡化了分組開發,不同的開發人員可同時開發檢視、控制器邏輯和業務邏輯
MVC最典型的就是 JSP+servlet+javabean模式

五、session與cookie的區別

cookie 存在客戶端(客戶的瀏覽器) 不安全 記憶體大小有限制

session 資料放在伺服器 在一定時間內儲存在伺服器(訪問增多時會清除session快取 建議用cookie) 單個cookie儲存資料不能超過4k (大多數瀏覽器限制一個站點最多儲存20個cookie)

個人建議 登入資訊扥重要資訊放入session
其他資訊如果需要保留 可以放cookie

(jsp動態 底層servlet->Java程式碼經過JVM進行編譯)

六、SSH與SSM的區別

定義:

SSH:Struts2做控制器(controller),spring管理各層的元件,hibernate負責持久化。

SSM:SpringMVC做控制器,spring管理各層的元件,Mybatis負責持久化層

共同點:1.spring依賴注入DI來管理各層的元件
2.使用面向切面AOP管理事務、日誌、許可權

不同點:1.Struts2和SpringMVC控制器(Controller)控制檢視和模型的互動機制不同
2.Struts2是Action類級別 SpringMVC是方法級別,更容易實現RESTful風格

冗餘
主鍵與外來鍵再多表中的重複出現,不屬於資料冗餘(謹記*) 非鍵欄位的重複出現才是資料冗餘,而且是低階冗餘,即重複性的冗餘。高階冗餘不是欄位的重複出現,而是欄位的派生出現。例如:單價、數量、金額三個欄位,金額就是由單價*數量派生出來的,是高階冗餘

冗餘的目的是為了提高處理速度。只有低階冗餘才會增加資料的不一致性,以為同一資料,可能從不同的時間。地點。角色上多次錄入。因此我們提倡高階冗餘(派生性冗餘),反對低階冗餘。

解耦合
耦合是一個寬泛的概念。兩個程式模組有關聯叫做耦合

某些模組必然要關聯起來才能工作,這是由業務邏輯決定的,不能否認。所以解耦並不是字面意義上的把關聯拆掉,而是把模組之間的關聯放鬆到必要的程度。Advices:
.模組只對外暴露最小限度的介面,形成最低的依賴關係
.只要對外介面不變,模組內部的修改,就不得影響其他模組
.刪除一個模組,應當隻影響有依賴關係的其他,而不應該影響其他無關部分

軟體工程有一條鐵律“高內聚,低耦合”必要的耦合不可否認,沒有耦合程式就做不成事;但是不必要的緊耦合就會讓程式“牽一髮而動全身”,最終讓程式設計師的編寫和維護都無從下手

“高內聚,低耦合”就是為了滿足讓人類在同一時間只能專注一小部分的內容

非同步同步

 要跨執行緒維護正確的可見性,只要在幾個執行緒之間共享非 final 變數,就必須使用 synchronized(同步)(或 volatile 易改變的)以確保一個執行緒可以看見另一個執行緒做的更改。

為了線上程之間進行可靠的通訊,也為了互斥訪問,同步是必須的。

為了達到這個目的,java在一箇舊的的程序同步模型——監控器(Monitor)的基礎上實現了一個巧妙的方案:監控器是一個控制機制,可以認為是一個很小的、只能容納一個執行緒的盒子,一旦一個執行緒進入監控器,其它的執行緒必須等待,直到那個執行緒退出監控為止。通過這種方式,一個監控器可以保證共享資源在同一時刻只可被一個執行緒使用。這種方式稱之為同步。(一旦一個執行緒進入一個例項的任何同步方法,別的執行緒將不能進入該同一例項的其它同步方法,但是該例項的非同步方法仍然能夠被呼叫)。

錯誤的理解:同步嘛,就是幾個執行緒可以同時進行訪問。

同步和多執行緒關係:沒多執行緒環境就不需要同步;有多執行緒環境也不一定需要同步。

鎖提供了兩種主要特性:互斥(mutual exclusion) 和可見性(visibility)。

互斥即一次只允許一個執行緒持有某個特定的鎖,因此可使用該特性實現對共享資料的協調訪問協議,這樣,一次就只有一個執行緒能夠使用該共享資料。

可見性要更加複雜一些,它必須確保釋放鎖之前對共享資料做出的更改對於隨後獲得該鎖的另一個執行緒是可見的 —— 如果沒有同步機制提供的這種可見性保證,執行緒看到的共享變數可能是修改前的值或不一致的值,這將引發許多嚴重問題

小結:為了防止多個執行緒併發對同一資料的修改,所以需要同步,否則會造成資料不一致(就是所謂的:執行緒安全。如java集合框架中Hashtable和Vector是執行緒安全的。我們的大部分程式都不是執行緒安全的,因為沒有進行同步,而且我們沒有必要,因為大部分情況根本沒有多執行緒環境)。

執行緒and程序
1、實現多執行緒的方法(四種)
2、(執行緒安全?)java中實現同步的方式(synchronized/Lock)
3、用過java.util.concurrent(java併發包下的哪些類)
a.Lock(ReentranLock,ReadWriteLock//讀寫鎖)
4、volatitle關鍵字
5、你在專案中的那些地方運用了多執行緒
6、執行緒池
7、JMM(java記憶體模型)
8、sleep和wait的區別

23種計模式 共分為3大類:
建立型模式 5種:工廠方法模式 抽象工廠模式 單例模式 建造模式 原型模式
結構型模式 共七種:介面卡模式、裝飾器模式、代理模式、外觀模式、橋接模式、 組合模式、享元模式
行為型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式。
其實還有兩類:併發型模式和執行緒池模式。