一個java進程發生了OOM后,該進程或服務一定會被殺死嗎
不一定。
一個線程OOM后,其他線程是可以正常運行的,但是內存泄露之后可能會導致整個程序內存溢出,最終程序不可用。
那么我們下面說一下,一個線程OOM了,為什么其他線程不受影響呢?
要回答這個問題,我們先來回想一下java的內存結構。如下圖所示:
我們知道,多線程的時候,每個線程都擁有一個棧和一個程序計數器。棧和程序計數器用來保存線程的執行歷史和線程的執行狀態,是線程私有的資源。堆是線程共享的,所以理論上一個線程OOM了,其他線程應該受影響才對啊,實際上卻并不是,這是什么原因呢?
有興趣的可以按照我下面的這段代碼自己去跑一下,測試一下這個內存溢出。
然后結合JvisualVM工具,你會看到,在程序內存溢出之后,溢出的內存的線程所占的內存會被快速釋放。如下圖所示
根據上圖,我們可以得出當一個線程拋出OOM異常后,它所占據的內存資源會被快速的釋放掉,從而不會影響其他線程的運行!
另外當一個線程OutOfMemoryError后,如果這個OutOfMemoryError被捕獲,那么catch之后吞掉的話程序還能試著繼續運行。發生OutOfMemoryError之后,只是當前這個線程申請更多的內存的時候不被JVM允許,所以會拋出OutOfMemoryError異常。當拋出OutOfMemoryError異常后,當前這個線程會被退出,它所占的內存會被JVM清理掉。
那么JVM為什么要這么設計呢?
答案是,Java程序通常不是為了適應意外的異常而設計的,OOM之后可能導致應用狀態不一致,建議最好重啟。
Java學到哪才算入門
這是一個非常好的問題,作為一名IT從業者,同時也出版過Java編程書籍,所以我來回答一下。
首先,當前Java語言是一門非常典型的全場景編程語言,Java在Web開發、移動互聯網開發和大數據開發領域都有比較廣泛的應用,由于Java語言自身的生態體系比較健全,所以采用Java語言來進行項目開發也會在一定程度上降低項目開發風險。
對于Java初學者來說,通常會面臨一個問題,那就是學習到什么階段才算入門,才能夠進入實習崗位積累更多的實踐經驗。從Java語言本身的技術體系結構來看,要想達到入門標準,至少應該掌握以下幾個方面的知識:
第一:建立初步的Java編程思想。Java編程思想的建立需要經過三個階段,其一是掌握Java語言的基本抽象概念,涉及到類和接口兩個重要的主線;其二是掌握Java編程過程;其三是掌握Java編程的各種特征,包括封裝、繼承、多態等等。
第二:掌握常見的編程模式。Java語言的初學者要想快速成長,一定要重視對于編程模式的掌握,掌握了一些經典的Java編程模式,能夠在很大程度上幫助初學者構建出穩定可用的程序。Java編程模式已經比較成熟了,在學習的過程中也有大量的資料可以參考。
第三:能夠完成一些基本的功能模塊開發。基于Java來完成功能模塊開發是初學者入門的重要標志,要想具備功能模塊開發能力需要掌握Java開發框架和數據庫等知識。對于初學者來說,當前可以重點關注一下Spring系列框架,比如SpringBoot就比較簡單易用,而數據庫知識可以重點關注一下Sql語言的學習。
我從事互聯網行業多年,目前也在帶計算機專業的研究生,主要的研究方向集中在大數據和人工智能領域,我會陸續寫一些關于互聯網技術方面的文章,感興趣的朋友可以關注我,相信一定會有所收獲。
如果有互聯網、大數據、人工智能等方面的問題,或者是考研方面的問題,都可以在評論區留言,或者私信我!
有人說Java已經爛大街了,還有發展前景嗎
無論是科班生、自學、培訓這都是Java學習途徑之一,確實現在一說是培訓機構出身hr就不愿意要,可能連一面都夠不到,也別灰心,把自身的編程技術提高,多練項目,優化在簡歷上,工作機會這么多,總有hr看得到,是金子總會發光的!
按照下面的學習路線學到最后就可以去面試找工作了!
第一部分:JavaSE:Java語言最基本的一套庫
學習JavaEE或JavaME之前,JavaSE是必學的。
*Java開發環境搭建
*Java基礎語法
*面向對象
*數組
*異常
*集合
*線程
*IO流
*反射機制
*注解Annotation
*網絡編程
第二部分:數據庫【MySQL+JDBC】
*只要學習編程,數據庫是一定要學習的,是一門公共的學科。
*java、C、python、C#等程序員都需要學習數據庫。
*數據庫產品很多:MySQL、Oracle、SqlServer、DB2......
*我們動力節點數據庫課程包括:MySQL+Oracle
*Oracle:銀行、政府使用oracle的較多。
*MySQL:互聯網公司、一般企業使用MySQL較多。
*Oracle我們是提供視頻的。課堂上不講。
*我們課堂上講MySQL。
*Java語言鏈接數據庫:JDBC
第三部分:WEB前端
*系統結構:B/S【Browser/Server】C/S【Client/Server】
*WEB是網站的意思。WEB前端是:網站當中的頁面。
*WEB前端程序是運行在瀏覽器當中的。
*HTML5+CSS3+JavaScript(JS)
*WEB前端也有很多框架:
-jQuery
-Bootstrap
-Vue
-NodeJS
-AugularJS
-RectJS
-LayUI
-EasyUI
.....
第四部分:JavaWEB
*Servlet
*JSP
*AJAX(是JavaScript的一部分語法,專門做頁面局部刷新)
第五部分:JavaWEB項目
*做一個B/S結構的項目,將WEB前端和JavaWEB內容做一個整合練習。
*其實到這里為止,所有的系統都可以做了。但是用的技術很Low。沒有用框架。
Java包括什么
經過20多年的發展Java從最初嵌入在網頁中的Applet發展到幾乎各個開發領域,包括Web解決方案、大數據、人工智能、移動互聯網、物聯網、云計算等等。所以目前Java成為了程序員必須掌握的開發語言之一,相信在未來很長一段時間內,Java依然會是一門被廣泛使用的開發語言。
那么Java到底包括哪些內容呢?答案首先要到Java的官方資料中查找。
這是Java官方給出的Java技術提綱,下面對這里面的技術進行分別解讀:
JavaSE這是很多初學者最初學習Java就接觸的內容,簡單的說就是Java的標準版,也是很多其他版本的母版(基礎版),JavaSE是學習Java技術的第一步,目前已經更新到Java10版本。
這一部分從創建一個基本的Java類開始,描述Java面向對象編程的核心概念以及編程過程:類的設計、對象的創建、方法的調用。細節包括類、對象、屬性、方法、封裝、繼承、多態、異常、集合、線程等,也包括一些諸如java.time包中的類如何使用,以及如何部署Java程序。
這一部分主要講解如何使用Swing和JavaFX,這兩個技術是目前使用Java做圖形用戶界面的主要解決方案。JavaFX出現的時間較晚,很多使用JavaFX的程序員對這個技術的評價還是非常不錯的,隨著版本的更新,相信JavaFX將會得到更好的發展(我之前的文章中有針對JavaFX的詳細介紹)。Swing是在AWT基礎上開發的輕量級GUI解決方案,圖形組件采用了MVC結構,操作簡單且功能強大,唯一的遺憾是速度偏慢。
這部分涵蓋了JavaSE中的諸多細節,包括網絡編程、平臺適配、JavaBeans、JDBC、JMX、JNDI、JAXP、JAXB、RMI、反射、安全、多媒體等內容。這里面每一個內容都需要寫上一本書才能完全講解清楚,包含的細節也非常多,這里面的RMI是Java分布式編程的基礎(我之前的文章中有關于RMI編程的細節描述),JDBC則是如何通過Java操作數據庫的API等等。
這里面涵蓋的技術在我之前的頭條文章中都幾乎有所涉及,感興趣的朋友可以關注一下。
JavaEEJavaEE此前一直是官方主推的企業級Java解決方案,里面涵蓋了大量企業級開發的API,目前Oracle公司已經把JavaEE交給Eclipse基金會來管理了,已經改名為JakartaEE了,也許未來EE版會帶來更多改變。雖然已經脫離了官方陣營,今天也簡單描述一下JavaEE版都包含了哪些內容。
JavaEE版本涵蓋的主要內容是圍繞EJB展開的,Java官方為企業級開發提供了三種EJB方案,分別是會話Bean、實體Bean和消息驅動Bean。
圍繞這三種EJB企業可以開發出大用戶并發的安全的Java分布式平臺,當然性能以及事務處理等方面的優點是顯而易見的。
雖然Java官方為EJB付出了巨大的代價(人力、物力),但是市場對EJB并不是全盤接受,因為EJB太重了。Spring的出現使得EJB的地位非常尷尬,后來EJB的版本更新也借鑒了Spring的很多理念,但是EJB的基因太難改變了。
JavaMEME版本的出現時間并不晚,我在2004年的時候曾經短暫的使用過ME版本在Nokia的塞班平臺下進行程序開發。可以說當年的Sun公司對嵌入式設備的發展還是具備一定眼光的,只是當IOS和Android平臺出現的時候,JavaME多少顯得有些尷尬。
JavaME針對嵌入式設備進行了重寫,支持在嵌入式設備上運行Java應用。當年也確實有很多基于JavaME開發的嵌入式產品,大到美國發射的“勇氣號”太空車,小到工業機器人,目前JavaME的應用并不多,但是官方依然對JavaME抱有期望。
JavaCard、JavaTV、JavaDB關于JavaCard可能用過的人就更少了,但是在最初推出這個技術的時候,JavaCard為我們描繪了很多未來的應用場景(目前這些場景中的很多內容由智能手機完成了)。看一下JavaCard的官方定義:
可以說JavaCard在一些具體場景中還是有所應用的,比如通信領域和金融領域等對安全性有較高要求的領域。
看一下JavaTV的官方定義:
JavaTV的出現是數字化TV發展的必然結果,同樣,目前這部分市場被Android搶占的比較厲害,好在Android的應用開發也采用了Java語言。
看一下關于JavaDB的官方描述:
JavaDB是Java數據庫應用的一個方向,能在數據庫平臺上提供完全的Java支持。
以上就是Java包含的技術總結,當然,現在的Java已經不僅僅是Oracle公司的,全世界很多科技公司或組織都在開發基于Java的各種應用,所以Java已經不單純的是一門語言,更是一個平臺、橋梁和鏈條。
我在頭條上寫了關于Java技術的系列文章,感興趣的朋友可以關注一下,有問題可以一起交流。
參加java培訓都要注意些什么
現在的編程語言培訓有很多,去參加java培訓時小鼠給你以下建議:
1.培訓機構的真實性,因為現在的培訓機構很多,很難辨別真偽。
2.培訓結果的滿意度,往往推銷著的花言巧語總能使我們很容易上當,最后達不到自己的目標而無從后悔。
3.是否儲備有一定的相關知識,如學習編程時需要你有一定的數學知識,以便你更好的學習編程的算法及數據結構。
4.一顆吃苦耐勞的心,學習編程會很辛苦,你應當做好心里準備。
5.購買幾本關于java的學習書籍,如java進階書籍。
6.選擇好自己的學習方向,如是java的前端還是后端,有目的的去學會輕松點。
Java自學可以嗎
是的,自學Java是完全可能的。事實上,許多人都通過自學方式學會了Java編程語言。以下是一些關于自學Java的建議:
學習資料:Java有豐富的學習資料,包括在線教程、書籍、視頻課程等。您可以選擇一些權威且有結構化的學習資料,例如Oracle官方的Java教程,Java編程書籍,或者優質的在線編程學習平臺。
學習計劃:制定一個合理的學習計劃,包括學習的時間安排、學習的內容和學習的目標。Java是一門較為復雜的編程語言,因此需要耐心和持續的學習。
實踐項目:通過實踐項目來鞏固所學的知識。可以選擇一些簡單的Java項目來進行練習,例如編寫一個簡單的控制臺應用程序,或者實現一個小型的Java應用。
社區互助:參與Java編程社區,例如加入在線編程論壇、社交媒體群組或者參與開源項目。這可以幫助您與其他Java開發者互相學習和互相支持。
不斷練習和復習:Java編程需要不斷的練習和復習,特別是對于一些復雜的概念和語法規則。可以通過編寫小程序、解決編程問題和參與編程挑戰來不斷提高自己的編程技能。
持續學習:Java是一門不斷發展和演進的編程語言,因此持續學習是很重要的。可以關注Java社區的最新動態,學習最新的Java技術和編程實踐。
總的來說,自學Java是可行的,但需要耐心、毅力和持續的學習。合理的學習計劃、實踐項目、社區互助和持續學習都是幫助您成功自學Java的重要因素。