關於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種:工廠方法模式 抽象工廠模式 單例模式 建造模式 原型模式
結構型模式 共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、 組合模式、享元模式
行爲型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。
其實還有兩類:併發型模式和線程池模式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章