6萬以內最高顏值,這款合資小車妹子看到絕對會被帥暈_網頁設計公司

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

飛鏢型的尾燈相信大家都不會陌生,內部依然是普通的鹵素燈泡,根據它的定位以及價格依然在情理之內。尾部造型和日產騏達又或者說是奔馳GLA非常的類似,輪拱外拋做出了一種寬體的感覺,運動感就體現出來了,而且保險杠採用了三色的設計,增添了一點活力。

日產瑪馳

近年來,日產在設計上採用年輕激進的設計,其中在藍鳥、騏達、天籟、西瑪這些車型由其明顯,非常的運動激進。而在最近巴黎車展中,日產把這種設計理念帶到了旗下的瑪馳上,這原本小巧可愛的小型車又會變成怎樣呢?

在外觀上,新一代瑪馳幾乎看不出上一代瑪馳的影子,車身尺寸稍微增長,但依然是處於小型車的範疇,車身線條從之前的圓潤變成現在的稜角分明,就像是一個小正太去健身房去健身回來,長了一身的肌肉。

採用日產最新的V-motion設計理念,車頭設計非常激進動感,

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

整體給人的感覺就像是一輛縮小版的日產藍鳥,更像是“憤怒的小鳥”,而且保險杠還有着前鏟的設計,平添了一些性能味,比起藍鳥還要動感。

車燈角位集成了“><”樣式的日間行車燈,非常的可愛。而且採用遠近光一體式前大燈,集成了透鏡,不知道這是否高配的專屬。

雙色的鋁合金輪轂和車身非常般配。

受制於車身尺寸,在長度上就別想着新一代瑪馳能有修長的車身線條了。在側面我們還可以看出這採用了溜背造型以及懸浮式車頂設計,相信能俘掠不少年輕人的心。

飛鏢型的尾燈相信大家都不會陌生,內部依然是普通的鹵素燈泡,根據它的定位以及價格依然在情理之內。

尾部造型和日產騏達又或者說是奔馳GLA非常的類似,輪拱外拋做出了一種寬體的感覺,運動感就體現出來了,而且保險杠採用了三色的設計,增添了一點活力。

內飾方面採用了大膽的多色拼接設計,極具活力。其次採用的是性能車多使用的D型方向盤。

動力方面,新一代瑪馳將會採用0.9T渦輪增壓發動機或者是1.0L自然吸氣發動機。價格方面極有可能維持原來的5.5-8萬的售價,在引進中國以後它或將成為該價位顏值的最高合資車,能受到不少年輕人追捧。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

硬虐哈弗H6!油耗低/空間大/優惠大的帥氣SUV車主們愛嗎?_網頁設計

台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

車主二購買車型:2016款 2。0TGI TST四驅旗艦版裸車價:16萬元滿意的地方:外觀算是時尚吧,而且有品位,比較有個性。內飾的設計布局還不錯。乘坐空間完全夠用,後排坐上三個成年大漢完全沒有問題,後排中間的底盤幾乎是平的。

對於MG這個品牌車型,有人說不好,有人說好,且撇去外觀而言,銳騰這個車型整體來說,還是一款比較有實力的產品,但由於知名度不算高,大家對此有稍微卻步,那麼這款車到底如何,車主告訴你。

上汽集團-銳騰

指導價:10.97-17.97萬

車身尺寸

長*寬*高:4500*1855*1675mm

軸距:2650mm

動力匹配

1.5T 169馬力 L4 + 6擋手動/7擋雙離合

2.0T 220馬力 L4 + 6擋雙離合

車主一

購買車型:2016款 1.5TGI TST豪華版

裸車價:12.57萬元

滿意的地方:外觀的話,蘿蔔青菜各有所愛,不過個人是越看越喜歡,特別是那翹翹的屁股。配置比較齊全,乘坐空間很不錯,前排可以翹腿的情況小,後排也不會壓抑。轉向很精準,運動感較強,跑高速挺穩的,動力很充足,隨叫隨到,超車什麼的很輕鬆,油耗不算高,綜合油耗在8個左右,性價比較高,買的時候2萬多的優惠。

不滿意的地方:內飾的材料有些廉價,較多的硬塑料,沒有配備胎壓監測,7擋雙離合在嚴重堵車的時候有頓挫感。

車主二

購買車型:2016款 2.0TGI TST四驅旗艦版

裸車價:16萬元

滿意的地方:外觀算是時尚吧,而且有品位,比較有個性。內飾的設計布局還不錯。乘坐空間完全夠用,

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

後排坐上三個成年大漢完全沒有問題,後排中間的底盤幾乎是平的。轉向低速輕,高速重,很穩,路感很清晰,動力很強勁,提速很快,畢竟是8秒能破百。8.7的綜合油耗,跟同級別的車型相比看,算低了。在這個價位上的車型而言,性價比算高,優惠較大。

不滿意的地方:內飾塑料感太強,減少了一些檔次,懸挂稍微有些硬,雙離合還是有一些頓挫感,後備箱的儲存空間小了一點。

編輯總結:銳騰的售價雖然比較高一些,但它的優惠幅度也是蠻大的,最高能去到2萬多點的優惠,算上優惠的話和同級別車型對比,那麼性價比就比較高了,除了內飾的用料確實不怎麼樣之外,在配置和空間這兩大選車要素都能滿足到現在消費的需求,在操控上,檔位比較清晰,響應很快,動力對於家用車來說,是滿出來的,由於偏向運動的調校,懸挂方面稍微硬了一些。總的來說,銳騰不算優惠的話確實貴了,但它的優惠幅度算是蠻大的,也許還能更大,這就看你的口才了,這樣對比下來,銳騰的可購買性也是不低的。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

老鷹谷_網頁設計公司

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

李青松供圖

之前,我從未見過上萬隻鷹聚群的壯觀場面。

那座山谷里的鷹多為蒼鷹,黑褐色,白羽尖,胸部密布灰褐與黑白相間橫紋。飛行時,雙翅寬闊,翼展蓬勃。細觀之,翅下灰白色,並間雜黑褐色橫帶。好威武的鷹啊!

那座山谷,在大西北天山腳下。早先,這座山谷沒有名字,當地人說起它時就叫“那塊地”。我去后認為不妥,這麼有故事的山谷怎麼可以沒有名字呢?應該有個名字呀,便曰之:老鷹谷。

當地村民都很贊同這個名字。於是,“老鷹谷”取代了“那塊地”,就被叫開了。

老鷹谷走向自西向東,兩邊是起伏的懸崖峭壁,裸岩猙獰。山谷是陡然沉下來的,沉到最底處,便是一條河了,蜿蜒曲折,河水靜靜地流着,滋潤着兩岸的萬物。胡楊,一副忍辱負重樣子,倔強地生長着。數不清的鷹棲在樹枝上,遠看如同樹上掛滿了黑褐色布條。紅柳,雖然個體纖細柔弱,但組成群落卻密密實實,以絕對多的數量,佔據着山谷里最惹眼的位置。它們在河水反襯下,泛着幽幽的暗紅色的光。紅柳叢中,跳躍着生命。野兔、野雞、沙斑雞、田鼠、刺蝟、旱獺、草蛇出沒其間。鷹,在高處盤旋,時而靜止不動,時而滑翔翻轉,一圈,一圈,又一圈,尋找抓捕時機。

老鷹谷的鷹可不好惹。性格暴烈,彪悍。

鷹的嘴和爪子如鐵一般,強勁有力,抓取獵物時,犹如疾風掃落恭弘=叶 恭弘般兇猛。鷹的身軀壯健而厚實,肌肉緊實,羽毛堅硬。它的姿態是軒昂而英挺的。在浩茫的天宇間,動作疾驟,快如閃電。在所有鳥類中,鷹是飛得最高的。

清晨,當第一縷陽光照亮老鷹谷的時候,也照亮了這片斧削般的峭壁。黑褐色的羽毛微微動了動,鷹便睜開了眼睛。

“丟——溜——溜——!”

“丟——溜——溜——!”

長長的唳嘯,喚醒了沉睡的山谷——新的一天開始了。

鷹巢築在懸崖峭壁上,這已經不是什麼秘密。牧羊人陳老爹知道,村民也知道。但是,沒有人把這當回事。

鷹巢像是一個平底筐,用橫七豎八的枯枝樹條,就那麼毫無規則毫無邏輯搭建而成。——不是凹下去的,而是雜亂無章胡亂堆起來的。“平底筐”往往建在兩塊岩石之間(那裡乾燥安靜,少有干擾),簡陋,粗鄙。看起來似乎並無多少道理,也沒有什麼美感。但是,錯了,如果我們都那麼認為,說明我們是多麼的愚蠢。其實,“平底筐”恰恰透着鷹的大智慧:穩固、牢靠、避風、避險、耐用。

從生存學的角度來看,也許,“平底筐”的實用價值遠大於美學價值。不過,“平底筐”的縫隙里也間或夾雜着一些羽毛,是為了裝飾?還是為了舒服?大概只有鷹自己知道吧。

老鷹谷的鷹,雖說不是作惡多端的壞東西,但有時它們也會惹是生非,令人討厭。

這天,陳老爹趕巴扎回來,手裡拿着一個鍋蓋大的饢,邊走邊吃,不覺間就進了老鷹谷。一不留神,陳老爹手裡的饢卻丟了。他回頭尋找,路上沒有,旁邊灌木叢沒有。饢哪裡去了呢?難道長了翅膀嗎?對了,饢真的長了翅膀。陳老爹抬頭向上看,原來,空中一隻老鷹叼着他的饢,正忽閃忽閃抖動翅膀嘲笑他呢。陳老爹很是生氣,撿起一塊石頭拋向空中,老鷹一驚,嘴巴一松,饢從空中滴溜溜落下來。陳老爹奮力去接,可沒接住,饢落在了一個沙坑裡。騰地一下,沙坑裡躥出一個黃色的影子,慌慌然逃進紅柳叢中。是野兔吧?也可能不是。

陳老爹拾起饢,用嘴吹吹了沙,接着,狠狠咬了一口,往下咽,卻噎住了,噎得直翻白眼。他挺了挺脖子,罵了一句:“狗日的老鷹!”

“丟——溜——溜——!”空中的鷹,排出幾粒屎,陳老爹躲閃不及,屎落在脖頸上。臭!

鷹是在故意羞辱陳老爹。這還沒完呢。

次日,陳老爹家雞窩裡的雞蛋被什麼賊偷吃了,光剩下空蛋殼殼。次日的次日,正在下蛋的蘆花老母雞又不見了。陳老爹忍着,沒言語,照舊在老鷹谷牧羊。可是,於崖壁的底端,陳老爹卻發現了一堆蘆花雞的羽毛。一片狼藉。

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

陳老爹怒火滿腔了。陳老爹打算給老鷹點顏色看看。某日,在老鷹谷里牧羊的陳老爹一眼瞥見了崖壁上的老鷹巢,便舉起牧羊的杆子要把它毀了,卻聽到“溜溜溜!”一聲喚。細觀之,崖壁上趴着一隻老鷹,掙扎着動了幾下,就又安靜了。

原來,那隻鷹的翅膀斷了。

鷹的眼神里沒了戾氣,卻滿是恐懼、無奈和哀傷。

陳老爹心軟了。

陳老爹爬上崖壁,把衣服脫下來罩住了受傷鷹的頭,抱回家。找出接骨木恭弘=叶 恭弘子,搗成糊糊,塗在鷹翅傷口處,再用繃帶小心翼翼地纏上。多日之後,在陳老爹細心照料下,老鷹翅膀上的傷口,漸漸癒合了。然而,在陳老爹看來,那隻鷹還相當虛弱,元氣和體力恢復尚需時日。陳老爹三天兩日,從鎮上屠宰場弄回一隻雞架子喂鷹。後來,雞架子漲價了,陳老爹的開銷有些吃緊,就去田裡下夾子夾老鼠給老鷹吃。傷筋動骨一百天,老鷹的傷終於養好,元氣和體力也恢復了,翅膀一抖動呼呼生風。陳老爹知道,老鷹又可以把雲和風踩在腳下,重返藍天了。

選了個晴朗的日子,陳老爹便把它放飛了。陳老爹徜徉於老鷹谷,心裏空落落的,悵然若失。

——這是多年以前的事情了。

因為鷹,老鷹谷里的草木,從沒有遭受過鼠害蟲害。老鷹谷麥田裡的麥穗粒粒飽滿,年年豐收。

頭一場春雨過後,老鷹谷沉浸在超乎想象的寧靜里。頭頂晴空水洗過一般,瓦藍瓦藍。那些胡楊,那些紅柳,又長出新恭弘=叶 恭弘,欣欣向榮。風彷彿是甜的,微微拂動着樹梢。

然而,想不到的事情發生了。嘭!陳老爹在追趕一隻走散的羊羔羔時不慎墜崖。從此,老鷹谷里不見了陳老爹的身影。

“丟——溜——溜——!”

“丟——溜——溜——!”

老鷹谷,不時傳來一聲聲凄涼的唳嘯。陳老爹並沒有摔死,而是摔斷了脊椎,再也不能健步如飛地行走,再也不能揮動着杆子牧羊了。在陳老爹養傷的日子里,家人清早開門時發現,門口總是有人隔三差五地丟下一隻野兔。

會是誰呢?

抬頭望天,一隻鷹在陳老爹家房子的上空,盤旋着。一圈,一圈,又一圈。久久不肯離去。

後來,每年四月間,老鷹谷就會出現上萬隻鷹聚群現象。

“丟——溜——溜——!”

“丟——溜——溜——!”

老鷹谷充滿喧囂。鷹鷹鷹鷹鷹。空中是鷹,胡楊枝頭是鷹,紅柳叢中是鷹,地上是鷹,河邊是鷹,麥田裡是鷹。鷹鷹鷹鷹鷹。如此多的鷹聚在一起,出現在這裏,到底是什麼原因呢?連鳥類專家也無法解釋。

我出差來老鷹谷看退耕還林,恰巧看到聚群的鷹。——唉,不禁吃驚地瞪大了眼睛。

生態需要空間的分佈,也需要時間的積累。修復了自然,也就治癒了自然。我隱隱感覺到,隨着生態系統的逐漸恢復和穩定,老鷹谷里,所有的美好,都會如期而至。

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

濮存昕馮滿天打通國樂與朗誦_網頁設計公司

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

1月2日,《聽見美·濮哥讀美文滿天昕光音樂朗誦會》在北京保利劇院精彩亮相,奉上一台融合朗誦、音樂和古今中外戲劇藝術的視聽盛宴。著名主持人白岩松也第三度受邀擔任演出主持人。

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

此次《聽見美·濮哥讀美文》音樂朗誦會名為“滿天昕光”,取自馮滿天和濮存昕兩位藝術家的名字,也寓意着2020年的聽見美·朗誦會如朝霞般美好燦爛。昨晚的演出在一群來自天成語言藝術學校的孩子們和滿天樂隊一起合作的兒童古詩朗誦中拉開帷幕。之後,在激蕩人心的即興阮聲伴奏下,濮存昕和馮滿天的樂隊一起默契配合出穿越古今又醇厚綿長的藝術和鳴,呈現出東坡居士《赤壁懷古》中“檣櫓灰飛煙滅”的萬丈豪情,贏得台下如潮掌聲。

關於這次合作,白岩松風趣透露道:“有的嘉賓來參加是應邀,而濮存昕面對馮滿天則是硬要。”濮存昕說:“在聽了他的演奏之後,感受到心靈的撞擊,我喜歡他的藝術,所以有了這次合作。”馮滿天也說:“音樂和文學從中國古代就密不可分。”下半場,“濮哥和他的朋友們”共同演繹的六部經典話劇作品片段也在此台演出中得以極為精彩地呈現。(記者王潤)

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

這些12萬級別車型人見人愛 肯降價3萬銷量絕對翻兩倍!_網頁設計公司

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

有着1。6L、1。2T以及1。6T三款發動機可供選擇,動力性能以及操控都可以說是這個級別的佼佼者,但是油耗較高是制約其銷量的原因之一,其次還有着後排較小以及售價較高的缺點。3觀致3觀致3可以說是奇瑞旗下最完美的汽車,積聚奇瑞所擁有最先進的技術,有着一個顏值不低的外觀,一個在同價位中設計細緻做工優秀的內飾,雖然發動機性能在合資汽車中算是一般,但是底盤卻是該價位的領導者之一,在操控性能上甚至要比起福特福克斯更為優秀,據悉是高薪挖了寶馬底盤工程師的結果。

緊湊型轎車

“叫好不叫座”,這樣的事情是經常發生在汽車行業中的,它們在性能上或者是配置上都有着過人之處,或者擁有着大賣的潛質。但是在實際銷售中,它們的銷量卻異常的慘淡,這是為什麼呢?又有着那些車是這樣呢?

對於很多人來說,馬自達3昂克賽拉就像是一個夢中情人一樣,有着姣好的面容、性感的身材,還不時能給以你激情,看似各方面都是非常的完美。但是在實際的銷售中,昂克賽拉的銷量可以說是相當的一般,相對於豐田卡羅拉、日產軒逸越超三萬的銷量,

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

昂克賽拉“只有”區區不到一萬的銷量,雖說還算不錯,但是要弱於他們不少的。原因首先是昂克賽拉真的如夢中情人一樣只能遠觀和單獨相處,後排空間非常局促,其次是高昂的售價、市場優惠小使得它一副高高在上的樣子,這樣就使得它銷量停滯不前。

308s是一輛濃郁異國風情的兩廂車,在外觀上非常的漂亮,能俘掠不少女性用戶的心,尾燈的設計往往讓人過目難忘。有着1.6L、1.2T以及1.6T三款發動機可供選擇,動力性能以及操控都可以說是這個級別的佼佼者,但是油耗較高是制約其銷量的原因之一,其次還有着後排較小以及售價較高的缺點。

觀致3

觀致3可以說是奇瑞旗下最完美的汽車,積聚奇瑞所擁有最先進的技術,有着一個顏值不低的外觀,一個在同價位中設計細緻做工優秀的內飾,雖然發動機性能在合資汽車中算是一般,但是底盤卻是該價位的領導者之一,在操控性能上甚至要比起福特福克斯更為優秀,據悉是高薪挖了寶馬底盤工程師的結果。但是這樣較高的性能也抵不過高昂售價帶來的影響,甚至比起合資轎車還要高的售價,以及4S店數量稀少,使得即使想要購買這款優秀的緊湊型轎車都成了大問題。

以上汽車歸根到底還是不能洞察我們消費者需求,對於我們來說一輛車最重要的是有着高可靠性、大空間以及親民的售價,這樣才是最為適合我們所購買的。本站聲明:網站內容來源於http://www.auto6s.com/,如有侵權,請聯繫我們,我們將及時處理

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

記一次使用windbg排查內存泄漏的過程_網頁設計公司

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

一、背景

  近期有一個項目在運行當中出現一些問題,程序順利啟動,但是觀察一陣子后發現內存使用總量在很緩慢地升高,

雖然偶爾還會往下降一些,但是總體還是不斷上升;內存運行6個小時候從33M上升到80M;

  程序存在內存泄漏是確定無疑的了,大概出問題的方向也知道,就是程序新加入一個採集協議(BACnet協議,MSTP_DLL),

但是怎麼把具體泄漏位置找出來卻非常麻煩,因為這個協議是封裝在一個C語言寫的動態庫中,想要單步調試好像不太可能,

況且源碼也不再我這裏;

  如果到此為止,推脫給其他同事找問題,那聯合調試費時不說。其他同事也身兼數職,不大可能有時間調試,

那項目推進肯定停滯;那沒辦法了,只能硬着頭皮上;網上了解一番,對於這種內存泄漏問題,比較好的處理方式就是

抓取內存快照,然後分析數據提交記錄,使用查看使用堆棧等信息;所以基於以上原因,選擇了windbg內核調試工具;

先分析一下看看,說不定可以發現問題;

 

二、windbg注意事項

1、首先要安裝對版本,即你的程序是32位還是64位,對於的windbg版本也要一致,否則會報錯;詳情了解:點擊這裏

2、需要用64位的任務管理器抓32位的dump文件,那不能直接在任務管理器右鍵“創建轉儲文件“,需要運行(C:\Windows\SysWOW64\taskmgr.exe)

3、或者直接在windbg上使用命令存儲,先附加到進程,然後使用命令:(.dump /ma c:\xxx.dmp),這樣就將快照保存在C盤了;

4、最重要的,要確保你的機器能連接外網;由於windbg的使用需要在線更新符號文件,但是這個地址剛好被國家防火牆屏蔽;

 

三、windbg必要設置

1、首先我先抓取2個內存快照文件(中間相隔一段時間),如下

 

 

2、打開windbg,設置符號下載路徑

將33.dmp直接拖進工作區即可,然後打開菜單File -> Symbol File Path

輸入地址:SRV*c:\symbols*http://msdl.microsoft.com/download/symbols

 

四、分析文件

1、分別打開兩個dmp文件,輸入命令!dumpheap -stat查看各種類型的內存分配情況

33.dmp
>.load C:\Windows\Microsoft.NET\Framework\v4.0.30319\SOS.dll >!dumpheap -stat ..... 61f87928 2292 34012 System.RuntimeType[] 5d2dbe74 267 34176 System.Data.DataColumn 61fd75e0 668 37408 System.Reflection.RuntimePropertyInfo 61f8426c 702 48976 System.Int32[] 5d2dcc24 70 72520 System.Data.RBTree`1+Node[[System.Data.DataRow, System.Data]][] 61f883e4 1242 84456 System.Reflection.RuntimeParameterInfo 61f8839c 2045 89980 System.Signature 0a7566bc 596 92976 HG.MacamUnit.Entity.TSubSysNodes 61f82788 723 117736 System.Object[] 61f89850 8 131696 System.Int64[] 61fd8938 2792 167520 System.Reflection.RuntimeMethodInfo 007988d0 220 434392 Free 61f824e4 12187 738904 System.String 61f85c40 2138 743067 System.Byte[] 61f82c60 294 6629796 System.Char[] Total 55014 objects
80.dmp
>.load C:\Windows\Microsoft.NET\Framework\v4.0.30319\SOS.dll
>!dumpheap -stat
.....
61f83698      876        24528 System.RuntimeType
61f84ec0      159        26472 System.Collections.Hashtable+bucket[]
61fc9020      631        27764 System.Reflection.RtFieldInfo
61f95be8       46        28392 System.Reflection.Emit.__FixupData[]
61f87928     2292        34012 System.RuntimeType[]
61fd75e0      668        37408 System.Reflection.RuntimePropertyInfo
5d2dcc24       42        43512 System.Data.RBTree`1+Node[[System.Data.DataRow, System.Data]][]
61f8426c      595        45868 System.Int32[]
61f883e4     1242        84456 System.Reflection.RuntimeParameterInfo
61f8839c     2045        89980 System.Signature
61f82788 622 113684 System.Object[] 61f89850 8 131696 System.Int64[] 61fd8938 2769 166140 System.Reflection.RuntimeMethodInfo 61f824e4 9800 676596 System.String 61f85c40 2064 705655 System.Byte[] 61f82c60 195 2369402 System.Char[] 007988d0 114 3338792 Free Total 47306 objects  

着重分析(紅色部分)這兩個文件的內存分配情況,似乎差別不大,完全看不出來80-33=近50M的內存消耗在哪裡;

但認真思考一下,這樣好像也沒有問題,因為System.***這種類型是C#環境獨有的,已知C#沒有內存泄漏,所以這裏沒有體現應該是正常的;

那C語言接口文件裡邊的問題該如何找出來呢?

 

2、再來試試!heap -s,查看各種堆的內存提交數據量

33.dmp

0:047> !heap -s
LFH Key                   : 0x343fce0b
Termination on corruption : ENABLED
  Heap     Flags   Reserv  Commit  Virt   Free  List   UCR  Virt  Lock  Fast 
                    (k)     (k)    (k)     (k) length      blocks cont. heap 
-----------------------------------------------------------------------------
00780000 00000002    8192   4636   8192    209  2484     4    0      e   LFH
002e0000 00001002     256      4    256      2     1     1    0      0      
00280000 00001002    1088     72   1088      5     2     2    0      0      
00c70000 00041002     256      4    256      2     1     1    0      0      
002d0000 00001002    1088    132   1088      8    23     2    0      0      
00450000 00001002     256      4    256      0     1     1    0      0      
07230000 00041002     256      4    256      2     1     1    0      0      
00c10000 00001002     256    216    256      3    39     1    0      0   LFH
09b50000 00001002     256     80    256     39    28     1    0      0      
09d00000 00001002      64      4     64      2     1     1    0      0      
09ef0000 00001002    1088     72   1088      6     2     2    0      0      
004c0000 00001002    1088    192   1088     15   140     2    0      0      
09760000 00041002     256     28    256      4     4     1    0      0      
09ed0000 00001002      64     12     64      1     1     1    0      0      
0b210000 00001002    3136   1456   3136     52    84     3    0      0   LFH
0a700000 00001002     256    212    256      2     1     1    0      0      
0e1e0000 00011002     256      4    256      0     1     1    0      0      
0d030000 00001002     256     16    256      3     1     1    0      0      
11b30000 00001002    1088    388   1088      0     1     2    0      0      
-----------------------------------------------------------------------------

 

80.dmp

0:051> !heap -s LFH Key : 0x343fce0b Termination on corruption : ENABLED Heap Flags Reserv Commit Virt Free List UCR Virt Lock Fast (k) (k) (k) (k) length blocks cont. heap ----------------------------------------------------------------------------- 00780000 00000002 8192 4808 8192 225 2505 4 0 f1 LFH 002e0000 00001002 256 4 256 2 1 1 0 0 00280000 00001002 1088 132 1088 4 6 2 0 0 00c70000 00041002 256 4 256 2 1 1 0 0 002d0000 00001002 1088 168 1088 12 26 2 0 0 00450000 00001002 256 4 256 0 1 1 0 0 07230000 00041002 256 4 256 2 1 1 0 0 00c10000 00001002 256 228 256 26 69 1 0 0 LFH 09b50000 00001002 256 80 256 39 25 1 0 0 09d00000 00001002 64 4 64 2 1 1 0 0 09ef0000 00001002 1088 132 1088 6 5 2 0 0 004c0000 00001002 1088 220 1088 26 173 2 0 0 09760000 00041002 256 28 256 4 8 1 0 0 09ed0000 00001002 64 12 64 1 1 1 0 0 0b210000 00001002 3136 1456 3136 74 71 3 0 0 LFH 0a700000 00001002 256 212 256 2 1 1 0 0 0e1e0000 00011002 256 4 256 0 1 1 0 0 0d030000 00001002 256 16 256 1 1 1 0 0 11b30000 00001002 47808 46068 47808 396 6836 7 0 0 -----------------------------------------------------------------------------

這次有異常了,可以看到11b30000這一行內存提交變化很大 47808 – 1088 = 46720;

這次可以肯定問題就在這個堆裡邊;

3、進去看看11b30000,使用命令:!heap -stat -h 11b30000

80.dmp


0:051> !heap -stat -h 11b30000 
 heap @ 11b30000
group-by: TOTSIZE max-display: 20
    size     #blocks     total     ( %) (percent of total busy bytes)
 1f0 102d9 - 1f58470 (92.48) 18 102b0 - 184080 (4.47) 10 102ae - 102ae0 (2.98)
    214 13 - 277c  (0.03)
    1000 2 - 2000  (0.02)
    800 2 - 1000  (0.01)
    220 1 - 220  (0.00)
    1d7 1 - 1d7  (0.00)
    80 3 - 180  (0.00)
    a4 1 - a4  (0.00)
    24 4 - 90  (0.00)
    14 4 - 50  (0.00)
    4a 1 - 4a  (0.00)
    25 2 - 4a  (0.00)
    48 1 - 48  (0.00)
    46 1 - 46  (0.00)
    41 1 - 41  (0.00)
    3e 1 - 3e  (0.00)
    3c 1 - 3c  (0.00)
    37 1 - 37  (0.00)

 

可以看到前面3項幾乎佔據99%的內存提交記錄;尤其以內存塊大小為1f0的數據塊使用最多內存;

到目前為止,我們知道了幾項有效信息,有大小分別為1f0、18、10的三種數據塊,不斷申請出新空間;

但是這樣還不夠,根據一個內存塊的大小並不能準確定位是哪裡出了問題,這是一個結構體?還是字符串?還是數組?

都不知道,所以有必要進去看看,有哪些地方使用到了這些數據塊

 

4、查看使用了1f0數據塊大小的位置列表,使用命令:!heap -flt s [size]

80.dmp

0:051> !heap -flt s 1f0
    _DPH_HEAP_ROOT @ 5a1000
    Freed and decommitted blocks
      DPH_HEAP_BLOCK : VirtAddr VirtSize
    Busy allocations
      DPH_HEAP_BLOCK : UserAddr  UserSize - VirtAddr VirtSize
    _HEAP @ 780000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        0078e5b8 0045 0000  [00]   0078e5e0    001f0 - (busy)
    _DPH_HEAP_ROOT @ 9d11000
    Freed and decommitted blocks
      DPH_HEAP_BLOCK : VirtAddr VirtSize
    Busy allocations
      DPH_HEAP_BLOCK : UserAddr  UserSize - VirtAddr VirtSize
    _HEAP @ 4c0000
    _DPH_HEAP_ROOT @ af41000
    Freed and decommitted blocks
      DPH_HEAP_BLOCK : VirtAddr VirtSize
    Busy allocations
      DPH_HEAP_BLOCK : UserAddr  UserSize - VirtAddr VirtSize
    _HEAP @ b210000
        0cf61680 0045 0045  [00]   0cf616a8    001f0 - (busy)
    _DPH_HEAP_ROOT @ d871000
    Freed and decommitted blocks
      DPH_HEAP_BLOCK : VirtAddr VirtSize
    Busy allocations
      DPH_HEAP_BLOCK : UserAddr  UserSize - VirtAddr VirtSize
    _HEAP @ d030000
    _DPH_HEAP_ROOT @ 11631000
    Freed and decommitted blocks
      DPH_HEAP_BLOCK : VirtAddr VirtSize
    Busy allocations
      DPH_HEAP_BLOCK : UserAddr  UserSize - VirtAddr VirtSize
    _HEAP @ 11b30000
        11b312e8 0045 0045  [00]   11b31310    001f0 - (busy)
        11b315a8 0045 0045  [00]   11b315d0    001f0 - (busy)
        11b356f8 0045 0045  [00]   11b35720    001f0 - (busy)
        11b35920 0045 0045  [00]   11b35948    001f0 - (busy)
        11b36f30 0045 0045  [00]   11b36f58    001f0 - (busy)
        11b37b58 0045 0045  [00]   11b37b80    001f0 - (busy)
        11b37e18 0045 0045  [00]   11b37e40    001f0 - (busy)
        11b3e4f0 0045 0045  [00]   11b3e518    001f0 - (busy)
        11b3f570 0045 0045  [00]   11b3f598    001f0 - (busy)
        11b3f830 0045 0045  [00]   11b3f858    001f0 - (busy)
        11b3faf0 0045 0045  [00]   11b3fb18    001f0 - (busy)
        11b3fdb0 0046 0045  [00]   11b3fdd8    001f0 - (busy)
        12890578 0045 0046  [00]   128905a0    001f0 - (busy)
        ......  

可以看到有很多堆都有使用到1f0大小的內存塊,但是只有最後一個堆 _DPH_HEAP_ROOT @ 11631000

是記錄最多的,滿屏都是,這裏只能截斷,選取一部分看看  

5、查看調用堆棧,使用命令:!heap -p -a [address]

80.dmp

0:051> !heap -p -a 11b3fdd8
    address 11b3fdd8 found in
    _HEAP @ 11b30000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        11b3fdb0 0046 0000  [00]   11b3fdd8    001f0 - (busy)
        Trace: 083a
        7405a6a7 verifier!AVrfpDphNormalHeapAllocate+0x000000d7
        74058f6e verifier!AVrfDebugPageHeapAllocate+0x0000030e
        77d10fe6 ntdll!RtlDebugAllocateHeap+0x00000030
        77ccab8e ntdll!RtlpAllocateHeap+0x000000c4
        77c73461 ntdll!RtlAllocateHeap+0x0000023a
        664668e5 msvcr90!_calloc_impl+0x00000125
        66463c5a msvcr90!calloc+0x0000001a

 
0:051> !heap -p -a 11b3fdd8
    address 11b3fdd8 found in
    _HEAP @ 11b30000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        11b3fdb0 0046 0000  [00]   11b3fdd8    001f0 - (busy)
        Trace: 083a
        7405a6a7 verifier!AVrfpDphNormalHeapAllocate+0x000000d7
        74058f6e verifier!AVrfDebugPageHeapAllocate+0x0000030e
        77d10fe6 ntdll!RtlDebugAllocateHeap+0x00000030
        77ccab8e ntdll!RtlpAllocateHeap+0x000000c4
        77c73461 ntdll!RtlAllocateHeap+0x0000023a
        664668e5 msvcr90!_calloc_impl+0x00000125
        66463c5a msvcr90!calloc+0x0000001a

 
0:051> !heap -p -a 11b3fb18
    address 11b3fb18 found in
    _HEAP @ 11b30000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        11b3faf0 0045 0000  [00]   11b3fb18    001f0 - (busy)
        Trace: 083a
        7405a6a7 verifier!AVrfpDphNormalHeapAllocate+0x000000d7
        74058f6e verifier!AVrfDebugPageHeapAllocate+0x0000030e
        77d10fe6 ntdll!RtlDebugAllocateHeap+0x00000030
        77ccab8e ntdll!RtlpAllocateHeap+0x000000c4
        77c73461 ntdll!RtlAllocateHeap+0x0000023a
        664668e5 msvcr90!_calloc_impl+0x00000125
        66463c5a msvcr90!calloc+0x0000001a  

  隨意挑選幾個查看調用堆棧,似乎沒有有用的特徵信息,verifier、ntdll、msvcr90這些都是操作系統內核級別的函數;

並不能暴露出使用1f0大小的數據塊大概位置,這就有點難辦了,難道此路不通?如果不找到有效堆棧信息,想定位

內心泄漏點,靠單步調試會相當麻煩。。。

  不急,先看看,這些地方內存塊內容是什麼,說不定能找到一些有效特徵信息;

使用命令:db [UserPtr]

80.dmp

0:051> db 11b3fb18
11b3fb18  00 00 04 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
11b3fb28  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
11b3fb38  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
11b3fb48  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
11b3fb58  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
11b3fb68  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
11b3fb78  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
11b3fb88  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0:051> db 11b3fdd8
11b3fdd8  00 00 04 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
11b3fde8  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
11b3fdf8  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
11b3fe08  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
11b3fe18  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
11b3fe28  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
11b3fe38  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
11b3fe48  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0:051> db 11b3fdd8
11b3fdd8  00 00 04 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
11b3fde8  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
11b3fdf8  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
11b3fe08  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
11b3fe18  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
11b3fe28  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
11b3fe38  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
11b3fe48  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................  

結果是令人失望的;

显示這些基本都是空白內存,裡邊已經沒有任何有效信息,,

陷入死衚衕里了,難道到此為止?

還不死心,我們再看看這些地址有沒有引用跟,如果有引用跟,也可以打印堆棧信息

使用命令:!gcroot [UserPtr]

80.dmp

0:051> !gcroot 11b3fb18
Found 0 unique roots (run '!GCRoot -all' to see all roots).
0:051> !gcroot 11b3fdd8
Found 0 unique roots (run '!GCRoot -all' to see all roots).
0:051> !gcroot 11b3fdd8
Found 0 unique roots (run '!GCRoot -all' to see all roots).

 願望是美好的,這個大小位1f0的數據塊被申請了0x102d9次,使用!gcroot命令查看得到貌似都是無引用的野數據

我們再來看看,這個 _DPH_HEAP_ROOT @ 11631000堆的創建堆棧

80.dmp

0:051> dt ntdll!_DPH_HEAP_ROOT CreateStackTrace 11631000
   +0x0b8 CreateStackTrace : 0x04d54f8c _RTL_TRACE_BLOCK
0:051> dds 0x04d54f8c 
04d54f8c  04d1b714
04d54f90  0000f801
04d54f94  000f0000
04d54f98  74058969 verifier!AVrfDebugPageHeapCreate+0x439
04d54f9c  77cbcea2 ntdll!RtlCreateHeap+0x41
04d54fa0  757356bc KERNELBASE!HeapCreate+0x50
04d54fa4  66463a4a msvcr90!_heap_init+0x1b
04d54fa8  66422bb4 msvcr90!__p__tzname+0x2a
04d54fac  66422d5e msvcr90!_CRTDLL_INIT+0x1e
04d54fb0  77c79264 ntdll!LdrpCallInitRoutine+0x14
04d54fb4  77c7fe97 ntdll!LdrpRunInitializeRoutines+0x26f
04d54fb8  77c7ea4e ntdll!LdrpLoadDll+0x472
04d54fbc  77cbd3df ntdll!LdrLoadDll+0xc7
04d54fc0  75732e6a KERNELBASE!LoadLibraryExW+0x233
04d54fc4  7562483c kernel32!LoadLibraryW+0x11
04d54fc8  6d3d18de*** WARNING: Unable to verify checksum for Win32Project1.dll
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for Win32Project1.dll - 
 Win32Project1+0x18de
04d54fcc  6d3d28fc Win32Project1!BACNet::Init+0x5c
04d54fd0  6d3d5925 Win32Project1!Init+0x25
04d54fd4  66639972*** WARNING: Unable to verify checksum for SMDB.dll
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for SMDB.dll - 
 SMDB!LogPop+0x12
04d54fd8  66639452 SMDB!CreateSharedMemory+0x12
04d54fdc  6d8e47bd clrjit!Compiler::impImportBlockCode+0x2aac [f:\dd\ndp\clr\src\jit32\importer.cpp @ 10258]
04d54fe0  6d8c2e6b clrjit!Compiler::impImportBlock+0x5f [f:\dd\ndp\clr\src\jit32\importer.cpp @ 13246]
04d54fe4  6d8c306a clrjit!Compiler::impImport+0x235 [f:\dd\ndp\clr\src\jit32\importer.cpp @ 14195]
04d54fe8  6d8c364f clrjit!Compiler::compCompile+0x62 [f:\dd\ndp\clr\src\jit32\compiler.cpp @ 2491]
04d54fec  6d8c4276 clrjit!Compiler::compCompileHelper+0x32f [f:\dd\ndp\clr\src\jit32\compiler.cpp @ 3615]
04d54ff0  6d8c43fc clrjit!Compiler::compCompile+0x2ab [f:\dd\ndp\clr\src\jit32\compiler.cpp @ 3086]
04d54ff4  6d8c45c8 clrjit!jitNativeCode+0x1f6 [f:\dd\ndp\clr\src\jit32\compiler.cpp @ 4057]
04d54ff8  6d8c377d clrjit!CILJit::compileMethod+0x7d [f:\dd\ndp\clr\src\jit32\ee_il_dll.cpp @ 180]
04d54ffc  633b39b3 clr!invokeCompileMethodHelper+0x10b
04d55000  633b3a8b clr!invokeCompileMethod+0x3d
04d55004  633b3ae8 clr!CallCompileMethodWithSEHWrapper+0x39
04d55008  633b3d97 clr!UnsafeJitFunction+0x431

動態庫Win32Project1.dll是對MSTP_DLL動態庫的再次封裝可以確定不存在內存泄漏問題;

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

看到這個堆是在於硬件設備通信的時候,初始化時CLR創建的線程;

不過知道這個好像也沒有什麼用,因為我們本來就知道是BACnet協議通信的動態庫有問題;

只能說明是初始化之後產生的內存泄漏;

 

但是為什麼這些無跟指針沒有被垃圾回收? 

但是仔細一想,好像也是正常,因為這些是可以明確的在C語言編寫的動態庫里申請的內存,屬於不受託管的內存;

C#垃圾回收也只能回收託管內存,所以這部分數據不主動釋放,那就會永遠在那裡;

但是現在,好像陷入死衚衕了,找不到思路,既然如此就先放放,先看看其他兩個數據塊的調用情況;

6、!heap -flt s 18

80.dmp

> !heap -flt s 18
...
        16f45098 000a 000a  [00]   16f450c0    00018 - (busy)
        16f45358 000a 000a  [00]   16f45380    00018 - (busy)
        16f45618 000a 000a  [00]   16f45640    00018 - (busy)
        16f458d8 000a 000a  [00]   16f45900    00018 - (busy)
        16f45b98 000a 000a  [00]   16f45bc0    00018 - (busy)
        16f46080 000a 000a  [00]   16f460a8    00018 - (busy)
        16f46118 000a 000a  [00]   16f46140    00018 - (busy)
        16f461b0 000a 000a  [00]   16f461d8    00018 - (busy)
        16f46248 000a 000a  [00]   16f46270    00018 - (busy)
        16f462e0 000a 000a  [00]   16f46308    00018 - (busy)
        16f46378 000a 000a  [00]   16f463a0    00018 - (busy)
        16f46410 000a 000a  [00]   16f46438    00018 - (busy)
        16f464a8 000b 000a  [00]   16f464d0    00018 - (busy)
        16f46548 000a 000b  [00]   16f46570    00018 - (busy)
        16f46808 000a 000a  [00]   16f46830    00018 - (busy)
        16f46ac8 000a 000a  [00]   16f46af0    00018 - (busy)
        16f46d88 000a 000a  [00]   16f46db0    00018 - (busy)
        16f47048 000a 000a  [00]   16f47070    00018 - (busy)
        16f47308 000a 000a  [00]   16f47330    00018 - (busy)
...

7、隨意挑幾個看看,命令:!heap -p -a [UserPtr]  

80.dmp

0:051> !heap -p -a 
invalid address  passed to `-p -a'0:051> !heap -p -a 16f460a8    
    address 16f460a8 found in
    _HEAP @ 11b30000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        16f46080 000a 0000  [00]   16f460a8    00018 - (busy)
        Trace: 074b
        7405a6a7 verifier!AVrfpDphNormalHeapAllocate+0x000000d7
        74058f6e verifier!AVrfDebugPageHeapAllocate+0x0000030e
        77d10fe6 ntdll!RtlDebugAllocateHeap+0x00000030
        77ccab8e ntdll!RtlpAllocateHeap+0x000000c4
        77c73461 ntdll!RtlAllocateHeap+0x0000023a
        664668e5 msvcr90!_calloc_impl+0x00000125
        66463c5a msvcr90!calloc+0x0000001a
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for MSTP_DLL.dll - 
        669baea1 MSTP_DLL!MSTP_Get_RPM_ACK_Data+0x00000091

 
0:051> !heap -p -a 16f46570    
    address 16f46570 found in
    _HEAP @ 11b30000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        16f46548 000a 0000  [00]   16f46570    00018 - (busy)
        7405a6a7 verifier!AVrfpDphNormalHeapAllocate+0x000000d7
        74058f6e verifier!AVrfDebugPageHeapAllocate+0x0000030e
        77d10fe6 ntdll!RtlDebugAllocateHeap+0x00000030
        77ccab8e ntdll!RtlpAllocateHeap+0x000000c4
        77c73461 ntdll!RtlAllocateHeap+0x0000023a
        664668e5 msvcr90!_calloc_impl+0x00000125
        66463c5a msvcr90!calloc+0x0000001a
        669baea1 MSTP_DLL!MSTP_Get_RPM_ACK_Data+0x00000091

 
0:051> !heap -p -a 16f46308
    address 16f46308 found in
    _HEAP @ 11b30000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        16f462e0 000a 0000  [00]   16f46308    00018 - (busy)
        Trace: 074b
        7405a6a7 verifier!AVrfpDphNormalHeapAllocate+0x000000d7
        74058f6e verifier!AVrfDebugPageHeapAllocate+0x0000030e
        77d10fe6 ntdll!RtlDebugAllocateHeap+0x00000030
        77ccab8e ntdll!RtlpAllocateHeap+0x000000c4
        77c73461 ntdll!RtlAllocateHeap+0x0000023a
        664668e5 msvcr90!_calloc_impl+0x00000125
        66463c5a msvcr90!calloc+0x0000001a
        669baea1 MSTP_DLL!MSTP_Get_RPM_ACK_Data+0x00000091  

這次很順利,這個內存使用的地方實在MSTP_DLL的 MSTP_Get_RPM_ACK_Data裡邊;這個就是我們要找的最終的內存泄漏點信息;

同樣操作堆10大小的數據塊操作一遍

80.dmp

> !heap -flt s 10
...
        15359fa0 0009 0009  [00]   15359fc8    00010 - (busy)
        1535a2a0 0009 0009  [00]   1535a2c8    00010 - (busy)
        1535a560 0009 0009  [00]   1535a588    00010 - (busy)
        1535aee8 0009 0009  [00]   1535af10    00010 - (busy)
        1535af80 0009 0009  [00]   1535afa8    00010 - (busy)
        1535b018 0009 0009  [00]   1535b040    00010 - (busy)
        1535b360 0009 0009  [00]   1535b388    00010 - (busy)
        1535b620 0009 0009  [00]   1535b648    00010 - (busy)
        1535c420 0009 0009  [00]   1535c448    00010 - (busy)
        1535d220 0009 0009  [00]   1535d248    00010 - (busy)
        1535d4e0 0009 0009  [00]   1535d508    00010 - (busy)
        1535d7a0 0009 0009  [00]   1535d7c8    00010 - (busy)
        1535da60 0009 0009  [00]   1535da88    00010 - (busy)
        1535dd20 0009 0009  [00]   1535dd48    00010 - (busy)
        1535dfe0 0009 0009  [00]   1535e008    00010 - (busy)
        1535e2a0 0009 0009  [00]   1535e2c8    00010 - (busy)
        1535e560 0009 0009  [00]   1535e588    00010 - (busy)
        1535e820 0009 0009  [00]   1535e848    00010 - (busy)
        1535eae0 0009 0009  [00]   1535eb08    00010 - (busy)
        1535eda0 0009 0009  [00]   1535edc8    00010 - (busy)
        1535f060 0009 0009  [00]   1535f088    00010 - (busy)
        1535f320 0009 0009  [00]   1535f348    00010 - (busy)
        1535f5e0 0009 0009  [00]   1535f608    00010 - (busy)
...
80.dmp

0:051> !heap -p -a 1535eb08    
    address 1535eb08 found in
    _HEAP @ 11b30000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        1535eae0 0009 0000  [00]   1535eb08    00010 - (busy)
        Trace: 0817
        7405a6a7 verifier!AVrfpDphNormalHeapAllocate+0x000000d7
        74058f6e verifier!AVrfDebugPageHeapAllocate+0x0000030e
        77d10fe6 ntdll!RtlDebugAllocateHeap+0x00000030
        77ccab8e ntdll!RtlpAllocateHeap+0x000000c4
        77c73461 ntdll!RtlAllocateHeap+0x0000023a
        664668e5 msvcr90!_calloc_impl+0x00000125
        66463c5a msvcr90!calloc+0x0000001a
        669bb07b MSTP_DLL!MSTP_Get_RP_ACK_Data+0x0000003b

 
0:051> !heap -p -a 1535f088    
    address 1535f088 found in
    _HEAP @ 11b30000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        1535f060 0009 0000  [00]   1535f088    00010 - (busy)
        Trace: 0817
        7405a6a7 verifier!AVrfpDphNormalHeapAllocate+0x000000d7
        74058f6e verifier!AVrfDebugPageHeapAllocate+0x0000030e
        77d10fe6 ntdll!RtlDebugAllocateHeap+0x00000030
        77ccab8e ntdll!RtlpAllocateHeap+0x000000c4
        77c73461 ntdll!RtlAllocateHeap+0x0000023a
        664668e5 msvcr90!_calloc_impl+0x00000125
        66463c5a msvcr90!calloc+0x0000001a
        669bb07b MSTP_DLL!MSTP_Get_RP_ACK_Data+0x0000003b

 
0:051> !heap -p -a 1535f348    
    address 1535f348 found in
    _HEAP @ 11b30000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        1535f320 0009 0000  [00]   1535f348    00010 - (busy)
        Trace: 0817
        7405a6a7 verifier!AVrfpDphNormalHeapAllocate+0x000000d7
        74058f6e verifier!AVrfDebugPageHeapAllocate+0x0000030e
        77d10fe6 ntdll!RtlDebugAllocateHeap+0x00000030
        77ccab8e ntdll!RtlpAllocateHeap+0x000000c4
        77c73461 ntdll!RtlAllocateHeap+0x0000023a
        664668e5 msvcr90!_calloc_impl+0x00000125
        66463c5a msvcr90!calloc+0x0000001a
        669bb07b MSTP_DLL!MSTP_Get_RP_ACK_Data+0x0000003b  

這次也順利拿到另一個內存泄漏的位置信息在MSTP_DLL的 MSTP_Get_RP_ACK_Data裡邊;  

MSTP_Get_RP_ACK_Data

MSTP_Get_RPM_ACK_Data

這兩個方法其實是讀取模塊點數值或者收集模塊信息的時候返回的一個數據指針;

現在很明顯這兩個方法返回的指針可能是有問題的,裡邊非常大的可能存在內存泄漏;

7、驗證

跟同事找到原來的MSTP_DLL的源碼,找到以上兩個方法體

 

 可以看到當初那位同事設計這個方法的時候,很明顯有2個錯誤;

1)返回的指針只見聲明內存空間,不見釋放;

2)返回數據的指針不應該在方法體中的返回值中傳出來,應該寫在方法參數中,外部聲明,傳進去賦值,然後外部使用,再外部釋放

3)兩個方法體都一樣的問題

 

五、整理

1)我們知道有三處內存泄漏,分別大小是1f0、18、10 

2)三者佔據99%的新增不釋放的內存消耗

3)我們已經找到其中兩個泄漏位置,還剩下一個

4)1f0是重中之重,佔據內存消耗92%,不解決這個BUG,問題基本就相當於沒解決

5)無法找到1f0的調用堆棧信息,無明顯特徵信息,無引用跟;

5)emmmmm? (第二聲)

 

好像被我們錯過了一個信息, 

是否還記得最開始那一段?

80.dmp

0:051> !heap -stat -h 11b30000 
 heap @ 11b30000
group-by: TOTSIZE max-display: 20
    size     #blocks     total     ( %) (percent of total busy bytes)
    1f0 102d9 - 1f58470  (92.48)
    18 102b0 - 184080  (4.47)
    10 102ae - 102ae0  (2.98)  

 這幾個數據很接近,都是申請次數大小,也就是說著三個數據塊被申請的次數差不多。。

鑒於此,我們再去看看33M內存的時候這幾個次數的值是多少

33.dmp

0:047> !heap -s
LFH Key                   : 0x343fce0b
Termination on corruption : ENABLED
  Heap     Flags   Reserv  Commit  Virt   Free  List   UCR  Virt  Lock  Fast 
                    (k)     (k)    (k)     (k) length      blocks cont. heap 
-----------------------------------------------------------------------------
00780000 00000002    8192   4636   8192    209  2484     4    0      e   LFH
002e0000 00001002     256      4    256      2     1     1    0      0      
00280000 00001002    1088     72   1088      5     2     2    0      0      
00c70000 00041002     256      4    256      2     1     1    0      0      
002d0000 00001002    1088    132   1088      8    23     2    0      0      
00450000 00001002     256      4    256      0     1     1    0      0      
07230000 00041002     256      4    256      2     1     1    0      0      
00c10000 00001002     256    216    256      3    39     1    0      0   LFH
09b50000 00001002     256     80    256     39    28     1    0      0      
09d00000 00001002      64      4     64      2     1     1    0      0      
09ef0000 00001002    1088     72   1088      6     2     2    0      0      
004c0000 00001002    1088    192   1088     15   140     2    0      0      
09760000 00041002     256     28    256      4     4     1    0      0      
09ed0000 00001002      64     12     64      1     1     1    0      0      
0b210000 00001002    3136   1456   3136     52    84     3    0      0   LFH
0a700000 00001002     256    212    256      2     1     1    0      0      
0e1e0000 00011002     256      4    256      0     1     1    0      0      
0d030000 00001002     256     16    256      3     1     1    0      0      
11b30000 00001002    1088    388   1088      0     1     2    0      0      
-----------------------------------------------------------------------------
0:047> !heap -stat -h 11b30000 
 heap @ 11b30000
group-by: TOTSIZE max-display: 20
    size     #blocks     total     ( %) (percent of total busy bytes)
    1f0 1f2 - 3c4e0  (86.13)
    18 1c9 - 2ad8  (3.82)
    1000 2 - 2000  (2.86)
    10 1c7 - 1c70  (2.54)
    214 c - 18f0  (2.23)
    800 2 - 1000  (1.43)
    220 1 - 220  (0.19)
    1d7 1 - 1d7  (0.16)
    80 3 - 180  (0.13)
    a4 1 - a4  (0.06)
    24 4 - 90  (0.05)
    14 4 - 50  (0.03)
    4a 1 - 4a  (0.03)
    25 2 - 4a  (0.03)
    48 1 - 48  (0.03)
    46 1 - 46  (0.02)
    41 1 - 41  (0.02)
    3e 1 - 3e  (0.02)
    3c 1 - 3c  (0.02)
    37 1 - 37  (0.02)  

 分別是1f2、1c9、1c7;

1f0:102d9 – 1f2 = 65767

18:102b0 – 1c9 = 65767

10:102ae – 1c7 = 65767

居然申請的次數一模一樣!

穩了!這個1f0可以斷定與其他兩個緊密相關;首先懷疑的就是

MSTP_Get_RP_ACK_Data

MSTP_Get_RPM_ACK_Data

1)這兩個方法體中使用到的所有子方法體有沒有申請空間的語句;

2)申請的空間大小是不是就是1f0;

 

依據上面的推測,再次閱讀那2個方法體;

 

 

 

 

經過分析BACNET_APPLICATION_DATA_VALUE結構體大小剛好就是1f0 

好了,搞定

 

如果對你有幫助,請點贊、評論;  

 

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

【Python】組合數據類型_網頁設計公司

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

集合類型

集合類型定義

集合是多個元素的無序組合

  • 集合類型與數學中的集合概念一致
  • 集合元素之間無序,每個元素唯一,不存在相同元素
  • 集合元素不可更改,不能是可變數據類型

    理解:因為集合類型不重複,所以不能更改,否則有可能重複。

集合是多個元素的無序組合

  • 集合用大括號 {} 表示,元素間用逗號分隔
  • 建立集合類型用 {}set()
  • 建立空集合類型,必須使用set()

集合操作符

操作符及應用 描述
S | T 並,返回一個新集合,包括在集合S和T中的所有元素
S – T 差,返回一個新集合,包括在集合S但不在T中的元素
S & T 交,返回一個新集合,包括同時在集合S和T中的元素
S ^ T 補,返回一個新集合,包括集合S和T中的非相同元素
S <= T 返回True/False,判斷S和T的子集關係
S < T 返回True/False,判斷S和T的子集關係
S >= T 返回True/False,判斷S和T的包含關係
S > T 返回True/False,判斷S和T的包含關係
S |= T 並,更新集合S,包括在集合S和T中的所有元素
S -= T 差,更新集合S,包括在集合S但不在T中的元素
S &= T 交,更新集合S,包括同時在集合S和T中的元素
S ^= T 補,更新集合S,包括集合S和T中的非相同元素

集合處理方法

操作函數或方法 描述
S.add(x) 如果x不在集合S中,將x增加到S
S.discard(x) 移除S中元素x,如果x不在集合S中,不報錯
S.remove(x) 移除S中元素x,如果x不在集合S中,產生KeyError異常
S.clear() 移除S中所有元素
S.pop() 隨機返回S的一個元素,更新S,若S為空產生KeyError異常
S.copy() 返回集合S的一個副本
len(S) 返回集合S的元素個數
x in S 判斷S中元素x,x在集合S中,返回True,否則返回False
x not in S 判斷S中元素x,x不在集合S中,返回True,否則返回False
set(x) 將其他類型變量x轉變為集合類型

集合類型應用場景

數據去重:集合類型所有元素無重複

序列類型

序列類型定義

序列是具有先後關係的一組元素

  • 序列是一維元素向量,元素類型可以不同
  • 類似數學元素序列: s0, s1, … , sn-1
  • 元素間由序號引導,通過下標訪問序列的特定元素

序列處理函數及方法

操作符及應用 描述
x in s 如果x是序列s的元素,返回True,否則返回False
x not in s 如果x是序列s的元素,返回False,否則返回True
s + t 連接兩個序列s和t
s*n 或 n*s 將序列s複製n次
s[i] 索引,返回s中的第i個元素,i是序列的序號
s[i: j]
s[i: j: k]
切片,返回序列s中第i到j以k為步長的元素子序列
函數和方法 描述
len(s) 返回序列s的長度,即元素個數
min(s) 返回序列s的最小元素,s中元素需要可比較
max(s) 返回序列s的最大元素,s中元素需要可比較
s.index(x)
s.index(x, i, j)
返回序列s從i開始到j位置中第一次出現元素x的位置
s.count(x) 返回序列s中出現x的總次數

元組類型及操作

元組是序列類型的一種擴展

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

  • 元組是一種序列類型,一旦創建就不能被修改
  • 使用小括號 ()tuple() 創建,元素間用逗號 , 分隔
  • 可以使用或不使用小括號

元組繼承序列類型的全部通用操作

  • 元組繼承了序列類型的全部通用操作
  • 元組因為創建后不能修改,因此沒有特殊操作
  • 使用或不使用小括號

列表類型及操作

列表是序列類型的一種擴展,十分常用

  • 列表是一種序列類型,創建后可以隨意被修改
  • 使用方括號 [] 或list() 創建,元素間用逗號 , 分隔
  • 列表中各元素類型可以不同,無長度限制
函數或方法 描述
ls[i] = x 替換列表ls第i元素為x
ls[i: j: k] = lt 用列表lt替換ls切片后所對應元素子列表
del ls[i] 刪除列表ls中第i元素
del ls[i: j: k] 刪除列表ls中第i到第j以k為步長的元素
ls += lt 更新列表ls,將列表lt元素增加到列表ls中
ls *= n 更新列表ls,其元素重複n次
函數或方法 描述
ls.append(x) 在列表ls最後增加一個元素x
ls.clear() 刪除列表ls中所有元素
ls.copy() 生成一個新列表,賦值ls中所有元素
ls.insert(i,x) 在列表ls的第i位置增加元素x
ls.pop(i) 將列表ls中第i位置元素取出並刪除該元素
ls.remove(x) 將列表ls中出現的第一個元素x刪除
ls.reverse() 將列表ls中的元素反轉

序列類型應用場景

數據表示:元組 和 列表

  • 元組用於元素不改變的應用場景,更多用於固定搭配場景
  • 列表更加靈活,它是最常用的序列類型
  • 最主要作用:表示一組有序數據,進而操作它們

元素遍歷

數據保護

  • 如果不希望數據被程序所改變,轉換成元組類型

字典

字典類型定義

  • 映射是一種鍵(索引)和值(數據)的對應
  • 鍵值對:鍵是數據索引的擴展
  • 字典是鍵值對的集合,鍵值對之間無序
  • 採用大括號{}dict()創建,鍵值對用冒號: 表示

{<鍵1>:<值1>, <鍵2>:<值2>, … , <鍵n>:<值n>}

<字典變量> = {<鍵1>:<值1>, … , <鍵n>:<值n>}
<值> = <字典變量>[<鍵>]
<字典變量>[<鍵>] = <值>
[ ] 用來向字典變量中索引或增加元素

字典處理函數及方法

函數或方法 描述
del d[k] 刪除字典d中鍵k對應的數據值
k in d 判斷鍵k是否在字典d中,如果在返回True,否則False
d.keys() 返回字典d中所有的鍵信息
d.values() 返回字典d中所有的值信息
d.items() 返回字典d中所有的鍵值對信息
d.get(k, <default>) 鍵k存在,則返回相應值,不在則返回 值
d.pop(k, <default>) 鍵k存在,則取出相應值,不在則返回 值
d.popitem() 隨機從字典d中取出一個鍵值對,以元組形式返回
d.clear() 刪除所有的鍵值對
len(d) 返回字典d中元素的個數

字典類型應用場景

映射的表達

  • 映射無處不在,鍵值對無處不在
  • 例如:統計數據出現的次數,數據是鍵,次數是值
  • 最主要作用:表達鍵值對數據,進而操作它們

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

盛世修典,築起民間文化長城_網頁設計公司

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

  民間藝人在進行藝術表演。資料圖片

  中國民間文學大系出版工程首批成果——《中國民間文學大系》12個示範卷 資料圖片

  2019年12月25日,中國民間文學大系出版工程(以下簡稱“大系出版工程”)首批成果發布會在人民大會堂舉行,發布了《中國民間文學大系》(以下簡稱《大系》)的12個示範卷,涉及神話、史詩、傳說、故事、歌謠、長詩、說唱、小戲、諺語、謎語、俗語和理論12個門類,共計1200多萬字。作為大系出版工程的成果,《大系》文庫是我國有史以來記錄民間文學數量最多、內容最豐富、種類最齊全、形式最多樣、最具活態性的文庫。

  最大規模的民間文學出版工程

  2017年1月,中辦國辦印發《關於實施中華優秀傳統文化傳承發展工程的意見》。作為《關於實施中華優秀傳統文化傳承發展工程的意見》的15個重點工程之一,大系出版工程在中宣部、中國文聯的領導下,由中國民間文藝家協會團結民間文學領域的專家學者具體實施。

  《大系》涉及神話、史詩、傳說、故事、歌謠、長詩、說唱、小戲、諺語、謎語、俗語、理論12大門類。首批出版的12個示範卷各門類分別一本,每本100萬字左右,共計1200多萬字、300餘幅圖片。12個示範卷分別為《神話·雲南卷(一)》《史詩·黑龍江卷·伊瑪堪分卷》《傳說·吉林卷(一)》《故事·河南卷·平頂山分卷》《歌謠·四川卷·漢族分卷》《長詩·雲南卷(一)》《說唱·遼寧卷(一)》《小戲·湖南卷·影戲分卷》《諺語·河北卷》《謎語·河南卷(一)》《俗語·江蘇卷(一)》《理論(2000—2018)·第一卷(總論)》。

  《大系》所收作品按照科學性、廣泛性、地域性、代表性的原則編選,在田野普查、文字記錄、圖片拍攝和音頻視頻等信息採集以及查閱大量歷史資料的基礎上,強調學術規範,把握民間文學的“活態性、生活性、歷史性和文化性”,注重《大系》內容的全面性、代表性、真實性,多維度、多向度、全方位展現了民間文學的歷史風貌與新時代人文精神。

  示範卷在內容、形式、類型等方面力求反映出民族風格和文化底蘊。比如,《長詩·雲南卷(一)》編選了彝、白、哈尼、傣、壯、苗、傈僳、拉祜、納西、瑤、藏、基諾等12個民族的30部反映婚姻愛情的敘事長詩,這些作品大多採集於20世紀五六十年代,演唱者多為少數民族歌手和民間藝人,並且首次將《宛納帕麗》《南波冠》《葫蘆信》校正為傣族“三大愛情悲劇”;《傳說·吉林卷(一)》中的180餘篇作品,均取自原始採集的資料,在文本規範上進行了重新梳理並增加註釋,盡可能地還原吉林地方文化特色和民間韻味,其中的人蔘傳說、漁獵傳說、淘金傳說和木幫傳說等都是吉林省的特色文化。

  《大系》文庫既有精緻的傳統紙媒產品,也在書中以二維碼的形式鏈接相關民間文學音視頻,拓展了紙質書的內容維度,從而演示活態傳承樣本。比如,在《史詩·黑龍江卷·伊瑪堪分卷》中,讀者可以通過視頻欣賞赫哲語說唱,了解被聯合國教科文組織列為“急需保護的非物質文化遺產名錄”的赫哲族古代部落時期關於征戰、遷徙、社會、生活等英雄史詩;《小戲·湖南卷·影戲分卷》收錄了“儀式性”“非儀式性”劇本及“混合本”135個,建立了視頻資料庫,以最大程度保留和還原各區縣小戲的地方韻味,並通過地域腔調延續歷史文脈。

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

  續存民族文化的集體記憶

  盛世修典是我國自古以來的文化傳統,從《詩經》到《樂府》,從《史記》到《四庫全書》,都為中華民族文化的延續作出了獨特貢獻。編纂出版民間文學大系的意義在於續存民族文化的集體記憶,傳承民族發展的文化基因,並努力實現從立檔存志、強基固本到實現中華優秀傳統文化創造性轉化、創新性發展的銜接和提升,進而築牢中華文化共同體。

  此次出版的《大系》“神話卷”,透過“神話中國”的視角展現了中華文明的構成;“史詩卷”中代代相傳的民族史詩,蘊含珍貴的集體記憶,也是民族語言的歷史文本;“傳說卷”里豐富的民間敘事,包含民間的價值理想、生活哲學;“故事卷”里的民間故事在變化的語境中呈現了歷史經驗、文化律動中永恆不變的存在;“歌謠卷”展現了生活之歌、自然之歌,是精神情感的記錄,也是中華民族語言的瑰寶;“長詩卷”在深入發掘和打撈的過程中萃取經典,體現了長詩佳作的魅力;“說唱卷”作品中樸實的語言、真摯的情感、鮮明的個性,展示了說唱文學演繹故事、塑造典型、表達心靈乃至揭示人性的力量;“小戲卷”讓人們進一步認識和體會民間小戲的審美品格、文化價值;“諺語卷”是文學樣式、文化現象的綜合呈現,短小精悍且充滿了生產生活的智慧;“謎語卷”全面展示了跟謎語相關的文化景觀,許多資料難得而又珍貴;“俗語卷”的作品反映民俗生活,具有地方風情,是對民間口頭語言的發掘梳理和研究;“理論卷”是21世紀以來我國民間文學界第一次對最新的理論研究成果進行大規模收集、整理、編纂、回顧。總之,口耳相傳的民間文學既是民族文化的活化石,又是一部發展中的民族生活史、文化史、思想史,聯繫着民族文化的源頭並指向廣闊的未來。

  文學總體上分為兩種:一種是個人用文字創作的,以書面傳播的文學;另一種是民間集體口頭創作的,口口相傳的民間文學。後者是前者的源頭,是根性的文學。中國民間文學大系,強調文學的民間性,反映的是中國社會生活的面貌。從某種程度上說,民間文學大系就是我們民間生活的百科全書,包含民俗學、歷史學、藝術學等學科內容,蘊含豐富的史料細節,可以為民族學、民俗學的研究提供基礎性資料和基本理論,可以作為人文社會研究的基礎文獻,也可以作為教材的資料基礎,有助於生動傳承民族文化,增強中華民族的文化認同感和凝聚力。

  民間文學研究整理的總動員

  中國民間文學大系出版工程是在中國民間文藝家協會70年文獻積累的基礎上實施的。中國民協的前身是成立於1950年的中國民間文學研究會,70年來民間文學一直是其關注重點。新中國成立以來,中國民協(包括其前身“民研會”)開展了3次大規模的民間文學搶救性調查、收集、整理工作,這包括1957年的民歌調查運動、20世紀80年代的中國民間文學“三套集成”(《中國民間故事集成》《中國歌謠集成》《中國諺語集成》)普查編纂工作和始自2002年的中國民間文化遺產搶救工程。

  在數十年採集整理民間文學資料的基礎上,中國民協組織實施中國民間文學大系出版工程,進一步對“中國口頭文學遺產数字化工程”数字化搶救和整理的11000餘冊、約18億字資料進行研究、整理和編纂,並補充和完善新世紀以來的民間文學作品。

  中國民間文學大系出版工程啟動之初,我們便成立了“大系出版工程”學術委員會、編纂出版工作委員會及12個編輯專家組,以把握民間文學的實質,尊重民間文學的規律,保障編纂出版的質量和水平。工程的實施以中國民協為主,同時各級民協上下聯動,充分調動高等院校、科研院所及有關部門和機構參与的积極性,團結全國各地近千名專家學者參与編纂,凝聚了一批民間文學的專家學者和愛好者,培養了一批有能力有擔當的民間文學梯隊人才。

  大系出版工程從啟動伊始就確立了“示範帶動”的方法。一方面,在具有突出優勢的省區市部署共計55個示範卷的編纂任務;另一方面,形成了《〈中國民間文學大系〉編纂工作規範及實施辦法》《中國民間文學大系授權書》《中國民間文學大系出版工程編纂出版工作流程和相關職責》《中國民間文學大系辦公室工作分工》《中國民間文學大系出版工程相關簡稱使用規範》等系統的工作規程,以保證各項工作科學規範開展。

  《大系》編纂過程中嚴守學術規範,尊重民間文化的發展規律,關注民間文學的“活態性、生活性、歷史性和文化性”,注重大系的全面性、代表性、真實性。同時,我們還不間斷地開展研討,舉辦培訓講座,僅2018年8月以來,就在各省區市召開示範卷編纂工作啟動會、座談會、研討會20餘次,保證了《大系》內容的學術性、專業性。

  經過近三年的辛勤工作,大系出版工程取得了顯著成果。截至2019年12月17日,全國共有134卷啟動了編纂工作,其中12個示範卷已經面世,還有34卷已進入審稿、修改階段,1卷已進入出版社編校環節,其餘卷本正在補充和修改。根據規劃,大系出版工程將在2025年前出版《中國民間文學大系》大型文庫,建成电子文獻數據庫,同時開發一批經典讀本、實用讀本、普及讀本和對外宣傳推介產品和衍生產品。

  (作者:潘魯生,系中國文聯副主席、中國民間文藝家協會主席、中國民間文學大系出版工程編纂出版工作委員會主任)

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

這些Java8官方挖過的坑,你踩過幾個?_網頁設計公司

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

導讀:系統啟動異常日誌竟然被JDK吞噬無法定位?同樣的加密方法,竟然出現部分數據解密失敗?往List裏面添加數據竟然提示不支持?日期明明間隔1年卻輸出1天,難不成這是天上人間?1582年神秘消失的10天JDK能否識別?Stream很高大上,List轉Map卻全失敗……這些JDK8官方挖的坑,你踩過幾個? 關注公眾號【碼大叔】,實戰踩坑硬核分享,一起交流!

@

目錄

  • 一、Base64:你是我解不開的迷
  • 二、被吞噬的異常:我不敢說出你的名字
  • 三、日期計算:我想留住時間,讓1天像1年那麼長
  • 四、List:一如你我初見,不增不減
  • 五、Stream處理:給你,獨一無二
  • 六、結尾:紙上得來終覺淺,絕知此事要躬行!
  • 推薦閱讀

一、Base64:你是我解不開的迷

出於用戶隱私信息保護的目的,系統上需將姓名、身份證、手機號等敏感信息進行加密存儲,很自然選擇了AES算法,外面又套了一層Base64,之前用的是sun.misc.BASE64Decoder/BASE64Encoder,網上的資料基本也都是這種寫法,運行得很完美。但這種寫法在idea或者maven編譯時就會有一些黃色告警提示。到了Java 8后,Base64編碼已經成為Java類庫的標準,內置了 Base64 編碼的編碼器和解碼器。於是乎,我手賤地修改了代碼,改用了jdk8自帶的Base64方法

import java.util.Base64;

public class Base64Utils {

    public static final Base64.Decoder DECODER = Base64.getDecoder();
    public static final Base64.Encoder ENCODER = Base64.getDecoder();

    public static String encodeToString(byte[] textByte) {
        return ENCODER.encodeToString(textByte);
    }

    public static byte[] decode(String str) {
        return DECODER.decode(str);
    }

}

程序員的職業操守咱還是有的,構造新老數據、自測、通過,提交測試版本。信心滿滿,我要繼續延續我 0 Bug的神話!然後……然後版本就被打回了。

Caused by: java.lang.IllegalArgumentException: Illegal base64 character 3f
    at java.util.Base64$Decoder.decode0(Base64.java:714)
    at java.util.Base64$Decoder.decode(Base64.java:526)
    at java.util.Base64$Decoder.decode(Base64.java:549)

關鍵是這個錯還很詭異,部分數據是可以解密的,部分解不開

Base64依賴於簡單的編碼和解碼算法,使用65個字符的US-ASCII子集,其中前64個字符中的每一個都映射到等效的6位二進制序列,第65個字符(=)用於將Base64編碼的文本填充到整數大小。後來產生了3個變種:

  • RFC 4648:Basic
    此變體使用RFC 4648和RFC 2045的Base64字母表進行編碼和解碼。編碼器將編碼的輸出流視為一行; 沒有輸出行分隔符。解碼器拒絕包含Base64字母表之外的字符的編碼。​
  • RFC 2045:MIME
    此變體使用RFC 2045提供的Base64字母表進行編碼和解碼。編碼的輸出流被組織成不超過76個字符的行; 每行(最後一行除外)通過行分隔符與下一行分隔。解碼期間將忽略Base64字母表中未找到的所有行分隔符或其他字符。
  • RFC 4648:Url
    此變體使用RFC 4648中提供的Base64字母表進行編碼和解碼。字母表與前面显示的字母相同,只是-替換+和_替換/。不輸出行分隔符。解碼器拒絕包含Base64字母表之外的字符的編碼。
S.N. 方法名稱 & 描述
1 static Base64.Decoder getDecoder()
返回Base64.Decoder解碼使用基本型base64編碼方案。
2 static Base64.Encoder getEncoder()
返回Base64.Encoder編碼使用的基本型base64編碼方案。
3 static Base64.Decoder getMimeDecoder()
返回Base64.Decoder解碼使用MIME類型的base64解碼方案。
4 static Base64.Encoder getMimeEncoder()
返回Base64.Encoder編碼使用MIME類型base64編碼方案。
5 static Base64.Encoder getMimeEncoder(int lineLength, byte[] lineSeparator)
返回Base64.Encoder編碼使用指定的行長度和線分隔的MIME類型base64編碼方案。
6 static Base64.Decoder getUrlDecoder()
返回Base64.Decoder解碼使用URL和文件名安全型base64編碼方案。
7 static Base64.Encoder getUrlEncoder()
返回Base64.Decoder解碼使用URL和文件名安全型base64編碼方案。

關於base64用法的詳細說明,可參考:https://juejin.im/post/5c99b2976fb9a070e76376cc

對於上面的錯誤,網上有的說法是,建議使用Base64.getMimeDecoder()Base64.getMimeEncoder(),對此我只能建議:老的系統如果已經有數據了,就不要使用jdk自帶的Base64了。JDK官方的Base64和sun的base64是不兼容的!不要替換!不要替換!不要替換!

二、被吞噬的異常:我不敢說出你的名字

這個問題理解起來還是蠻費腦子的,所以我把這個系統異常發生的過程提煉成了一個美好的故事,放鬆一下,吟詩一首!

最怕相思濃
一切皆是你
唯獨
不敢說出你的名字
— 碼大叔

這個問題是在使用springboot的註解時遇到的問題,發現JDK在解析註解時,若註解依賴的類定義在JVM加載時不存在,也就是NoClassDefFoundError時,實際拿到的異常將會是ArrayStoreException,而不是NoClassDefFoundError,涉及到的JDK里的類是AnnotationParser.java, 具體代碼如下:

private static Object parseClassArray(int paramInt, ByteBuffer paramByteBuffer, ConstantPool paramConstantPool, Class<?> paramClass) {
    Class[] arrayOfClass = new Class[paramInt];
    int i = 0;
    int j = 0;
    for (int k = 0; k < paramInt; k++){
        j = paramByteBuffer.get();
        if (j == 99) {
            // 注意這個方法
        	arrayOfClass[k] = parseClassValue(paramByteBuffer, paramConstantPool, paramClass);
        } else {
        	skipMemberValue(j, paramByteBuffer);
        	i = 1;
        }
    }
    return i != 0 ? exceptionProxy(j) : arrayOfClass;
}
private static Object parseClassValue(ByteBuffer paramByteBuffer, ConstantPool paramConstantPool, Class<?> paramClass) {
    int i = paramByteBuffer.getShort() & 0xFFFF;
    try
    {
        String str = paramConstantPool.getUTF8At(i);
        return parseSig(str, paramClass);
    } catch (IllegalArgumentException localIllegalArgumentException) {
        return paramConstantPool.getClassAt(i);
    } catch (NoClassDefFoundError localNoClassDefFoundError) {
         // 注意這裏,異常發生了轉化
        return new TypeNotPresentExceptionProxy("[unknown]", localNoClassDefFoundError);
    } catch (TypeNotPresentException localTypeNotPresentException) {
        return new TypeNotPresentExceptionProxy(localTypeNotPresentException.typeName(), localTypeNotPresentException.getCause());
    }
}

parseClassArray這個方法中,預期parseClassValue返回Class對象,但看實際parseClassValue的邏輯,在遇到NoClassDefFoundError時,返回的是TypeNotPresentExceptionProxy,由於類型強轉失敗,最終拋出的是java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy,此時只能通過debug到這行代碼,找到具體是缺少哪個類定義,才能解決這個問題。

筆者重現一下發現這個坑的場景,有三個module,module3依賴module2但未聲明依賴module1,module2依賴module1,但聲明的是optional類型,依賴關係圖如下:

上面每個module中有一個Class,我們命名為ClassInModuleX。ClassInModule3啟動時在註解中使用了ClassInModule2的類,而ClassInModule2這個類的繼承了ClassInModule1,這幾個類的依賴關係圖如下:

如此,其實很容易知道在module運行ClassInModule3時,會出現ClassInModule1的NoClassDefFoundError的,但實際運行時,你能看到的異常將不是NoClassDefFoundError,而是java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy,此時,若想要知道具體是何許異常,需通過debug在AnnotationParser中定位具體問題,以下展示兩個截圖,分別對應系統控制台實際拋出的異常和通過debug發現的異常信息。

控制台異常信息:

注意異常實際在紅色圈圈這裏,自動收縮了,需要展開才可以看到通過debug發現的異常信息:

如果你想體驗這個示例,可關注公眾號碼大叔和筆者交流。如果你下次遇到莫名的java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy,請記得用這個方法定位具體問題。

三、日期計算:我想留住時間,讓1天像1年那麼長

Java8之前日期時間操作相當地麻煩,無論是Calendar還是SimpleDateFormat都讓你覺得這個設計怎麼如此地反人類,甚至還會出現多線程安全的問題,阿里巴巴開發手冊中就曾禁用static修飾SimpleDateFormat。好在千呼萬喚之後,使出來了,Java8帶來了全新的日期和時間API,還帶來了Period和Duration用於時間日期計算的兩個API。

Duraction和Period,都表示一段時間的間隔,Duraction正常用來表示時、分、秒甚至納秒之間的時間間隔,Period正常用於年、月、日之間的時間間隔。

網上的大部分文章也是這麼描述的,於是計算兩個日期間隔可以寫成下面這樣的代碼:

// parseToDate方法作用是將String轉為LocalDate,略。
LocalDate date1 = parseToDate("2020-05-12");
LocalDate date2 = parseToDate("2021-05-13");
// 計算日期間隔
int period = Period.between(date1,date2).getDays();

一個是2020年,一個是2021年,你認為間隔是多少?1年?
恭喜你,和我一起跳進坑裡了(畫外音:裏面的都擠一擠,動一動,又來新人了)。
正確答案應該是:1天。

這個單詞的含義以及這個方法看起來確實是蠻誤導人的,一不注意就會掉進坑裡。Period其實只能計算同月的天數、同年的月數,不能計算跨月的天數以及跨年的月數。

正確寫法1

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

 long period = date2.toEpochDay()-date1.toEpochDay();

toEpochDay():將日期轉換成Epoch 天,也就是相對於1970-01-01(ISO)開始的天數,和時間戳是一個道理,時間戳是秒數。顯然,該方法是有一定的局限性的

正確寫法2

long period = date1.until(date2,ChronoUnit.DAYS);

使用這個寫法,一定要注意一下date1和date2前後順序:date1 until date2。

正確做法3(推薦)

 long period = ChronoUnit.DAYS.between(date1, date2);

ChronoUnit:一組標準的日期時間單位。這組單元提供基於單元的訪問來操縱日期,時間或日期時間。 這些單元適用於多個日曆系統。這是一個最終的、不可變的和線程安全的枚舉。

看到”適用於多個日曆系統“這句話,我一下子想起來歷史上1582年神秘消失的10天,在JDK8上是什麼效果呢?1582-10-15和1582-10-04你覺得會相隔幾天呢?11天還是1天?有興趣的小夥伴自己去寫個代碼試試吧。

打開你的手機,跳轉到1582年10月,你就能看到這消失的10天了。

四、List:一如你我初見,不增不減

這個問題其實在JDK里存在很多年了,JDK8中依然存在,也是很多人最容易跳的一個坑!直接上代碼:

public List<String> allUser() {
    // 省略
    List<String> currentUserList = getUser();
    currentUserList.add("碼大叔");
    // 省略
}

就是上面這樣一段代碼,往一個list里添加一條數據,你覺得結果是什麼呢?“碼大叔”成功地添加到了List里?天真,不報個錯你怎麼能意識到JDK存在呢。

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(AbstractList.java:148)

原因
因為在getUser方法里,返回的List使用的是Arrays.asList生成的,示例:

    private List<String> getUser(){
        return Arrays.asList("劍聖","小九九");
    }

我們來看看Arrays.asList的源碼

    @SafeVarargs
    @SuppressWarnings("varargs")
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }
 private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
   		private final E[] a;
        // 部分代碼略
        ArrayList(E[] array) {
            // 返回的是一個定長的數組
            a = Objects.requireNonNull(array);
        }
        // 部分代碼略
   }

很明顯,返回的實際是一個定長的數組,所以只能“一如你我初見”,初始化什麼樣子就什麼樣子,不能新增,不能減少。如果你理解了,那我們就再來一個栗子

   int[] intArr  = {1,2,3,4,5};
   Integer[] integerArr  = {1,2,3,4,5};
   String[] strArr = {"1", "2", "3", "4", "5"};
   List list1 = Arrays.asList(intArr);
   List list2 = Arrays.asList(integerArr);
   List list3 = Arrays.asList(strArr);
   System.out.println("list1中的數量是:" + list1.size());
   System.out.println("list2中的數量是:" + list2.size());
   System.out.println("list3中的數量是:" + list3.size());

你覺得答案是什麼?預想3秒鐘,揭曉答案,看跟你預想的是否一致呢?

list1中的數量是:1
list2中的數量是:5
list3中的數量是:5

是不是和你預想又不一樣了?還是回到Arrays.asList方法,該方法的輸入只能是一個泛型變長參數。基本類型是不能泛型化的,也就是說8個基本類型不能作為泛型參數,要想作為泛型參數就必須使用其所對應的包裝類型,那前面的例子傳遞了一個int類型的數組,為何程序沒有報編譯錯誤呢?在Java中,數組是一個對象,它是可以泛型化的,也就是說我們的例子是把一個int類型的數組作為了T的類型,所以在轉換后在List中就只有1個類型為int數組的元素了。除了int,其它7個基本類型的數組也存在相似的問題。

JDK里還為我們提供了一個便捷的集合操作工具類Collections,比如多個List合併時,可以使用Collections.addAll(list1,list2), 在使用時也同樣要時刻提醒自己:“請勿踩坑”!

五、Stream處理:給你,獨一無二

Java8中新增了Stream流 ,通過流我們能夠對集合中的每個元素進行一系列并行或串行的流水線操作。當使用一個流的時候,通常包括三個基本步驟:獲取一個數據源(source)→ 數據轉換→執行操作獲取想要的結 果,每次轉換原有 Stream 對象不改變,返回一個新的 Stream 對象(可以有多次轉換),這就允許對其操作可以 像鏈條一樣排列,變成一個管道。

項目上千萬不要使用Stream,因為一旦用起來你會覺得真屏蔽詞爽,根本停不下來。當然不可避免的,還是有一些小坑的。

假設我們分析用戶的訪問日誌,放到list里。

list.add(new User("碼大叔", "登錄公眾號"));
list.add(new User("碼大叔", "編寫文章"));

因為一些原因,我們要講list轉為map,Steam走起來,

private static void convert2MapByStream(List<User> list) {
    Map<String, String> map = list.stream().collect(Collectors.toMap(User::getName, User::getValue));
    System.out.println(map);
}

咣當,掉坑裡了,程序將拋出異常:

Exception in thread "main" java.lang.IllegalStateException: Duplicate key 碼大叔

使用Collectors.toMap() 方法中時,默認key值是不允許重複的。當然,該方法還提供了第三個參數:也就是出現 duplicate key的時候的處理方案

如果在開發的時候就考慮到了key可能重複,你需要在這樣定義convert2MapByStream方法,聲明在遇到重複key時是使用新值還是原有值:

    private static void convert2MapByStream(List<User> list) {
        Map<String, String> map = list.stream().collect(Collectors.toMap(User::getName, User::getValue, (oldVal, newVal) -> newVal));
        System.out.println(map);
    }

關於Stream的坑其實還是蠻多的,比如尋找list中的某個對象,可以使用findAny().get(),你以為是找到就返回找不到就就返回null?依然天真,找不到會拋出異常的,需要使用額外的orElse方法。

六、結尾:紙上得來終覺淺,絕知此事要躬行!

所謂JDK官方的坑,基本上都是因為我們對技術點了解的不夠深入,望文生義,以為是怎樣怎樣的,而實際上我們的自以為是讓我們掉進了一個又一個坑裡。面對着這些坑,我流下了學藝不精的眼淚!但也有些坑,確實發生的莫名其妙,比如吞噬異常,沒有理解JDK為什麼這麼設計。還有些坑,誤導性確實太強了,比如日期計算、list操作等。最後只能說一句:

紙上得來終覺淺,絕知此事要躬行!
編碼不易,且行且珍惜!

推薦閱讀

Try-Catch包裹的代碼異常后,竟然導致了產線事務回滾!
Redis 6.0 新特性-多線程連環13問!
報告老闆,微服務高可用神器已祭出,您花巨資營銷的高流量來了沒?
我成功攻擊了Tomcat服務器,大佬們的反應亮了

公眾號:碼大叔
資深程序員、架構師技術社區
微服務 | 大數據 | 架構設計 | 技術管理
個人微信:itmadashu

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

漂洋過海中國年,共繪文明交流對話絢麗景緻_網頁設計公司

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

隨着春節的臨近, “歡樂春節”系列活動在世界各地紅紅火火開展起來,年味十足,洋溢五洲。近年來,隨着中外人文交流走深走實,以春節為代表的中國節慶文化在世界上越來越深入人心,中華文化影響力持續擴大。

在聯袂演出中促進文化交流互鑒,在互動體驗中領略非遺魅力,在美食中愛上中華飲食文化,在展覽中欣賞中國藝術,在商貿中探索文化和旅遊發展的合作路徑……自2010年以來,“歡樂春節”系列活動不斷創新形式、豐富內容,已成為用文化語言講好中國故事、彰顯文化自信的重要文化品牌。“歡樂春節”的子品牌,如“行走的年夜飯”“藝術中國匯”“新春音樂會”“春節廟會”等也深受各國民眾歡迎。越來越多的海外民眾用漢語表達新春祝福,很多國家和地區持續多年舉辦“歡樂春節”系列活動,“歡樂春節”的受眾正在擴大。

越來越多的社會力量參与“歡樂春節”系列活動的組織開展,讓世界看到了更立體的中國。在文旅融合深入推進的當下,作為其中重要着力點的交流融合正在“歡樂春節”中得到彰顯。各國開展的特色活動從內容到形式上雖有差異,卻都以更加開放、自信的心態,傳播歡樂、和諧、對話、共享和共建人類命運共同體的價值理念,文化中國、美麗中國得以推介。

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

人文交流是中外民眾友好交往的橋樑。深化人文交流互鑒是消除隔閡誤解、促進民心相知相通的重要途徑,增進中外文化交流互鑒有利於夯實構建人類命運共同體的人文基礎。文化交流是多層次、雙向的,在推介中華優秀傳統文化的同時,也應該把外國的優秀文化成果請進來,實現良性互動。文化影響力是國家綜合國力的體現,增強中華文化的吸引力、增進中外人文交流,需要挖掘更多傳統文化資源,打造更多品牌。

習近平主席在亞洲文明對話大會開幕式主旨演講中指出:“交流互鑒是文明發展的本質要求。只有同其他文明交流互鑒、取長補短,才能保持旺盛生命活力。”

打破人文交流的壁壘,徜徉在不同文明的長河,啟發自己、豐富別人是激發文化創新活力的有效路徑。豐富和創新人文交流的內容與形式,既需要重要時間節點的濃墨重彩,也需要日常生活的潤物無聲。中華文化走出去需要聆聽世界的聲音,以更宏大的視野、更多元的視角、更豐富的表現手法、更具表現力的話語,探尋推進中外人文交流的突破口,共繪文明交流對話絢麗景緻。(黨雲峰)

本站聲明:網站內容來http://www.societynews.cn/html/wh/fq/,如有侵權,請聯繫我們,我們將及時處理

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。