環境資訊中心綜合外電;黃鈺婷 編譯;林大利 審校
本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※超省錢租車方案
※別再煩惱如何寫文案,掌握八大原則!
※回頭車貨運收費標準
※教你寫出一流的銷售文案?
※產品缺大量曝光嗎?你需要的是一流包裝設計!
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
0L售價不到9萬元,而且作為一台豐田的硬派越野車,其可靠性之高是毋庸置疑的。只是作為一款十多年的老車,它將會面臨嚴峻的年檢考驗,甚至被納入黃標範圍無法上路。不過如果你已經有一台代步車,那麼買一台這樣的經典硬派越野車,只用作純粹的越野撒歡之用,其實也是挺不錯的。
10萬元以內,買什麼車好?很多年輕消費者都會在10萬元上下的價格區間選擇自己的第一台車,而很多時候他們都會把選擇範圍局限本田飛度、大眾polo、寶駿510這樣的熱門車型,但是如果我們將目光投向二手市場,也許我們會有驚喜發現哦!
MINI One 1.6L
MINI可以說是目前國內形象最個性最時尚的品牌之一,在目前的二手市場上,行駛里程在10萬公里左右的2011款MINI One售價約在9到10萬元,小巧個性的造型和動力表現還不錯的1.6L自然吸氣發動機很適合在城市作日常通勤用車。不過需要注意的是,雖然油液、濾芯等消耗品的常規保養項目成本不高,但MINI的零部件價格較高,一旦需要更換零件,還是需要花不少錢的。
薩博 9-5
一個當年以其飛機生產商出身而自豪的瑞典品牌,薩博9-5毫無疑問是一款極其獨特的中大型轎車。由於車型極其冷門,目前二手市場上哪怕是搭載高功率版本2.3T發動機的薩博9-5 Aero,售價也不過10萬元;不過車源稀少且市面上配件難找,後期維護保養比較麻煩。
克萊斯勒300C
如果說國內還有哪些車擁有典型的美式風格,那麼克萊斯勒300C毫無疑問是其中之一;平直的線條,巨大的鍍鉻中網,大尺寸輪圈和3.6L自然吸氣V6發動機,克萊斯勒如此“肌肉化”的外觀設計肯定會引來不少路人的目光。目前二手市場上的舊款克萊斯勒300C大多是較早的2004款車型,行駛里程都在10萬公里以上,售價在8到9萬元左右。對於這款典型的美式轎車,選擇它就意味着需要做好面對驚人油耗的準備。
豐田普拉多
除了每天的城市穿梭,當然也會有一部分人想要在閑暇時開着車到野外撒歡,那麼一台強大的越野車就是必不可少的穿越工具。豐田蘭德酷路澤系列的普拉多車型就是個不錯的選擇。目前二手市場上一台2001款的豐田普拉多4.0L售價不到9萬元,而且作為一台豐田的硬派越野車,其可靠性之高是毋庸置疑的;只是作為一款十多年的老車,它將會面臨嚴峻的年檢考驗,甚至被納入黃標範圍無法上路;不過如果你已經有一台代步車,那麼買一台這樣的經典硬派越野車,只用作純粹的越野撒歡之用,其實也是挺不錯的。
日產奇駿
當然,如果你需要一台平時也能用來代步的越野車,那麼2010款的日產奇駿就能幫到你了。目前市面上行駛里程在10萬公里左右的2010款日產奇駿,售價普遍在9萬元上下。
斯巴魯森林人
而除了日產奇駿之外,10萬元預算甚至能在二手市場找到一台2008款的斯巴魯森林人2.0XS!水平對置發動機搭配強大的全時四驅系統,斯巴魯森林人就是一款通過性出色,而且形象更加高檔的優秀SUV車型。
豐田凱美瑞
那麼如果你性格成熟穩重,而且想要更多的估計家庭需要,甚至想要有一些商務范,豐田凱美瑞就是個很不錯的選擇。10萬元預算,能夠在二手市場上找到車況不錯的舊款凱美瑞,2011款到2013款都有非常豐富的車源,能夠慢慢從中挑選車況優秀、價格合理的車源。
本田奧德賽
MpV是非常出色的家用車型,目前,只需10萬,就能買到一台行駛里程在10萬公里以內的舊款奧德賽。本田奧德賽是一款非常成功的家用MpV車型,由於舊款造型比較接近旅行車,奧德賽的外觀看上去不會顯得太過商務化,自己平日里開着上班也不會有濃重的“司機范”。
斯巴魯翼豹
說到激情,說到玩樂,有興趣的朋友可以在市場上尋找一下斯巴魯翼豹的身影,目前市面上價格在10萬元以內的斯巴魯翼豹大多是搭載EJ20自然吸氣發動機和手自一體變速箱的版本,因此購買后還需多花點心思在後期改裝部分,才會體現出斯巴魯翼豹的“好玩”之處。
寶馬1系
156馬力的2.0L發動機,前置后驅布局,再搭配出色的6擋手動變速箱,舊款寶馬1系的駕駛樂趣是相當高的。目前二手車市場價格只需要8到9萬元,性價比可謂相當高。
買車不一定都要買新車,尤其是對於年輕一代消費者來說,二手車甚至能以低廉的價格找到更加有趣的車型,上面提及的這些車不過是二手市場中好車群里的冰山一角。不過畢竟二手車的車況參差不齊,有意選擇二手車的朋友也要注意先了解清楚試車、驗車的竅門哦!本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※帶您來了解什麼是 USB CONNECTOR ?
※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面
※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!
※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※教你寫出一流的銷售文案?
頂配的3。6T版本4。8 S的百公里加速性能更是令人折服。當然,300mm的涉水深度令人匪夷所思。而中控台上的空白按鍵時刻在提醒你:囊中羞澀以致某項配置未能選裝。此外,保時捷的售價就像你跟媽媽說晚上9點準時回家一樣不靠譜。
2018北京車展於4.25正式拉開帷幕,因工作關係得以參与這場人山人海的車界盛會。在車展上,除了各大傳統車企紛紛推出SUV新品外,諸多造車新勢力所亮相或展示的車型也是SUV為多,由此可見SUV的市場熱度一直未曾消減。
那些展出的SUV近乎都是:外觀愈發年輕、愈加運動“猙獰”,再難覓得一平庸之輩。若是將它們置於三五年前,必定都是明星車型。可在同質化異常嚴重的當下,已鮮有車型能在這股趨於一致的“年輕運動”的SUV洪流之中脫穎而出。
當然,也有例外。這幾款集情懷、血統、顏值、性能於一身的“尤物”備受青睞。
點評:一貫擅長打造英倫優雅紳士風的捷豹,強盛的藝術生命力在這款SUV上得以延續,俊朗精緻的外觀頗有幾分F-TYpE的神韻。年度風雲車、年度最佳設計等大獎便是對這走在時尚尖端寵兒的肯定。在老東家福特的EcoBoost 2.0T替換為自家的Ingenium 2.0T(2018沃德十佳發動機之一)后,性格變得愈加“狂豹”,低沉的聲浪時刻撩撥着駕駛者的慾望;早已滲透骨子里的獨特基因,令其在拐彎抹角的山間道路中犹如一隻飛馳的野豹。
點評:在卡宴身上嘗得SUV甜頭后,保時捷推出與老款Q5共享MLB平台(新款Q5L出自MLB EVO平台)的另一搖錢樹—Macan。萬年不變的青蛙臉令人百看不厭;跑車基因的加持,操控性能自然是無與倫比;頂配的3.6T版本4.8 S的百公里加速性能更是令人折服。當然,300mm的涉水深度令人匪夷所思;而中控台上的空白按鍵時刻在提醒你:囊中羞澀以致某項配置未能選裝。此外,保時捷的售價就像你跟媽媽說晚上9點準時回家一樣不靠譜。
點評:作為阿爾法羅密歐品牌百年歷史中第一款SUV產品,意大利人對藝術獨到的見解與對性能的痴迷在其身上得以極佳體現。精準的轉向、汽車愛好者極易上手的完美操控、恰到好處的零百以及超高的彎道極限令人愛不釋手。在北京車展上完成亞洲首秀的Stelvio QV版本更是紐北最快量產SUV圈速的記錄保持者。只是FCA的尿性,大家心照不宣,難怪有媒體朋友曾言:等我有錢了,就買它個兩台,一台修理一台開。
俗語言:逆水行舟,不進則退。在主流的市場里,品牌的差異性將變得越來越小,不論是國際品牌還是本土品牌。因此,“變通”是明智的生存之道。多數人認為保時捷、阿爾法羅密歐等豪華品牌推出SUV獲取更大市場份額意味着喪失了品牌的獨有特質。
但恰恰是這種“變通”,洞察出市場真正的需求點,才讓人看到更多好看的皮囊,感受到更多有趣的靈魂。畢竟只有存活下來,才能讓自身的基因得到延續。如果保時捷只生產跑車,捷豹只生產轎車,我們將錯過多少“尤物”呢?本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※為什麼 USB CONNECTOR 是電子產業重要的元件?
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※台北網頁設計公司全省服務真心推薦
※想知道最厲害的網頁設計公司"嚨底家"!
※推薦評價好的iphone維修中心
6L的動力版本,會讓你在日常代步之餘,也能享受到小鋼炮的魅力。至於1。5T的,朋友,秋名山見。福克斯的短板在於儲物空間較為一般,後排在兩廂車這個級別裏面算是表現一般,中下的水平。致悅,沒錯,不是致炫,是來自菲亞特选手的致悅,至於為啥會推薦它,不是它表現的多突出,主要是價格便宜,優惠還大,這是許多人買車考慮的問題之一。
緊湊型車三廂的感覺操控不過來?
有便宜的兩廂車推薦嗎?
想買兩廂車怎麼辦?
有哪些兩廂車選擇?
首先是來自馬自達选手帶來的昂科賽拉,對於這款車大家都不陌生,操控就不說了,兩廂車操控還不好也不好意思推薦了,昂科賽拉的底盤懸挂是想要表揚的,一個字,穩,即使是高速過彎,你也不會覺得虛。
在眾多車企紛紛投入渦輪增壓發動機的大軍中去是,馬自達堅持做自吸發動機,這簡直是個異類,但是馬自達憑藉創馳藍天技術使得昂科賽拉在動力方面不遜色於搭載渦輪發動機的車型,而且還省油,這也是馬自達敢拿自吸發動機打着運動旗號的原因了。
後排較小,是昂科賽拉的短板,這也是許多馬自達車型的短板了,買馬自達的朋友們要注意哦~
另外是昂科賽拉在胎躁控制方面的還是不夠,這是許多車主反應的問題了。
福特选手帶來的則是福克斯,福克斯是大家心目中的理想車型之一了,美系車的隔音好,配置豐富的特點都具備,還有眾多的動力選擇。
1.0T的動力總成,對於日常上下班代步通勤的朋友們,會說,夠用!1.6L的動力版本,會讓你在日常代步之餘,也能享受到小鋼炮的魅力!至於1.5T的,朋友,秋名山見!
福克斯的短板在於儲物空間較為一般,後排在兩廂車這個級別裏面算是表現一般,中下的水平。
致悅,沒錯,不是致炫,是來自菲亞特选手的致悅,至於為啥會推薦它,不是它表現的多突出,主要是價格便宜,優惠還大,這是許多人買車考慮的問題之一。
除了價格之外,致悅的空間表現以及動力表現也是挺不錯的,全系搭載1.4T渦輪增壓發動機,動力能說不夠嗎?用車主的話說,就是一給油就跑!
從車身尺寸以及乘坐空間測試來看,致悅的表現在同級別不能說最好,但是中上水平還是可以有的。而讓人不滿意的是所搭配的DCT雙離合變速器在低擋換擋的時候頓挫感比較明顯。
以上三款車都是所推薦的兩廂車,綜合實力來說都是比較強的,各位看官可以根據自己的需求來挑選喲!本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能
※台北網頁設計公司這麼多該如何選擇?
※智慧手機時代的來臨,RWD網頁設計為架站首選
※評比南投搬家公司費用收費行情懶人包大公開
※回頭車貨運收費標準
我們再一起來回顧一下吧現代ENCINO是一款以性能著稱的小型SUV,搭載1。6T渦輪增壓發動機和雙離合器變速箱作為動力總成,177匹馬力的賬面參數也是十分誘人,配合上個性張揚的外觀設計和尚且不貴的售價,現代ENCINO要成為未來年輕人的首選車型的決心顯而易見。
《後來的我們》上映不久票房已超過10億,
繼《前任3》后又再一次給了年輕人5條建議:
1.如果結婚就要找愛你的
2.千萬別輸在“等”這個字身上
3.永遠留住30%的神秘
4.如何才能配得上你的伴侶?
關注玩車是
走向人生巔峰迎娶白富美嫁給高富帥的前提噢!
5.牢記第4條,前3條沒什麼用…
好吧,皮了一下,我們說回正事吧
看看了5月或將上市的車,
心想:除了個別車型,毫無驚喜!
這跟4月份的新車比起來,差距可不是一點點啊
起碼,全新的SUV,就有6款重磅新車了
不是改款,不是換代,
這幾款都是扎紮實實的新車、新SUV噢!
我們再一起來回顧一下吧
現代ENCINO是一款以性能著稱的小型SUV,搭載1.6T渦輪增壓發動機和雙離合器變速箱作為動力總成,177匹馬力的賬面參數也是十分誘人,配合上個性張揚的外觀設計和尚且不貴的售價,現代ENCINO要成為未來年輕人的首選車型的決心顯而易見。
威馬EX5是一款非常具有市場潛力的電動SUV,雖然是新品牌下的新車型,但是威馬公司背後的技術背書和他們自建工廠的生產方式讓他們的品牌形象顯得十分靠譜。而威馬EX5的實車已經正式上市,在2018年下半年就可以正式交付,EX5的設計非常符合大眾審美,屬於十分耐看的一款車型,而且續航里程可以達到400多公里的動力特性,也讓它十分有成為一二線限行城市的熱銷車型的潛力。
自主品牌非承載式SUV對於普通消費者來說更像是一個要麼廉價,要麼粗糙的存在。但是榮威RX8的上市便打破了這一種的傳統認知,榮威RX8的非承載式SUV和全時四驅的特性讓它有着比較出色的越野能力,而且定位豪華的RX8在內飾氛圍的設計上融入了非常多的木紋飾板和檔次感出眾的軟質材料,讓整車的檔次感顯現地非常到位。
對於越野有需求的消費者,或許就在途達上市以後有了新的選擇,非承載式車身,分時四驅,二十五萬以內的頂配售價,這些特點都在表明途達是一款可以入門越野圈的新車;而且久經市場考驗的動力總成更讓它的可靠性有所保障,雖然內飾設計相對廉價,但是對於追求更多在嚴苛環境下有靠譜表現的消費者來說,途達的產品力正是他們想要的。
Jeep在中國市場上的發力趨勢愈發明顯,相繼自由光,指南者這類車型在國內市場獲得一定成功以後,現如今又推出了一款中國特供的中型SUV,大指揮官。雖然這款車型是一款低於大切諾基的中型SUV,但是它的外觀與內飾設計,配置供給與裝配工藝等等方面都基本上稱得上是現如今合資國產的Jeep車型中的旗艦。售價區間與漢蘭達,銳界等車型有着高度重合,未來中型7座SUV中的強有力競爭者勢必將會多出大指揮官的身影。
GLC和Q5在BBA的豪華中型SUV市場稱雄已久,操控大師寶馬也就看不過眼了,華晨寶馬X3正式在中國上市,都說它沒有加長會影響車內空間,但其實這款車型換代后本就有了一定車身尺寸上的增加,所以空間並不是什麼硬傷,相反,更原汁原味的引入國產化后的Q3勢必會成為BBA中型SUV中最具運動基因的一款車型,而廣大寶馬迷們在X3上市以後也必定有了更為接地氣和更實惠的車型備選方案。
怎麼樣,這幾款新SUV很吸引吧~
感興趣的話不妨去4S店看看實車噢本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線
※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整
※南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!
※教你寫出一流的銷售文案?
※超省錢租車方案
勁客的優勢在於成熟可靠的動力總成,採用1。5L自然吸氣發動機+CVT無級變速器的搭配能夠帶來非常平順線性的輸出,油門調校靈敏,能夠很好地應付日常市區內行駛,並且也非常省油,可靠性較高。不過其檔次感與配置水平不如哈弗H2。
15萬左右比較推薦的是本田XR-V與豐田卡羅拉,這兩款車目前在市場上都有着不錯的銷量、保值率以及口碑,XR-V在小型SUV市場混得風生水起,靠的就是其成熟的動力系統和越級的空間表現,家用是個非常棒的選擇。而卡羅拉乃全球銷量神車,中庸就是其最大的武器,除了汽油版本外還有雙擎版本可選,擁有非常優秀的燃油經濟性,能夠滿足許許多多的消費者,除了隔音濾振差點,其它方面的表現都非常不錯,乃家用車的不二之選。
一輛是接近中型車的緊湊型車,一輛是標準的中型車,凌渡280DSG豪華版擁有更加豐富的配置,不過因為其比較扁平的設計所以頭部空間表現一般,而君威中型車的身份自然擁有更大的空間以及更高的檔次感,同時全系標配9AT也讓其競爭力進一步上升,採用的1.5T發動機也有着不錯的動力輸出,因此更推薦君威1.5T中配。
510採用的是6擋手動變速器和5擋AMT變速器,假設會開手動擋的話更加推薦手動車型,6個擋位在高速行駛時把轉速壓得更低,能帶來更好的燃油經濟性,同時擁有更高的傳動效率及可靠性,510的手動擋換擋手感不錯,有吸入感並且行程不長,離合器的力度也不沉,沒那麼容易疲勞。而AMT變速器雖然說省去了踩離合器的麻煩,但是其換擋邏輯不清晰,而且頓挫比較嚴重,尤其是在起步階段或者是在堵車狀況下,因此更加推薦510的手動版車型。
兩車都是定位小型SUV,哈弗H2擁有更加親民的售價,更加大氣上檔次的外觀內飾設計,同時配置更加豐富,採用的1.5T發動機+7擋雙離合的搭配,擁有不錯的爆發力,但是雙離合變速器的邏輯有待提高,並且油耗也會偏高。
勁客的優勢在於成熟可靠的動力總成,採用1.5L自然吸氣發動機+CVT無級變速器的搭配能夠帶來非常平順線性的輸出,油門調校靈敏,能夠很好地應付日常市區內行駛,並且也非常省油,可靠性較高。不過其檔次感與配置水平不如哈弗H2。
綜上,假如你預算充足的話,更加建議購買勁客的中配以上車型,而預算不是很足的話,那麼家用選擇H2是一個非常具有性價比的選擇。
2018款飛度新增了運動套件車型,不過在配置方面還是一如既往的寒酸,比較推薦指導價為8.88萬的1.5L CVT潮跑版,在配置上面擁有主/副駕駛座安全氣囊、運動外觀套件、行車電腦显示屏、前霧燈等,類似比較常用的电子車身穩定系統、駐車雷達要到頂配才配備,但是飛度的動力和空間還是非常不錯的,1.5L自吸發動機就能爆發出131匹馬力,日常市區駕駛毫無壓力,加上本田“MM”理念,讓它的空間能夠滿足大多數人的使用需求,市面上大量的改裝件也能讓每位飛度車主把愛車改成獨一無二的樣子。
以上就是本期網友問答欄目的全部內容,假如你也想上牆的話,點擊下方留言留下你的問題並且點個贊,就有機會在下期欄目看見你的身影!本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線
※Google地圖已可更新顯示潭子電動車充電站設置地點!!
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※別再煩惱如何寫文案,掌握八大原則!
※網頁設計最專業,超強功能平台可客製化
未來一段時間開發的項目或者需求會大量使用到Redis,趁着這段時間業務並不太繁忙,抽點時間預習和複習Redis的相關內容。剛好看到博客下面的UV和PV統計,想到了最近看書裏面提到的HyperLogLog數據類型,於是花點時間分析一下它的使用方式和使用場景(暫時不探究HyperLogLog的實現原理)。Redis中HyperLogLog數據類型是Redid 2.8.9引入的,使用的時候確保Redis版本>= 2.8.9。
基數計數(cardinality counting),通常用來統計一個集合中不重複的元素個數。一個很常見的例子就是統計某個文章的UV(Unique Visitor,獨立訪客,一般可以理解為客戶端IP)。大數據量背景下,要實現基數計數,多數情況下不會選擇存儲全量的基數集合的元素,因為可以計算出存儲的內存成本,假設一個每個被統計的元素的平均大小為32bit,那麼如果統計一億個數據,佔用的內存大小為:
32 * 100000000 / 8 / 1024 / 1024 ≈ 381M。如果有多個集合,並且允許計算多個集合的合併計數結果,那麼這個操作帶來的複雜度可能是毀滅性的。因此,不會使用Bitmap、Tree或者HashSet等數據結構直接存儲計數元素集合的方式進行計數,而是在不追求絕對準確計數結果的前提之下,使用基數計數的概率算法進行計數,目前常見的有概率算法以下三種:
Linear Counting(LC)。LogLog Counting(LLC)。HyperLogLog Counting(HLL)。所以,HyperLogLog其實是一種基數計數概率算法,並不是Redis特有的,Redis基於C語言實現了HyperLogLog並且提供了相關命令API入口。
Redis的作者Antirez為了紀念Philippe Flajolet對組合數學和基數計算算法分析的研究,所以在設計HyperLogLog命令的時候使用了Philippe Flajolet姓名的英文首字母PF作為前綴。也就是說,Philippe Flajolet博士是HLL算法的重大貢獻者,但是他其實並不是Redis中HyperLogLog數據類型的開發者。遺憾的是Philippe Flajolet博士於2011年3月22日因病在巴黎辭世。這個是Philippe Flajolet博士的維基百科照片:
Redis提供的HyperLogLog數據類型的特徵:
HyperLogLog Counting(HLL)實現,只做基數計算,不會保存元數據。HyperLogLog每個KEY最多佔用12K的內存空間,可以計算接近2^64個不同元素的基數,它的存儲空間採用稀疏矩陣存儲,空間佔用很小,僅僅在計數基數個數慢慢變大,稀疏矩陣佔用空間漸漸超過了閾值時才會一次性轉變成稠密矩陣,轉變成稠密矩陣之後才會佔用12K的內存空間。Standard Error)為0.81%的近似值,當數據量不大的時候,得到的結果也可能是一個準確值。內存佔用小(每個KEY最高佔用12K)是HyperLogLog的最大優勢,而它存在兩個相對明顯的限制:
Redis提供的HyperLogLog數據類型一共有三個命令API:PFADD、PFCOUNT和PFMERGE。
PFADD命令參數如下:
PFADD key element [element …]
支持此命令的Redis版本是:>= 2.8.9
時間複雜度:每添加一個元素的複雜度為O(1)
element添加到鍵為key的HyperLogLog數據結構中。PFADD命令的執行流程如下:
PFADD命令的使用方式如下:
127.0.0.1:6379> PFADD food apple fish
(integer) 1
127.0.0.1:6379> PFADD food apple
(integer) 0
127.0.0.1:6379> PFADD throwable
(integer) 1
127.0.0.1:6379> SET name doge
OK
127.0.0.1:6379> PFADD name throwable
(error) WRONGTYPE Key is not a valid HyperLogLog string value.
雖然HyperLogLog數據結構本質是一個字符串,但是不能在String類型的KEY使用HyperLogLog的相關命令。
PFCOUNT命令參數如下:
PFCOUNT key [key …]
支持此命令的Redis版本是:>= 2.8.9
時間複雜度:返回單個HyperLogLog的基數計數值的複雜度為O(1),平均常數時間比較低。當參數為多個key的時候,複雜度為O(N),N為key的個數。
PFCOUNT命令使用單個key的時候,返回儲存在給定鍵的HyperLogLog數據結構的近似基數,如果鍵不存在, 則返回0。PFCOUNT命令使用多個key的時候,返回儲存在給定的所有HyperLogLog數據結構的並集的近似基數,也就是會把所有的HyperLogLog數據結構合併到一個臨時的HyperLogLog數據結構,然後計算出近似基數。PFCOUNT命令的使用方式如下:
127.0.0.1:6379> PFADD POST:1 ip-1 ip-2
(integer) 1
127.0.0.1:6379> PFADD POST:2 ip-2 ip-3 ip-4
(integer) 1
127.0.0.1:6379> PFCOUNT POST:1
(integer) 2
127.0.0.1:6379> PFCOUNT POST:1 POST:2
(integer) 4
127.0.0.1:6379> PFCOUNT NOT_EXIST_KEY
(integer) 0
PFMERGE命令參數如下:
PFMERGE destkey sourcekey [sourcekey ...]
支持此命令的Redis版本是:>= 2.8.9
時間複雜度:O(N),其中N為被合併的HyperLogLog數據結構的數量,此命令的常數時間比較高
HyperLogLog數據結構合併為一個新的鍵為destkey的HyperLogLog數據結構,合併后的HyperLogLog的基數接近於所有輸入HyperLogLog的可見集合(Observed Set)的並集的基數。OK。PFMERGE命令的使用方式如下
127.0.0.1:6379> PFADD POST:1 ip-1 ip-2
(integer) 1
127.0.0.1:6379> PFADD POST:2 ip-2 ip-3 ip-4
(integer) 1
127.0.0.1:6379> PFMERGE POST:1-2 POST:1 POST:2
OK
127.0.0.1:6379> PFCOUNT POST:1-2
(integer) 4
假設現在有個簡單的場景,就是統計博客文章的UV,要求UV的計數不需要準確,也不需要保存客戶端的IP數據。下面就這個場景,使用HyperLogLog做一個簡單的方案和編碼實施。
這個流程可能步驟的先後順序可能會有所調整,但是要做的操作是基本不變的。先簡單假設,文章的內容和統計數據都是後台服務返回的,兩個接口是分開設計。引入Redis的高級客戶端Lettuce依賴:
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>5.2.1.RELEASE</version>
</dependency>
編碼如下:
public class UvTest {
private static RedisCommands<String, String> COMMANDS;
@BeforeClass
public static void beforeClass() throws Exception {
// 初始化Redis客戶端
RedisURI uri = RedisURI.builder().withHost("localhost").withPort(6379).build();
RedisClient redisClient = RedisClient.create(uri);
StatefulRedisConnection<String, String> connect = redisClient.connect();
COMMANDS = connect.sync();
}
@Data
public static class PostDetail {
private Long id;
private String content;
}
private PostDetail selectPostDetail(Long id) {
PostDetail detail = new PostDetail();
detail.setContent("content");
detail.setId(id);
return detail;
}
private PostDetail getPostDetail(String clientIp, Long postId) {
PostDetail detail = selectPostDetail(postId);
String key = "puv:" + postId;
COMMANDS.pfadd(key, clientIp);
return detail;
}
private Long getPostUv(Long postId) {
String key = "puv:" + postId;
return COMMANDS.pfcount(key);
}
@Test
public void testViewPost() throws Exception {
Long postId = 1L;
getPostDetail("111.111.111.111", postId);
getPostDetail("111.111.111.222", postId);
getPostDetail("111.111.111.333", postId);
getPostDetail("111.111.111.444", postId);
System.out.println(String.format("The uv count of post [%d] is %d", postId, getPostUv(postId)));
}
}
輸出結果:
The uv count of post [1] is 4
可以適當使用更多數量的不同客戶端IP調用getPostDetail(),然後統計一下誤差。
如果想要準確統計UV,則需要注意幾個點:
假設在不考慮內存成本的前提下,我們依然可以使用Redis做準確和實時的UV統計,簡單就可以使用Set數據類型,增加UV只需要使用SADD命令,統計UV只需要使用SCARD命令(時間複雜度為O(1),可以放心使用)。舉例:
127.0.0.1:6379> SADD puv:1 ip-1 ip-2
(integer) 2
127.0.0.1:6379> SADD puv:1 ip-3 ip-4
(integer) 2
127.0.0.1:6379> SCARD puv:1
(integer) 4
如果這些統計數據僅僅是用戶端展示,那麼可以採用異步設計:
在體量小的時候,上面的所有應用的功能可以在同一個服務中完成,消息隊列可以用線程池的異步方案替代。
這篇文章只是簡單介紹了HyperLogLog的使用和統計UV的使用場景。總的來說就是:在(1)原始數據量巨大,(2)內存佔用要求盡可能小,(3)允許計數存在一定誤差並且(4)不要求存放元數據的場景下,可以優先考慮使用HyperLogLog進行計數。
參考資料:
(本文完 c-3-d e-a-20191117)
技術公眾號(《Throwable文摘》),不定期推送筆者原創技術文章(絕不抄襲或者轉載):
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※帶您來了解什麼是 USB CONNECTOR ?
※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面
※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!
※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※教你寫出一流的銷售文案?
上一篇我們聊到了docker容器的單機編排工具docker-compose的簡單使用,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/13121678.html;今天我們主要來聊一聊docker容器的資源限制;通常情況下我們啟動一個docker容器,其內存和CPU都是同宿主機一樣大,這意味着該容器和宿主機共享相同大小的內存和CPU資源;這樣一來容器正常情況下沒有什麼問題,假如容器里運行的進程特別愛吃內存,很可能存在把宿主機上的內存全部吃掉,觸發內核OOM,從而導致docker daemon直接被內核殺死;為了避免這樣的尷尬局面,對啟動容器我們有必要對容器的資源進行限制;
所謂OOM就是當系統上的應用申請內存資源時,發現申請不到內存,這個時候Linux內核就會啟動OOM,內核將給系統上的所有進程進行評分,通過評分得分最高的進程就會被系統第一個幹掉,從而騰出一些內存空間,如果騰出的內存空間還是不夠該應用使用,它會繼續殺得分第二高的,直到應用有足夠的內存使用;一旦發生OOM,任何進程都有可能被殺死,包括docker daemon在內,為此,docker特定調整了docker daemon的oom優先級,以免發生oom被內核殺死,但是容器的oom優先級並未做任何調整;
那麼對於內存資源來講,在啟動為容器時,我們可以通過一些選項來指定容器的內存相關設置;如下圖
提示:-m 或 –memory 用來指定容器最大能夠使用的內存大小,默認情況不指定表示共享物理宿主機的內存大小;–memory-swap 用來指定容器的內存和交換內存的總大小;對於這個參數的取值比較詭異;待會在說吧;–memory-swappiness該選項用來指定容器使用交換內存的傾向性,swap啟用有個好處就是在內存不夠使用的情況,它可以臨時頂替一部分,但是性能會急劇下降;所以数字越大越早使用交換內存,数字越小越晚使用交換內存,取值在0-100之間;0不代表不是用交換內存,0表示能不用交換內存,則不用,但是在迫不得已的情況還是會使用的,100表示只要有一絲可以使用交換內存的希望,就使用交換內存;通常情況在運行容器的主機上不建議使用swap設備;swap交換分區如果一旦被激活,系統性能會急劇下降,建議直接禁用;–memory-reservation該選項用來指定給系統保留的內存空間大小;–kernel-memory用來指定給內核保留的內存大小;–oom-kill-disable該選項用於指定當發生oom時,是否禁用因oom而殺死該容器進程;
提示:通常情況–memory-swap這個選項必須同–memory選項一起使用,不可用單獨使用;
示例:限制容器使用最大內存為256M
[root@docker_registry ~]# docker run --name test --rm -m 256M lorel/docker-stress-ng --vm 2
提示:以上命令表示啟動一個名為test的容器,限制該容器最大使用內存大小為256M;lorel/docker-stress-ng這個進行用來壓測容器;–vm表示同時使用多少進程來做壓測;
驗證:用docker stats看看我們啟動test容器是否只能使用256M內存?
提示:從上面的結果可以看到,在我們啟動容器時,使用-m指定內存大小的容器limit的值就是我們指定的值,而對於沒有用-m指定的容器,默認就是同宿主機內存大小一樣;
對於CPU來講,默認情況啟動容器時,不限制CPU的資源,此時容器是共享宿主機的CPU資源,也就是說默認情況宿主機上有幾顆cpu核心,啟動的容器就有多少顆核心;對於CPU這種可壓縮資源,不會像內存那樣,如果CPU滿載,也不會導致某個容器崩潰,原因是因為cpu是可壓縮資源;而不同於內存,內存屬於不可壓縮資源,如果申請不到內存,就會出現異常,出現oom;對啟動容器來限制cpu資源,通常也是使用選項來限定;如下圖
提示:–cpus用來指定容器能夠使用的最大cpu核心數,例如–cpus=1.5,就表示該容器最大能夠使用1.5核的CPU資源,如果宿主機上有4顆CPU核心,那麼該容器最多可把1.5顆核心跑滿;這樣說吧,如果宿主機上有4顆核心,那麼該容器如果使用–cpus限定為1.5,那麼該容器就只能使用宿主機上的百分之150的核心;–cpu-period 和–cpu-quota該選項在docker1.13以後基本廢棄;–cpuset-cpus該選項用於指定容器能夠在哪些CPU上運行;如果宿主機上有4顆CPU,–cpuset-cpus=2,3就表示該容器只能使用第2號cpu和第3號cpu;–cpu-shares該選項用於指定容器使用cpu的比例;比如宿主機上只有一個容器,而該容器啟動時指定–cpu-shares=1024,則表示,如果沒有其他容器,則它可以使用宿主機上的所有cpu資源,如果有第二個容器啟動時,指定cpu-shares=512,那麼第一個容器會從原來使用整個宿主機的cpu變為使用整個宿主機的cpu的2/3;以此類推,如果有第三個,第四個,他們使用cpu資源都是按照給定的比例動態調整;
示例:第一個容器使用–cpu-shares=256;第二個容器使用–cpu-shares=512,看看當第一個容器啟動后,看看cpu使用情況,然後第二個容器啟動后再看看cpu使用情況
提示:可以看到當第一個容器啟動時,雖然設置的cpu-shares=256,但是它還是把所有核心幾乎都跑滿了;我們在跑一個容器看看,看看第二個容器啟動后,第一個容器的cpu使用情況是否有變化?
提示:從上面的結果看,t1和t2的cpu使用比例大概是1比2;總量還是400%並沒有變化;
示例:設置容器使用1.5個CPU核心
提示:從上面的結果可以看到使用–cpus來限定容器使用的CPU資源,默認它會在每顆黑核心上都要使用一部分,但是重量不會超過150%;
示例:限定容器使用CPU核心,只能在0號和3號核心上使用;
提示:從上面的結果可以看到,限定t1容器只能使用0號和3號CPU后,1號和2號就基本不會被使用,總量也不會增加;
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※為什麼 USB CONNECTOR 是電子產業重要的元件?
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※台北網頁設計公司全省服務真心推薦
※想知道最厲害的網頁設計公司"嚨底家"!
※推薦評價好的iphone維修中心
最近,一位讀者出去面試前準備了很久,信心滿滿的去面試。沒想到面試官的一個問題把他難住了。面試官的問題是這樣的:如何使用Spring將Service注入到Servlet中呢?這位讀者平時也是很努力的,看什麼源碼啊、多線程啊、高併發啊、設計模式啊等等。沒想到卻在一個很簡單的問題上栽了跟頭,這就說明學習知識要系統化,要有條理,切忌東學一點,西記一點,否則,到頭來,啥也學不到。
項目工程源碼已經提交到GitHub:https://github.com/sunshinelyz/spring-annotation
這裏,我們列舉兩種解決方法(推薦使用第二種)
直接重寫Servlet的Init()方法,代碼如下:
public void init(ServletConfig servletConfig) throws ServletException {
ServletContext servletContext = servletConfig.getServletContext();
WebApplicationContext webApplicationContext = WebApplicationContextUtils
.getWebApplicationContext(servletContext);
AutowireCapableBeanFactory autowireCapableBeanFactory = webApplicationContext
.getAutowireCapableBeanFactory();
autowireCapableBeanFactory.configureBean(this, BEAN_NAME);
}
這裏的BEAN_NAME即為我們需要注入到Spring容器中的服務,但這並不是一個好的方法,因為我們需要在每一個Servlet中都進行這樣的操作。
我們可以寫一個類似於“org.springframework.web.struts.DelegatingRequestProcessor”的委託的Bean,然後通過配置的方法把我們的服務注入到servlet中,具體方法如下,
Step 1:編寫委託類DelegatingServletProxy
package com.telek.pba.base.util;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
/**
* 以下是類似org.springframework.web.struts.DelegatingRequestProcessor的一個委託
* 用於通過配置的方法,在Servlet中注入Service
* @author binghe
* */
public class DelegatingServletProxy extends GenericServlet{
private static final long serialVersionUID = 1L;
private String targetBean;
private Servlet proxy;
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException{
proxy.service(req, res);
}
/**
* 初始化
*/
public void init() throws ServletException {
this.targetBean = getServletName();
getServletBean();
proxy.init(getServletConfig());
}
/**
* 獲取Bean
*/
private void getServletBean() {
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
this.proxy = (Servlet) wac.getBean(targetBean);
}
}
Step 2:修改Web.xml配置
在純Servlet模式下,我們的配置方式如下(以下由於代碼高亮插件的問題,請將代碼中的#替換成尖括號)
<servlet>
<description>活動發起模塊活動查詢分頁Servlet</description>
<display-name>launchActivityQueryServlet</display>
<servlet-name>LaunchActivityQueryServlet</servlet-name>
<servlet-class>com.telek.pba.launch.servlet.LaunchActivityQueryServlet</servlet-class>
<servlet>
<servlet-mapping>
<servlet-name>LaunchActivityQueryServlet</servlet-name>
<url-pattern>/servlet/launch/LaunchActivityQueryServlet</url-pattern>
</servlet-mapping>
</servlet>
如果採用我們這種代理的方法,則配置應該修改為:
<servlet>
<description>活動發起模塊活動查詢分頁Servlet</description>
<display-name>launchActivityQueryServlet</display>
<servlet-name>launchActivityQueryServlet</servlet-name>
<servlet-class>com.telek.pba.base.util.DelegatingServletProxy</servlet-class>
<servlet>
<servlet-mapping>
<servlet-name>launchActivityQuery</servlet-name>
<url-pattern>/servlet/launch/LaunchActivityQueryServlet</url-pattern>
</servlet-mapping>
</servlet>
注意:默認情況下,Servlet的配置中,LaunchActivityQuery的首字母一般為大寫,而我們的標題中已註明,我們採用Spring的註解模式,如果是自動掃描註解的話,默認情況下,註解的value值為首字母小寫,即:launchActivityQuery,因此,在我們新的配置中,要注意將首字母改為小寫,否則會報無法找到Bean的錯誤。
Step 3:至此,我們就可以像SSH的注入方式一樣,注入Servlet了,以下是個小示例:
package com.telek.pba.launch.servlet;
import java.io.IOException;
import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import com.telek.pba.base.model.PbaUserInfo;
import com.telek.pba.launch.dao.IPbaActivityInfoCurrentDAO;
@Component
public class LaunchActivityQueryServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
//注入IPbaActivityInfoCurrentDAO
@Resource
private IPbaActivityInfoCurrentDAO pbaActivityInfoCurrentDAO;
public LaunchActivityQueryServlet() {
super();
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//sth to do
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//sth to do
}
public void init() throws ServletException {
// Put your code here
}
}
最後,請留心在Spring配置文件中,配置上自動掃描包的路徑:
<context:component-scan base-package="com.telek.pba.*.dao.impl,
com.telek.pba.*.service.impl,
com.telek.pba.*.servlet"/>
大功告成!
好了,咱們今天就聊到這兒吧!別忘了給個在看和轉發,讓更多的人看到,一起學習一起進步!!
項目工程源碼已經提交到GitHub:https://github.com/sunshinelyz/spring-annotation
如果覺得文章對你有點幫助,請微信搜索並關注「 冰河技術 」微信公眾號,跟冰河學習Spring註解驅動開發。公眾號回復“spring註解”關鍵字,領取Spring註解驅動開發核心知識圖,讓Spring註解驅動開發不再迷茫。
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能
※台北網頁設計公司這麼多該如何選擇?
※智慧手機時代的來臨,RWD網頁設計為架站首選
※評比南投搬家公司費用收費行情懶人包大公開
※回頭車貨運收費標準
目錄
JVM的重要性不言而喻了,如果把java的應用程序比作一輛跑車,那麼JVM就是這輛車的發動機,沒有它,java程序就成了空中樓閣,無根浮萍。而在JVM中有一塊內存區域叫做運行時數據區域,存儲了運行時所需要的所有對象,而Heap Area則是其中最大的一塊。
內存畢竟不是無限的,所以就需要一種機制來將不再使用的對象進行回收,這種機制就是今天我們要講的GC。
更多精彩內容且看:
小師妹:F師兄,你相信這個世界有輪迴嗎?
師兄我是一個堅定的無神論者,活在當下就好了,何必操心後面的輪迴呢?
小師妹:F師兄,這個你就不懂了,意識是組成腦的原子群的一種組合模式,我們大腦的物質基礎和一塊石頭沒有什麼不同。當我們掌握大腦的組合方式,然後重構,我們的意識就重現了,這就是輪迴。這可是量子理論中提到的觀念哦。
哇,小師妹什麼時候這麼厲害了,都開始探討這麼高深的話題了。F師兄我實在是跟不上節奏啊。
小師妹,F師兄,我是怕你尷尬,想引出java對象的生命周期這個話題嘛。
量子理論我不熟,java對象我還沒怕過誰。
對象的生命周期其實很簡單:創建,使用中,最後被銷毀。
舉個最簡單的創建對象的例子:
Object obj = new Object();
對象創建的時候,將會為該對象分配特定的空間。
對象創建之後,就可以被其他的對象使用,如果其他的對象有使用該對象,那麼我們成為該對象被引用了。
當一個對象沒有被其他對象引用的時候,我們就稱為該對象可以被回收了。在Java中,對象的回收是由GC來負責的。
小師妹:F師兄,我覺得垃圾回收好像挺簡單的,我們為每個對象維持一個指針計數器,每引用一次就加一,這樣不就可以實現垃圾回收器了嗎?
底層原理是這麼一個道理,但是JVM需要一種更加高效的算法來保證垃圾回收的效率,同時也不會影響正在運行的程序。
接下來我們將會介紹一下,在JVM中比較常用幾個垃圾回收算法:
Mark and sweep是最最簡單的垃圾回收算法,簡單點講,它可以分為兩個步驟:
標記live對象聽起來很簡單,就是掃描堆中的對象,看這些對象是否被引入。
但是這裡有一個問題,如果是兩個對象互相引用的時候,而這兩個對象實際上並沒有被外部的對象所引用,那麼這兩個對象其實是應該被回收的。所以我們還需要解決一個關鍵性的問題:從哪裡開始掃描的問題。
JVM定義了一些Root對象,從這些對象開始,找出他們引用的對象,組成一個對象圖。所有在這個圖裡面的對象都是有效的對象,反之不在對象圖中的對象就應該被回收。有效的對象將會被Mark為alive。
這些Root對象包括:正在執行的方法中的本地對象和輸入參數。活動的線程,加載類中的static字段和JNI引用。
注意,這種遍歷其實是有個缺點的,因為為了找到對象圖中哪些對象是live的,必須暫停整個應用程序,讓對象變成靜止狀態,這樣才能構建有效的對象圖。後面我們會介紹更加有效的垃圾回收算法。
掃描對象之後,我們就可以將未標記的對象刪除了。
刪除有三種方式,第一種方式是正常刪除。但是正常刪除會導致內存碎片的產生。所以第二種方式就是刪除之後進行壓縮,以減少內存碎片。還有一種方式叫做刪除拷貝,也就是說將alive的對象拷貝到新的內存區域,這樣同樣可以解決內存碎片的問題。
在講CMS之前,我們先講一下垃圾回收器中的Eden,Old和Survivor space幾個大家應該都很熟悉的分代技術。
Young Gen被劃分為1個Eden Space和2個Suvivor Space。當對象剛剛被創建的時候,是放在Eden space。垃圾回收的時候,會掃描Eden Space和一個Suvivor Space。如果在垃圾回收的時候發現Eden Space中的對象仍然有效,則會將其複製到另外一個Suvivor Space。
就這樣不斷的掃描,最後經過多次掃描發現任然有效的對象會被放入Old Gen表示其生命周期比較長,可以減少垃圾回收時間。
之後要將的幾個垃圾回收器,除了ZGC,其他都使用的是分代的技術。
好了,現在繼續講CMS,CMS是mark and swap的升級版本,它使用多個線程來對heap區域進行掃描,從而提升效率。
CMS在Young Generation中使用的是mark-copy,而在Old Generation主要使用的是mark-sweep。
使用CMS的命令很簡單:
-XX:+UseConcMarkSweepGC
上面是列出的一些CMS的調優參數。
Serial garbage collection使用單一的線程來進行垃圾回收操作,其好處就是不需要和其他的線程進行交互。如果你是單核的CPU,那麼最好就是選擇Serial garbage collection,因為你不能充分利用多核的好處。同樣的它也常常用在比較小型的項目中。
Serial garbage collection在Young Generation中使用的是mark-copy,而在Old Generation主要使用的是 mark-sweep-compact。
下面是開啟命令:
-XX:+UseSerialGC
和serial GC類似,它在Young Generation中使用的是mark-copy,而在Old Generation主要使用的是 mark-sweep-compact。不同的是它是并行的。
可以通過下面的命令來指定併發的線程:
-XX:ParallelGCThreads=N
如果你是多核處理器,那麼Parallel GC可能是你的選擇。
Parallel GC是JDK8中的默認GC。而在JDK9之後, G1是默認的GC。
使用下面的命令來開啟Parallel GC:
-XX:+UseParallelGC
為什麼叫G1呢,G1=Garbage First,它是為替換CMS而生的,最早出現在java7中。
G1將heap區域劃分成為多個更小的區域,每個小區域都被標記成為young generation 或者old generation。從而運行GC在更小的範圍里運行,而不是影響整個heap區域。
可以使用下面的命令來開啟:
-XX:+UseG1GC
ZGC是一個可擴展的,低延遲的GC。ZGC是併發的,而且不需要停止正在運行的線程。
使用下面的命令來開啟:
-XX:+UseZGC
ZGC是在JDK11中被引入的。
小師妹:F師兄,你講了這麼多個GC,到底我該用哪個呢?
高射炮不能用來打蚊子,所以選擇合適的GC才是最終要的。這裏F師兄給你幾個建議:
如果你的應用程序內存本來就很小,那麼使用serial collector : -XX:+UseSerialGC.
如果你的程序運行在單核的CPU上,並且也沒有程序暫停時間的限制,那麼還是使用serial collector : -XX:+UseSerialGC.
如果對峰值期的性能要求比較高,但是對程序暫停時間沒多大的要求,那麼可以使用 parallel collector: -XX:+UseParallelGC。
如果更加關注響應時間,並且GC的對程序的暫停時間必須要小,那麼可以使用-XX:+UseG1GC。
如果響應時間非常重要,並且你在使用大容量的heap空間,那麼可以考慮使用ZGC: -XX:UseZGC。
本文介紹了幾種GC的算法,大家可以根據需要選用。
本文作者:flydean程序那些事
本文鏈接:http://www.flydean.com/jvm-gc-algorithms/
本文來源:flydean的博客
歡迎關注我的公眾號:程序那些事,更多精彩等着您!
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線
※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整
※南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!
※教你寫出一流的銷售文案?
※超省錢租車方案