優化篇
一、代碼優化
代碼結構層次的優化(目的:更加方便代碼的維護–可維護性,可讀性)
1.代碼註釋(代碼規範)
2.工具類的封裝(方便代碼的維護,使代碼結構更加清晰不臃腫,保證團隊裡代碼 質量一致性)
3.公共部分的提取
代碼性能的優化(目的:使程序的性能最優化)
1.使用一些性能比較高的類(bufferInputStream)
2.緩衝區塊的大小(4k或者8k)
3.公共部分的提取
4.通常要用stringbuffer替代string加號拼接
二、業務優化
我們做項目的時候業務優化這方面最主要是從用戶體驗度角度進行考慮,減少用戶操 作的步驟提高工作效率,通常有以下幾種:
1.可以通過tabindex屬性來改變tab鍵盤的操作順序
2.可以通過回車鍵來進行搜索或者提交操作
3.對於單選按鈕和複選按鈕可以通過操作後面的文本來選擇前面的單選按鈕以及複選 按鈕
4.添加的信息要按照id倒序進行排列
5.進行搜索操作時加入js loading操作(不僅告訴用戶所進行的請求正在被處理,而 且防止用戶多次點擊提交操作)
6.當進行刪除操作的時候要彈出提示框,警告用戶要進行刪除操作,是否確認。
7.根據returnURL在用戶登錄成功後直接跳到想要訪問的資源。
8.進行刪除操作時通過confirm提示用戶是否確認刪除操作,操作完後提示操作是否 成功。
9.減少用戶操作的步驟
10.使用autocomplete插件快速進行搜索
必背,必做:
1.可以通過回車鍵來進行搜索或者提交操作
2.添加的信息要按照id倒序進行排列
3.進行搜索操作時加入js loading操作(不僅告訴用戶所進行的請求正在被處理,而且防止用戶多次點擊提交操作)
4.當進行刪除操作的時候要彈出提示框,警告用戶要進行刪除操作,是否確認,如果刪除成功則彈出提示框告訴用戶。
5.減少用戶操作的步驟
6.通過ztree,以及kindeiditor來提高用戶的體驗度
三、sql優化
1、SELECT子句中避免使用 *, 儘量應該根據業務需求按字段進行查詢
2、儘量多使用COMMIT如對大數據量的分段批量提交釋放了資源,減輕了服務器壓力
3、在寫sql語句的話,儘量保持每次查詢的sql語句字段用大寫,因為oracle總是先解析 sql語句,把小寫的字母轉換成大寫的再執行
4、用UNION-ALL 替換UNION,因為UNION-ALL不會過濾重複數據,所執行效率 要快於UNION,並且UNION可以自動排序,而UNION-ALL不會
5、避免在索引列上使用計算和函數,這樣索引就不能使用
Sql優化精簡版:
1.(重點)(必須說) SELECT語句中避免使用 *,
儘量應該根據業務需求按字段進行查詢
舉例:如果表中有個字段用的是clob或者是blob這種大數據字段的話,
他們的查詢應該根據業務需要來進行指定字段的查詢,切記勿直接用*
2.(重點) 刪除重複記錄(oracle):
最高效的刪除重複記錄方法 ( 因為使用了ROWID)例子:
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
- 用>=替換>
如一個表有100萬記錄,一個數值型字段A,
A=0時,有30萬條;
A=1時,有30萬條;
A=2時,有39萬條;
A=3時,有1萬記錄。
那麼執行 A>2 與 A>=3 的效果就有很大的區別了,因為 A>2 時,
ORACLE會先找出為2的記錄索引再進行比較,
而A>=3時ORACLE則直接找到=3的記錄索引。
4.(重點)儘量多使用COMMIT
如對大數據量的分段批量提交
- (重點)用NOT EXISTS 或(外連接+判斷為空)方案 替換 NOT IN操作符
此操作是強列推薦不使用的,因為它不能應用表的索引。
推薦方案:用NOT EXISTS 或(外連接+判斷為空)方案代替
6.(重點 必須說)LIKE操作符(大數據的全文檢索使用luncene)(solr)
因為使用like不當,會導致性能問題,原因是like在左右兩邊都有
%的時候,不會使用索引。
如LIKE ‘%5400%’ 這種查詢不會引用索引,
而LIKE ‘X5400%’ 則會引用範圍索引。
一個實際例子:
查詢營業編號 YY_BH LIKE ‘%5400%’ 這個條件會產生全表掃描,
如果改成 YY_BH LIKE ‘X5400%’ OR YY_BH LIKE ‘B5400%’
則會利用 YY_BH 的索引進行兩個範圍的查詢,性能肯定大大提高。
7.(重點,必須說)避免在索引列上使用計算和函數,這樣索引就不能使用
舉例:
低效:
SELECT … FROM DEPT WHERE SAL * 12 > 25000;
高效:
SELECT … FROM DEPT WHERE SAL > 25000/12;
8.(重點 必須說)用UNION-ALL 替換UNION,
因為UNION-ALL不會過濾重複數據而且不會自動排序,
所執行效率要快於UNION。
- (優化,重點,3個方面 a.緩存 b.分段批量 c.存儲過程)減少訪問數據庫的次數
- 舉例:如果批量刪除多條數據,可以用 delete from tableName where id
- in (1,2,3)
- 而不要用多條delete語句進行刪除
10.(重點 必須說)用TRUNCATE替代DELETE TRUNCATE不記錄日誌,DELETE記錄日誌,所以TRUNCATE要快於DELETE但是一旦用TRUNCATE進行刪除就不能進行恢復,TRUNCATE是刪除整張表的數據不能加where條件。
mysql,sqlserver中如果
id為自增類型,那麼如果用TRUNCATE刪除,則id字段再插入數據時從1開始,
如果delete刪除的話,則從刪除之前的id的值繼續增長。
四、防sql注入
針對防sql注入,我們通常是這樣做的:
首先在前臺頁面對用戶輸入信息進行js驗證,對一些特殊字符進行屏蔽,比如:or ,單引號,–,= ,還有就是限制用戶名輸入的長度,我們一般將其限制在6—13位。另外,對於用戶的敏感信息我們進行Md5加密,
還有,為了增加用戶體驗度和用戶友好度,為了不使用戶看到一些詳細的異常信息我們會進行錯誤信息頁面的定製,像404,500錯誤。另一個我層面講,這樣做也是為了保護我們的一些重要信息。此外,我們會給特定的人分配定定的權限,而不是給其分配管理員權限!
sql注入
所謂SQL注入,就是通過一些含有特殊字符的sql語句發送到服務器欺騙服務器並進行攻擊。(特殊字符:or, 單引號,–,空格)
Sql注入的防護
1.永遠不要信任用戶的輸入。對用戶的輸入進行校驗,可以通過正則表達式(js正則或者java後臺正則),或限制長度;對單引號和雙"-"進行轉換等。
2.永遠不要使用動態拼裝sql,使用參數化的sql。(永遠不要使用+號拼接sql字符串,而是使用?傳參的方式進行)
3.不要給用戶太高的權限而根據需求進行賦權
4.對敏感信息進行加密 如md5(單向加密不可逆轉)。
5.自定義錯誤頁面。目的是為了不把我們的程序的bug暴露在別有用心的人的面前。而去不會讓用戶看到報錯的頁面,也提高了用戶的體驗度。
SQL注入防範
使用參數化的過濾性語句
要防禦SQL注入,用戶的輸入就絕對不能直接被嵌入到SQL語句中。恰恰相反,用戶的輸入必須進行過濾,或者使用參數化的語句。參數化的語句使用參數而不是將用戶輸入嵌入到語句中。在多數情況中,SQL語句就得以修正。然後,用戶輸入就被限於一個參數。
輸入驗證
檢查用戶輸入的合法性,確信輸入的內容只包含合法的數據。數據檢查應當在客戶端和服務器端(java代碼)都執行之所以要執行服務器端驗證,是為了彌補客戶端驗證機制脆弱的安全性。
在客戶端,攻擊者完全有可能獲得網頁的源代碼,修改驗證合法性的腳本(或者直接刪除腳本),然後將非法內容通過修改後的表單提交給服務器。因此,要保證驗證操作確實已經執行,唯一的辦法就是在服務器端也執行驗證。你可以使用許多內建的驗證對象,例如Regular Expression Validator,它們能夠自動生成驗證用的客戶端腳本,當然你也可以插入服務器端的方法調用。如果找不到現成的驗證對象,你可以通過Custom Validator自己創建一個。
錯誤消息處理
防範SQL注入,還要避免出現一些詳細的錯誤消息,因為黑客們可以利用這些消息。要使用一種標準的輸入確認機制來驗證所有的輸入數據的長度、類型、語句、企業規則等。
加密處理
將用戶登錄名稱、密碼等數據加密保存。加密用戶輸入的數據,然後再將它與數據庫中保存的數據比較,這相當於對用戶輸入的數據進行了“消毒”處理,用戶輸入的數據不再對數據庫有任何特殊的意義,從而也就防止了攻擊者注入SQL命令。
存儲過程來執行所有的查詢
SQL參數的傳遞方式將防止攻擊者利用單引號和連字符實施攻擊。此外,它還使得數據庫權限可以限制到只允許特定的存儲過程執行,所有的用戶輸入必須遵從被調用的存儲過程的安全上下文,這樣就很難再發生注入式攻擊了。
使用專業的漏洞掃描工具
攻擊者們目前正在自動搜索攻擊目標並實施攻擊,其技術甚至可以輕易地被應用於其它的Web架構中的漏洞。企業應當投資於一些專業的漏洞掃描工具,如大名鼎鼎的Acunetix的Web漏洞掃描程序等。一個完善的漏洞掃描程序不同於網絡掃描程序,它專門查找網站上的SQL注入式漏洞。最新的漏洞掃描程序可以查找最新發現的漏洞。
確保數據庫安全
鎖定你的數據庫的安全,只給訪問數據庫的web應用功能所需的最低的權限,撤銷不必要的公共許可,使用強大的加密技術來保護敏感數據並維護審查跟蹤。如果web應用不需要訪問某些表,那麼確認它沒有訪問這些表的權限。如果web應用只需要只讀的權限,那麼就禁止它對此表的 drop 、insert、update、delete 的權限,並確保數據庫打了最新補丁。
安全審評
在部署應用系統前,始終要做安全審評。建立一個正式的安全過程,並且每次做更新時,要對所有的編碼做審評。開發隊伍在正式上線前會做很詳細的安全審評,然後在幾周或幾個月之後他們做一些很小的更新時,他們會跳過安全審評這關, “就是一個小小的更新,我們以後再做編碼審評好了”。請始終堅持做安全審評。
五、數據庫中常用術語:
ddl:數據定義語言 Create Drop Alter
dml:數據操縱語言 insert update delete select
dcl:數據控制語言 grant revoke
tcl:事務控制語言 commit rollback
深入java虛擬機以及大數據
1.jvm的相關概念
當List放了大量的數據超過jvm中所能容納的內存後,就會發生堆溢出。
當遞歸調用沒有臨界退出條件就會出現 棧溢出。
當批量導入大量數據或者用dom4j解析大的xml文件的時候,會出現 堆溢出,這個時候可以通過分段批量提交以及用sax代替dom4j來解決問題。
heap(堆),stack(棧)
jvm的結構細分及其概述?
Java 虛擬機有一個堆,堆是運行時數據區域,所有類實例和數組的內存均從此處分配。堆是在 Java 虛擬機啟動時創建的。”
“在JVM中堆之外的內存稱為非堆內存(Non-heap memory)”。可以看出JVM主要管理兩種類型的內存:堆和非堆。簡單來說堆就是Java代碼可及的內存,是留給開發人員使用的;非堆就是JVM留給自己用的。
jvm 內存結構?
堆: 邏輯上是連續,物理上可以處於不連續的內存空間中,裡面存儲的是對象實例以及數組。可以細分為新生代,老生代。通過-Xmx和-Xms控制大小。
虛擬機棧:基本數據類型,對象引用(地址,指針)。
本地方法棧(瞭解):它與虛擬機棧發揮的作用差不多,區別在於虛擬機棧為java方法的執行提供服務,而本地方法棧為虛擬機使用到的Native(本地)方法服務。
方法區:放了所加載的類的信息(名稱、修飾符等)、類中的靜態變量、類中定義為final類型的常量、類中的Field信息、類中的方法信息在Sun JDK中這塊區域對應的為PermanetGeneration,又稱為持久代,默認為64M,可通過-XX:PermSize以及-XX:MaxPermSize來指定其大小
在服務器啟動的時候報內存溢出是因為方法區太小,也就相當於持久代的內存太小。
通過-XX:PermSize以及-XX:MaxPermSize來指定其大小,可以解決這個問題。
常量池是方法區的一部分,用來存儲常量信息。如String就存儲在常量池中。
計數器(瞭解):通過該計數器的值來選取下一條要執行的字節碼指令。
GC是什麼,為什麼要有GC?
GC就是垃圾回收,java這種語言是動態分配內存大小的,並且依靠垃圾回收機制來完成對分配內存空間的回收,從而來避免內存溢出的問題,也在一定程度上降低了程序員工作的複雜度。
jvm中的GC採用了generation(分代回收)算法,
因為大多數的對象存活的時間比較短,而少部分的對象才能夠長時間存活。因此,jvm將堆內存劃分為年輕代(young generation)和年老代(old generation)。年輕代中的對象通常建立時間不久,且大部分生命週期也很短;年老代中的對象則已經創建比較久了,其聲明週期也相對年輕代比較長。
按照上面的劃分,jvm在做GC時也進行了區別對待,對年輕代GC會相對比較頻繁,且採用了copying(複製)算法;年老代的GC相對比較少,且採用的是tracing算法的一種,是標記-清除-壓縮。
JVM內存限制(最大值)
JVM內存的最大值跟操作系統有很大的關係。
簡單的說就32位處理器雖然 可控內存空間有4GB,
但是具體的操作系統會給一個限制,這個限制一般是2GB-3GB(一般來說Windows系統下為1.5G-2G,Linux系統 下為2G-3G),而64bit以上的處理器就不會有限制了。
Java 監視和管理控制檯:
JConsole 使您能夠在運行時監視各種 JVM 資源統計信息。
這種特性特別適用於檢測死鎖、內存洩漏。
它可以連接到一個本地或遠程 JVM 並可用來進行監視:
線程狀態(包括相關的鎖)
內存使用情況
垃圾收集
運行時信息
JVM 信息
jvm的調優?
開啟-Server模式,增大堆的大小,以及持久代的大小,從而
提高程序的運行效率,並且將初始堆大小和最大堆大小設置為
一樣的值從而避免了堆增長會帶來額外壓力。持久代大小的設置
同理,也設置為初始大小和最大大小一樣大。
jvm的類加載機制? jvm中類的生命週期?
生命週期:加載、連接、初始化,使用,卸載
優化篇
一、代碼優化
代碼結構層次的優化(目的:更加方便代碼的維護–可維護性,可讀性)
1.代碼註釋(代碼規範)
2.工具類的封裝(方便代碼的維護,使代碼結構更加清晰不臃腫,保證團隊裡代碼 質量一致性)
3.公共部分的提取
代碼性能的優化(目的:使程序的性能最優化)
1.使用一些性能比較高的類(bufferInputStream)
2.緩衝區塊的大小(4k或者8k)
3.公共部分的提取
4.通常要用stringbuffer替代string加號拼接
二、業務優化
我們做項目的時候業務優化這方面最主要是從用戶體驗度角度進行考慮,減少用戶操 作的步驟提高工作效率,通常有以下幾種:
1.可以通過tabindex屬性來改變tab鍵盤的操作順序
2.可以通過回車鍵來進行搜索或者提交操作
3.對於單選按鈕和複選按鈕可以通過操作後面的文本來選擇前面的單選按鈕以及複選 按鈕
4.添加的信息要按照id倒序進行排列
5.進行搜索操作時加入js loading操作(不僅告訴用戶所進行的請求正在被處理,而 且防止用戶多次點擊提交操作)
6.當進行刪除操作的時候要彈出提示框,警告用戶要進行刪除操作,是否確認。
7.根據returnURL在用戶登錄成功後直接跳到想要訪問的資源。
8.進行刪除操作時通過confirm提示用戶是否確認刪除操作,操作完後提示操作是否 成功。
9.減少用戶操作的步驟
10.使用autocomplete插件快速進行搜索
必背,必做:
1.可以通過回車鍵來進行搜索或者提交操作
2.添加的信息要按照id倒序進行排列
3.進行搜索操作時加入js loading操作(不僅告訴用戶所進行的請求正在被處理,而且防止用戶多次點擊提交操作)
4.當進行刪除操作的時候要彈出提示框,警告用戶要進行刪除操作,是否確認,如果刪除成功則彈出提示框告訴用戶。
5.減少用戶操作的步驟
6.通過ztree,以及kindeiditor來提高用戶的體驗度
三、sql優化
1、SELECT子句中避免使用 *, 儘量應該根據業務需求按字段進行查詢
2、儘量多使用COMMIT如對大數據量的分段批量提交釋放了資源,減輕了服務器壓力
3、在寫sql語句的話,儘量保持每次查詢的sql語句字段用大寫,因為oracle總是先解析 sql語句,把小寫的字母轉換成大寫的再執行
4、用UNION-ALL 替換UNION,因為UNION-ALL不會過濾重複數據,所執行效率 要快於UNION,並且UNION可以自動排序,而UNION-ALL不會
5、避免在索引列上使用計算和函數,這樣索引就不能使用
Sql優化精簡版:
1.(重點)(必須說) SELECT語句中避免使用 *,
儘量應該根據業務需求按字段進行查詢
舉例:如果表中有個字段用的是clob或者是blob這種大數據字段的話,
他們的查詢應該根據業務需要來進行指定字段的查詢,切記勿直接用*
2.(重點) 刪除重複記錄(oracle):
最高效的刪除重複記錄方法 ( 因為使用了ROWID)例子:
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
- 用>=替換>
如一個表有100萬記錄,一個數值型字段A,
A=0時,有30萬條;
A=1時,有30萬條;
A=2時,有39萬條;
A=3時,有1萬記錄。
那麼執行 A>2 與 A>=3 的效果就有很大的區別了,因為 A>2 時,
ORACLE會先找出為2的記錄索引再進行比較,
而A>=3時ORACLE則直接找到=3的記錄索引。
4.(重點)儘量多使用COMMIT
如對大數據量的分段批量提交
- (重點)用NOT EXISTS 或(外連接+判斷為空)方案 替換 NOT IN操作符
此操作是強列推薦不使用的,因為它不能應用表的索引。
推薦方案:用NOT EXISTS 或(外連接+判斷為空)方案代替
6.(重點 必須說)LIKE操作符(大數據的全文檢索使用luncene)(solr)
因為使用like不當,會導致性能問題,原因是like在左右兩邊都有
%的時候,不會使用索引。
如LIKE ‘%5400%’ 這種查詢不會引用索引,
而LIKE ‘X5400%’ 則會引用範圍索引。
一個實際例子:
查詢營業編號 YY_BH LIKE ‘%5400%’ 這個條件會產生全表掃描,
如果改成 YY_BH LIKE ‘X5400%’ OR YY_BH LIKE ‘B5400%’
則會利用 YY_BH 的索引進行兩個範圍的查詢,性能肯定大大提高。
7.(重點,必須說)避免在索引列上使用計算和函數,這樣索引就不能使用
舉例:
低效:
SELECT … FROM DEPT WHERE SAL * 12 > 25000;
高效:
SELECT … FROM DEPT WHERE SAL > 25000/12;
8.(重點 必須說)用UNION-ALL 替換UNION,
因為UNION-ALL不會過濾重複數據而且不會自動排序,
所執行效率要快於UNION。
- (優化,重點,3個方面 a.緩存 b.分段批量 c.存儲過程)減少訪問數據庫的次數
- 舉例:如果批量刪除多條數據,可以用 delete from tableName where id
- in (1,2,3)
- 而不要用多條delete語句進行刪除
10.(重點 必須說)用TRUNCATE替代DELETE TRUNCATE不記錄日誌,DELETE記錄日誌,所以TRUNCATE要快於DELETE但是一旦用TRUNCATE進行刪除就不能進行恢復,TRUNCATE是刪除整張表的數據不能加where條件。
mysql,sqlserver中如果
id為自增類型,那麼如果用TRUNCATE刪除,則id字段再插入數據時從1開始,
如果delete刪除的話,則從刪除之前的id的值繼續增長。
四、防sql注入
針對防sql注入,我們通常是這樣做的:
首先在前臺頁面對用戶輸入信息進行js驗證,對一些特殊字符進行屏蔽,比如:or ,單引號,–,= ,還有就是限制用戶名輸入的長度,我們一般將其限制在6—13位。另外,對於用戶的敏感信息我們進行Md5加密,
還有,為了增加用戶體驗度和用戶友好度,為了不使用戶看到一些詳細的異常信息我們會進行錯誤信息頁面的定製,像404,500錯誤。另一個我層面講,這樣做也是為了保護我們的一些重要信息。此外,我們會給特定的人分配定定的權限,而不是給其分配管理員權限!
sql注入
所謂SQL注入,就是通過一些含有特殊字符的sql語句發送到服務器欺騙服務器並進行攻擊。(特殊字符:or, 單引號,–,空格)
Sql注入的防護
1.永遠不要信任用戶的輸入。對用戶的輸入進行校驗,可以通過正則表達式(js正則或者java後臺正則),或限制長度;對單引號和雙"-"進行轉換等。
2.永遠不要使用動態拼裝sql,使用參數化的sql。(永遠不要使用+號拼接sql字符串,而是使用?傳參的方式進行)
3.不要給用戶太高的權限而根據需求進行賦權
4.對敏感信息進行加密 如md5(單向加密不可逆轉)。
5.自定義錯誤頁面。目的是為了不把我們的程序的bug暴露在別有用心的人的面前。而去不會讓用戶看到報錯的頁面,也提高了用戶的體驗度。
SQL注入防範
使用參數化的過濾性語句
要防禦SQL注入,用戶的輸入就絕對不能直接被嵌入到SQL語句中。恰恰相反,用戶的輸入必須進行過濾,或者使用參數化的語句。參數化的語句使用參數而不是將用戶輸入嵌入到語句中。在多數情況中,SQL語句就得以修正。然後,用戶輸入就被限於一個參數。
輸入驗證
檢查用戶輸入的合法性,確信輸入的內容只包含合法的數據。數據檢查應當在客戶端和服務器端(java代碼)都執行之所以要執行服務器端驗證,是為了彌補客戶端驗證機制脆弱的安全性。
在客戶端,攻擊者完全有可能獲得網頁的源代碼,修改驗證合法性的腳本(或者直接刪除腳本),然後將非法內容通過修改後的表單提交給服務器。因此,要保證驗證操作確實已經執行,唯一的辦法就是在服務器端也執行驗證。你可以使用許多內建的驗證對象,例如Regular Expression Validator,它們能夠自動生成驗證用的客戶端腳本,當然你也可以插入服務器端的方法調用。如果找不到現成的驗證對象,你可以通過Custom Validator自己創建一個。
錯誤消息處理
防範SQL注入,還要避免出現一些詳細的錯誤消息,因為黑客們可以利用這些消息。要使用一種標準的輸入確認機制來驗證所有的輸入數據的長度、類型、語句、企業規則等。
加密處理
將用戶登錄名稱、密碼等數據加密保存。加密用戶輸入的數據,然後再將它與數據庫中保存的數據比較,這相當於對用戶輸入的數據進行了“消毒”處理,用戶輸入的數據不再對數據庫有任何特殊的意義,從而也就防止了攻擊者注入SQL命令。
存儲過程來執行所有的查詢
SQL參數的傳遞方式將防止攻擊者利用單引號和連字符實施攻擊。此外,它還使得數據庫權限可以限制到只允許特定的存儲過程執行,所有的用戶輸入必須遵從被調用的存儲過程的安全上下文,這樣就很難再發生注入式攻擊了。
使用專業的漏洞掃描工具
攻擊者們目前正在自動搜索攻擊目標並實施攻擊,其技術甚至可以輕易地被應用於其它的Web架構中的漏洞。企業應當投資於一些專業的漏洞掃描工具,如大名鼎鼎的Acunetix的Web漏洞掃描程序等。一個完善的漏洞掃描程序不同於網絡掃描程序,它專門查找網站上的SQL注入式漏洞。最新的漏洞掃描程序可以查找最新發現的漏洞。
確保數據庫安全
鎖定你的數據庫的安全,只給訪問數據庫的web應用功能所需的最低的權限,撤銷不必要的公共許可,使用強大的加密技術來保護敏感數據並維護審查跟蹤。如果web應用不需要訪問某些表,那麼確認它沒有訪問這些表的權限。如果web應用只需要只讀的權限,那麼就禁止它對此表的 drop 、insert、update、delete 的權限,並確保數據庫打了最新補丁。
安全審評
在部署應用系統前,始終要做安全審評。建立一個正式的安全過程,並且每次做更新時,要對所有的編碼做審評。開發隊伍在正式上線前會做很詳細的安全審評,然後在幾周或幾個月之後他們做一些很小的更新時,他們會跳過安全審評這關, “就是一個小小的更新,我們以後再做編碼審評好了”。請始終堅持做安全審評。
五、數據庫中常用術語:
ddl:數據定義語言 Create Drop Alter
dml:數據操縱語言 insert update delete select
dcl:數據控制語言 grant revoke
tcl:事務控制語言 commit rollback
深入java虛擬機以及大數據
1.jvm的相關概念
當List放了大量的數據超過jvm中所能容納的內存後,就會發生堆溢出。
當遞歸調用沒有臨界退出條件就會出現 棧溢出。
當批量導入大量數據或者用dom4j解析大的xml文件的時候,會出現 堆溢出,這個時候可以通過分段批量提交以及用sax代替dom4j來解決問題。
heap(堆),stack(棧)
jvm的結構細分及其概述?
Java 虛擬機有一個堆,堆是運行時數據區域,所有類實例和數組的內存均從此處分配。堆是在 Java 虛擬機啟動時創建的。”
“在JVM中堆之外的內存稱為非堆內存(Non-heap memory)”。可以看出JVM主要管理兩種類型的內存:堆和非堆。簡單來說堆就是Java代碼可及的內存,是留給開發人員使用的;非堆就是JVM留給自己用的。
jvm 內存結構?
堆: 邏輯上是連續,物理上可以處於不連續的內存空間中,裡面存儲的是對象實例以及數組。可以細分為新生代,老生代。通過-Xmx和-Xms控制大小。
虛擬機棧:基本數據類型,對象引用(地址,指針)。
本地方法棧(瞭解):它與虛擬機棧發揮的作用差不多,區別在於虛擬機棧為java方法的執行提供服務,而本地方法棧為虛擬機使用到的Native(本地)方法服務。
方法區:放了所加載的類的信息(名稱、修飾符等)、類中的靜態變量、類中定義為final類型的常量、類中的Field信息、類中的方法信息在Sun JDK中這塊區域對應的為PermanetGeneration,又稱為持久代,默認為64M,可通過-XX:PermSize以及-XX:MaxPermSize來指定其大小
在服務器啟動的時候報內存溢出是因為方法區太小,也就相當於持久代的內存太小。
通過-XX:PermSize以及-XX:MaxPermSize來指定其大小,可以解決這個問題。
常量池是方法區的一部分,用來存儲常量信息。如String就存儲在常量池中。
計數器(瞭解):通過該計數器的值來選取下一條要執行的字節碼指令。
GC是什麼,為什麼要有GC?
GC就是垃圾回收,java這種語言是動態分配內存大小的,並且依靠垃圾回收機制來完成對分配內存空間的回收,從而來避免內存溢出的問題,也在一定程度上降低了程序員工作的複雜度。
jvm中的GC採用了generation(分代回收)算法,
因為大多數的對象存活的時間比較短,而少部分的對象才能夠長時間存活。因此,jvm將堆內存劃分為年輕代(young generation)和年老代(old generation)。年輕代中的對象通常建立時間不久,且大部分生命週期也很短;年老代中的對象則已經創建比較久了,其聲明週期也相對年輕代比較長。
按照上面的劃分,jvm在做GC時也進行了區別對待,對年輕代GC會相對比較頻繁,且採用了copying(複製)算法;年老代的GC相對比較少,且採用的是tracing算法的一種,是標記-清除-壓縮。
JVM內存限制(最大值)
JVM內存的最大值跟操作系統有很大的關係。
簡單的說就32位處理器雖然 可控內存空間有4GB,
但是具體的操作系統會給一個限制,這個限制一般是2GB-3GB(一般來說Windows系統下為1.5G-2G,Linux系統 下為2G-3G),而64bit以上的處理器就不會有限制了。
Java 監視和管理控制檯:
JConsole 使您能夠在運行時監視各種 JVM 資源統計信息。
這種特性特別適用於檢測死鎖、內存洩漏。
它可以連接到一個本地或遠程 JVM 並可用來進行監視:
線程狀態(包括相關的鎖)
內存使用情況
垃圾收集
運行時信息
JVM 信息
jvm的調優?
開啟-Server模式,增大堆的大小,以及持久代的大小,從而
提高程序的運行效率,並且將初始堆大小和最大堆大小設置為
一樣的值從而避免了堆增長會帶來額外壓力。持久代大小的設置
同理,也設置為初始大小和最大大小一樣大。
jvm的類加載機制? jvm中類的生命週期?
生命週期:加載、連接、初始化,使用,卸載
對象基本上都是在jvm的堆區中創建,在創建對象之前,
會觸發類加載(加載、連接、初始化),
當類初始化完成後,
根據類信息在堆中實例化類對象,
初始化非靜態變量、非靜態代碼以及默認構造方法,
當對象使用完之後會在合適的時候被jvm垃圾收集器回收。
要經過三步:加載(Load),鏈接(Link),初始化(Initializ)。
其中鏈接又可分為校驗(Verify),準備(Prepare),解析(Resolve)三步。
ClassLoader就是用來裝載的。通過指定的className,找到二進制碼,
生成Class實例,放到JVM中。
ClassLoader從頂向下分為 :
Bootstrap ClassLoader:引導類加載器,
它負責加載Java的核心類(如rt.jar)
Extension ClassLoader:擴展類加載器,
它負責加載JRE的擴展目錄
(JAVA_HOME/jre/lib/ext)中的JAR包
System ClassLoader:系統(也稱為應用)類加載器,
它負責在JVM被啟動時加載來自在命令java中的-classpath
中的JAR包
User-Defined ClassLoader:用戶自定義的類加載器
linux中的命令:
ps -ef | grep :查看進程信息
vi:文件編輯命令
more:分頁查看命令
top:常用的性能分析工具,能夠實時顯示系統中各個進程的資源佔用狀況
ifconfig:顯示或配置網絡設備的命令
ping:它通常用來測試與目標主機的連通性
rsync、scp:文件同步命令
2.雲計算+大數據的具體技術實現方案:
Hadoop是一個能夠對大量數據進行分佈式處理的軟件框架。
它以並行的方式工作,通過並行處理加快處理速度,
維護多個工作數據副本,
具有可伸縮性,能夠處理 PB 級數據.
hadoop 由許多元素構成。其最底部是HDFS,
它存儲 Hadoop 集群中所有存儲節點上的文件。
HDFS的上一層是MapReduce 引擎.
hadoop下的子項目:
HDFS:Hadoop分佈式文件系統
MapReduce:並行計算框架(建立在HDFS上的)
HBase: 類似Google BigTable的分佈式NoSQL 列數據庫
Hive:數據倉庫工具
Zookeeper:分佈式鎖設施
Pig: 大數據分析平臺,為用戶提供多種接口
行業知識(瞭解):
存儲容量:是該存儲設備上可以存儲數據的最大數量,通常使用千字節(kb kilobyte)、兆字節(MB megabyte)、吉字節(GB, gigabyte)、太字節(TB ,terabyte)和PB(Petabyte)、EB(Exabyte)等來衡量。
1KB=2(10)B=1024B; 括號中的數字為2的指數(即多少次方)
1MB=2(10)KB=1024KB=2(20)B;
1GB=2(10)MB=1024MB=2(30)B。
1TB=2(10) GB=1024GB=2(40)B
1PB=2(10) TB=1024TB=2(50)B
1EB=2(10) PB=1024PB=2(60)B
1Byte(相當於一個英文字母,您的名字相當6Bytes(6B)。
Kilobyte(KB)=1024B相當於一則短篇故事的內容。
Megabyte(MB)=l024KB相當於一則短篇小說的文字內容。
Gigabyte(GB)=1024MB相當於貝多芬第五樂章交響曲的樂譜內容。
Terabyte(TB)=1024GB相當於一家大型醫院中所有的X光圖片資訊量。
Petabyte(PB)=l024TB相當於50%的全美學術研究圖書館藏書資訊內容。
Exabyte (EB)=1024PB;5EB相當於至今全世界人類所講過的話語。
Zettabyte(ZB)=1024EB如同全世界海灘上的沙子數量總和。
Yottabyte(YB)=1024ZB相當於7000位人類體內的微細胞總和。