老鷹谷_網頁設計公司

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

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

李青松供圖

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

陳老爹心軟了。

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

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

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

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

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

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

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

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

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

會是誰呢?

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

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

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

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

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

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

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

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

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

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

女生適合學編程嗎?_網頁設計公司

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

二哥,你好,我 Java 是自學的,現在很迷茫,頭髮越掉越多,還是單身狗,真怕再學下去就嫁不出去了。

以上是一個妹子私信我的內容,看完后覺得蠻感慨的。就來談談這個話題吧:女生到底適不適合學編程?

按照我目前的理解來看,編程屬於腦力活動,女生在這方面好像沒有什麼劣勢。假如非要把編程定義為體力勞動的話,我想巾幗不會讓鬚眉的,畢竟你看男足有多差,女足就有多優秀。

最近一段時間,找我說自己迷茫的小夥伴非常多,有女生,當然也有男生。也就是說,迷茫對性別沒有歧視。

小夥伴們之所以迷茫,除了自身能力之外,和大環境不無關係,畢竟社會是一個整體,哪一個環節出了問題,其他環節肯定會受到不同程度的影響,這是必然的。

你比如說,我就發現,朋友圈的微商多了起來。有些人生意做得不錯,紅紅火火,有些就比較慘淡了。

如果說本職工作蒸蒸日上的話,恐怕分到別處的精力就不會很多。拿我來說吧,之所以能夠保持高頻(母豬似的)的創作,很大一部分原因就是因為公司的業務停滯不前,頻臨倒閉——這是一件挺讓我不爽的事,沒辦法,為了生活,只能把更多的經歷投入到寫作上面。不過這沒什麼,我也不需要遮遮掩掩的,編程相關的寫作前程挺好的。

我這麼說,就是告訴小夥伴們一個事實,無論是男性還是女性,大家都不容易,迷茫是現階段最正常不過的狀態了。迷茫並不一定是壞事,對吧?它意味着你對自身感到不滿,對現狀感到不滿,直白點說,就是你想進步了。那麼一旦你提前做好了心理建設,從迷茫的困境中走出來,你可能就脫穎而出了。

就我的程序生涯來說,女性程序員確實沒有男性多,但這並不意味着女生就不適合學編程。有些女生心思細膩,寫出來的代碼就會更簡潔,bug 更少。

另外,我可以肯定一點的是,掉不掉頭髮真的與編程無關,我就覺得自己發量挺充足的——之前朋友圈爆過照,很多小夥伴都調侃我不是程序員,因為髮型不太配,超出了他們的預期。我上高中那會還有不少白頭髮,這些年完全沒有了——有點返老回童的感覺。

如果真的是掉頭髮,我想編程不是嫌疑犯,過大的壓力、糟糕的精神狀態才是。無論從事什麼職業,總要樂觀一點,心態放輕鬆一點。

我就認識這樣一個女程序員,看她曬的電腦桌,我的口水就要流出來了,非常優雅和高貴,真真自愧不如啊。她平常還會在朋友圈曬一些自製的咖啡(帶拉花的那種),總之,給人的感覺就是挺會生活的,偶爾寒暄幾句,也可以感受到她愜意的生活品質。

女生嘛,不能說把時間全部花費在容貌的搭理上,但至少應該花一些心思,一個美美的自己,一個美美的心情,學編程也許就會變得更輕鬆自如了。

至於對象嘛,女生完全不用發愁,愁的應該是男生才對啊。真需要的話,我在公眾號喊一聲,我怕踴躍報名的男生能把妹子的微信加爆,搞不好微信都要封號處理。

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

我在想,以後有機會,遇到特殊的日子,比如說 520,小夥伴們就可以提前私信我,“二哥,明天我要報名相親,這是我的工資單,這是我的照騙,你看能不能匹配一下。”沒準我就幫大家脫單了,也算是網絡一線牽了。

至於編程難不難,反正我覺得不容易,這恐怕是程序員高薪最重要的一個原因了。至於編程累不累,我想和學生做作業是一個道理,不會的學生永遠都累。

再來說說工作,女性在職場上,因為生理方面的因素,會受到一些歧視。但我總覺得這是社會的偏見,女性要學會自尊自愛,男性要學會尊重客觀,性別上的差異不應該成為職場上的阻礙。

在人類漫長的發展進程中,有一位女性值得所有人銘記,那就是居里夫人,首位獲得諾貝爾獎(物理和化學,兩次)的女性。在我看來,她最偉大的貢獻不是這些,而是她改變了世界對女性的看法:誰說女性就不適合搞化學、搞物理?

下面是我對女生學編程的一些建議,有些也適合男生了。

誠實點說吧,我對編程算不上感興趣。但當我確信編程能夠養家糊口后,我就願意為編程傾其所有。這麼多年過去了,我深刻地認識到,我只能幹好編程這一件事,如果說還有一件的話,就是寫編程相關的文章。

所以,如果編程是你的第一興趣,那太完美了!但如果不是,也可以像我一樣,漸漸地愛上它,盡自己最大的努力做好它。

既然選擇了遠方,便只顧風雨兼程。真的,別怕。至於這個過程辛不辛苦,有所謂嗎?談戀愛辛苦嗎?我有時候想想,談戀愛真的比編程還要辛苦,但也有甜蜜和幸福啊。

至於生理期,實在是說不下去了,我能說的就是盡量早睡早起,該鍛煉鍛煉。

至於聰不聰明,喜不喜歡編程,有沒有意志力,心能不能靜下來,環境糟不糟糕,和性別完全沒有關係,不管是女生還是男生,如果把借口放在最前面,恐怕編程學不好,其他任何一個行業都學不好。

我是有這麼一個打算,假如今年高考結束后,我妹妹找不到她的興趣愛好,我就建議她學編程去,最次最次,還有我這個哥哥可以教教她,對吧?

反正如果有女生遇到編程問題諮詢我的話,我肯定第一時間衝過去。(逃逃逃

如果覺得文章對你有點幫助,請微信搜索「 沉默王二 」第一時間閱讀。回復關鍵字「簡歷」更有一份技術大佬整理的優質簡歷模板,助你一臂之力。

本文已收錄 GitHub,傳送門~ ,裏面更有大廠面試完整考點,歡迎 Star。

我是沉默王二,一枚有顏值卻靠才華苟且的程序員。關注即可提升學習效率,別忘了三連啊,點贊、收藏、留言,我不挑,嘻嘻

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

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

SpringBoot獲取配置文件,就這麼簡單。_網頁設計公司

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

在講SpringBoot 獲取配置文件之前我們需要對SpringBoot 的項目有一個整體的了解,如何創建SpringBoot 項目,項目結構等等知識點,我在這裏就不一一講述了,沒有學過的小夥伴可以自己在網上找一些資料進行學習,很簡單的。

下面讓我們開始今天的內容講解吧。

一、SpringBoot 全局配置文件的加載順序

在SpringBoot 當中,全局配置文件有兩種不同的格式,一個是我們常見的properties, 一種是yml.
這兩種格式的文件其實也沒什麼太大的區別,使用的時候按照個人的習慣來就行,下面我們用的是yml文件。
首先,當我們創建SpringBoot 的項目時,默認在resources目錄下創建一個application.properties文件,這時我們可以在這個文件當中對項目進行配置即可。但是在SpringBoot 中application.properties可以存放在以下幾個位置:

file:./config/ 項目根目錄下的config文件夾下

file:./ 項目根目錄下

classpath:/config/ 類路徑下的config文件夾下

classpath:/ 類路徑下

文件的加載順序:即根目錄下的config目錄下,然後是 根目錄下,然後是classpath路徑下的config目錄下,最後是classpath路徑下。

優先級由高到低,高優先級的配置會覆蓋低優先級的配置。

假如:根目錄下的config目錄下定義端口為8084, 根目錄下定義端口為8083 ,classpath路徑下的config目錄定義端口為8082,classpath路徑下定義端口為8081,最後啟動,啟動的端口為8084 ,高優先級會覆蓋低優先級。

注意: 並不是高優先級的被加載了,低優先級的就不會再加載,實際上是SpringBoot會從這四個位置全部加載主配置文件,並且還能產生互相配置的效果。

除此外,我們還可以通過spring.config.location來改變默認的配置文件位置。

項目打包好以後,我們可以使用命令行參數的形式,啟動項目的時候來指定配置文件的新位置;指定默認加載的這些配置文件共同起作用形成互補配置。

在 G盤目錄下,創建一個application.yml文件,定義端口為8085

打包項目,啟動命令行:java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.yml 回車運行。

外部配置加載順序

  1. 命令行參數

    eg: java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --server.port=8087

—- 由jar包外向jar包內進行尋找:

​ 2、 優先加載帶profile

jar包外部的 application-{profile}.properties或application.yml(帶spring.profile)配置文件

將打好的jar包放在一個目錄下,然後再該文件夾下新建一個名為application.yml的文件,其中指定

port為8082 ,訪問路徑為/boot ,然後命令行直接啟動項目。java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --application.yml

在講配置文件之前,我先說一說yml文件配置信息書寫格式

基本數據類型(8種基本數據類型)以k: v 形式書寫即可

比如我在一個實體類(Person)中定義一個 屬性(age),類型是 int ,在yml文件中的書寫格式如下

person:
  age: 20

實體類對象(Person),Map ,k:v 在下一行來寫對象的屬性和值的關係,注意縮進

person:
  userName: zhans
  age: 20
#另一種行內寫法  
person: {userName: zhans.age: 20}  

List ,數組的書寫,注意 – 後有空格

pets:
 - cat
 - dog
 - pig
#另一種行內寫法  
pets:{cat,dog,pi}

二、SpringBoot 獲取配置文件的方式

**@Value **

創建配置類,由於篇幅問題這裏省略了 setter、getter 方法,但是實際開發中這個是必須的,否則無法成功注入,@Component表示把當前配置類注入到Spring容器當中。

@Component
public class PersonConfig {

    @Value("${person.userName}")
    private String userName;
    @Value("${person.age}")
    private int age;
    
}

在主配置文件中添加如下配置(application.yml)

server:
  port: 8081
person:
  userName: hello
  age: 20

測試類:

@RestController
public class PersonController {
    @Autowired
    private Person person;

    @RequestMapping(value = "/get",method = RequestMethod.GET)
    public String findPerson(){
        return "姓名:"+person.getUserName()+"年齡:"+person.getAge();
    }
}

啟動項目,訪問地址http://localhost:8080/get運行結果:

姓名:hello年齡:20

所以,我們就可以通過 @Value(${key})的方式獲取全局配置文件中的指定配置項。

@ConfigurationProperties

如果我們需要取 許多個配置項,通過 @Value 的方式去配置項需要一個一個去取,顯然有點麻煩。所以我們可以使用 @ConfigurationProperties

標有 @ConfigurationProperties的類的所有屬性和配置文件中相關的配置項進行綁定,綁定之後我們就可以通過這個類去訪問全局配置文件中的屬性值。

代碼實例如下:

  1. 在主配置文件中添加如下配置
user:
  username: admin
  password: 123456
  map: {k1: v1,k2: v2}
  list:
    - cat
    - dog
  person:
    userName: hello
    age: 20
  objects:
    - aaa
    - bbb
    - ccc
  1. 創建配置類,由於篇幅問題這裏省略了 setter、getter ,toString 方法,但是實際開發中這個是必須的,否則無法成功注入。
@Component
@ConfigurationProperties(prefix = "user")
public class User {
    private String  username;
    private String password;
    private Map<String,String> map;
    private Person person;
    private List<String> list;
    private Object[] objects;

}

這裏 @ConfigurationProperties 有一個 prefix參數,主要是用來指定該配置項在配置文件中的前綴,即user。

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

測試類

@RestController
public class PersonController {
    @Autowired
    private Person person;
    @RequestMapping(value = "/findUser",method = RequestMethod.GET)
    public String findUser(){
        return user.toString();
    }
}

我們在頁面訪問 http://localhost:8081/findUser,頁面就显示我們在yml文件中配置的信息了。

User{username='admin', password='123456', map={k1=v1, k2=v2}, person=com.zfcoding.config.Person@93471e6, list=[cat, dog], objects=[aaa, bbb, ccc]}

以上的兩種方式有什麼區別呢?

@ConfigurationProperties @Value
功能 批量注入配置文件的屬性 一個一個指定
鬆散綁定 支持 不支持
JSR303數據校驗 支持 不支持
複雜數據封裝 支持 不支持(Map)

鬆散綁定,username 可以用user-name 表示,來獲取值

JSR303數據校驗,如果用@Value獲取全局配置文件的屬性,使用@Validated文件格式校驗是不起作用的。

@PropertySource 註解加載指定的配置文件。

​ @PropertySource (value = “ ”) 指明加載類路徑下的哪個配置文件來注入值

創建配置類,由於篇幅問題這裏省略了 setter、getter ,toString 方法,但是實際開發中這個是必須的,否則無法成功注入。

@Component
@PropertySource( "classpath:student.properties")
@ConfigurationProperties(prefix = "student")
public class Student {

    private String sname;
}

在student.properties文件中添加如下配置

student.sname=admin

測試類

@SpringBootTest
class SpringbootExampleApplicationTests {
    @Autowired
    private DogConfig dogConfig;
    @Test
    void contextLoads() {
       System.out.println("注入的對象:"+dogConfig.getName());
    }

}

運行結果:

Student{sname='admin'}

@ImportResource 導入Spring 配置文件

@ImportResource 註解用來導入 Spring 的配置文件,如果Spring配置文件 “bean.xml”,從而讓配置文件裏面的內容生效,通常可以把@ImportResource標註在@SpringBootApplication的啟動類上即可。

舉例說明:比如我們把PersonService注入到Spring容器當中,通過Spring配置文件的方式操作,代碼示例如下:

public class PersonService {
}
@ImportResource("classpath:bean.xml")
@SpringBootApplication
public class SpringBootConfigApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootConfigApplication.class, args);
    }

}

Spring的配置文件:bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 <bean id="personService" class="com.zfcoding.service.PersonService"></bean>
</beans>

測試的案例:

@SpringBootTest
class SpringBootConfigApplicationTests {
    @Autowired
    private PersonService personSerivcer;
    @Test
    void contextLoads() {
        System.out.println("注入的對象:"+personSerivcer);
    }
}

運行的結果:

注入的對象:com.zfcoding.service.PersonService@5b84f14

這Spring 中bean的配置實現,但是SpringBoot 推薦我們使用註解開發,那Springboot 中註解是如何實現bean 的注入呢?

@Configuration:指明當前類是配置類,就是代替上面說到的spring的配置文件.

@Bean 將方法返回值添加到容器當中,容器中這個組件默認的id 是方法名

@Configuration
public class MyConfig {
    @Bean
    public PersonSerivcer personSerivcer(){
        return new PersonSerivcer();
    }
}

這樣就可以就可以通過註解實現代替Spring 中的配置文件了。

三、SpringBoot 的Profile

我們這裏就以yml文件為例

第一種是我在 主配置文件編寫的時候,文件名可以是 application-{profile}.yml(application-dev.yml, application-prod.yml) ,默認使用 文件application.yml 的配置

1、如果我們想要使用的application-dev.yml 全局配置文件,在application.yml 指定即可。

配置實例:

在application.yml 配置文件中添加如下配置

spring:
  profiles:
    active: dev

在application-dev.ym 配置文件中添加如下配置l

server:
  port: 8080
#應用訪問的項目路徑
  servlet:
    context-path: /boot
person:
   username: 佔山

2、yml支持多文檔快方式

那麼,在application-dev.ym 配置文件中添加如下配置l

spring:
  profiles:
    active: prod
---
server:
  port: 8080
  servlet:
    context-path: /zf
spring:
  profiles: dev
---
person:
  userName: 啊哈
server:
  port: 8081
  servlet:
    context-path: /boot
spring:
  profiles: prod

3、Program arguments

   在Program arguments中配置參數

–spring.profiles.active=dev

4、虛擬機的方式

在VM options下使用命令:-Dspring.profiles.active=prod

四、小結

實際開發中我們如果如果我們需要取 許多個配置項,就使用@ConfigurationProperties註解,如果只是注入一個屬性就使用@Value,

@PropertySource 註解加載指定的配置文件,@ImportResource 導入Spring 配置文件(這裏可以使用註解來替代)。

後記

由於本人能力有限,若文章有錯誤的地方,請大家指出,一起交流學習。今天就和大家講到這裏,喜歡我的小夥伴們,動動你的小手點個關注唄。

歡迎大家關注我的公眾號:阿福聊編程,長期更新Java各種技術文章。

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

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

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

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

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

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

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

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

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

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

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

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

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

8 核打贏 10 核,外媒發現 Core i7-11700KF 在《奇點灰燼》遊戲中的跑分跟 Core i9-10900K 差不多_網頁設計公司

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

Intel 最新的一代處理器 Rocket Lake-S 架構預計會在明年初跟大家見面,算算時間也近了。最近外媒發現第 11 代處理器中的旗艦款 Core i7-11700KF 出現在著名遊戲《奇點灰燼》的跑分排行榜上。有趣的是,除了處理器型號以外目前沒有太多資訊的這顆處理器,竟在這款遊戲的跑分測試中與同為 Intel 的第 10 代旗艦處理器 Core i9-10900K 打了個平手。考慮到 Core i7-11700KF 只有 8 核心,而 Core i9-10900K 則是 10 核心處理器,不免讓人莞爾,新一代的處理器僅憑著 8 個核心就與前一代的 10 核心處理器打得五五開,這或許意味著這一代處理器將有令人驚喜的進步也說不定:

▲(圖片來源)

很多時候大家買電腦都有些迷思,以前是認為時脈高的一方效能較好,但隨著製程越來越複雜,加上 AMD 近期風光崛起,看處理器已經不能只看時脈。這麼一來,又有的人看核心數量來認定效能高下。這個認知其實不完全錯誤,在同一家產品,又是同一個系列底下的話,用這樣分可以粗略的分出效能高低與市場定位,但若橫向比較不同世代、品牌、架構的處理器,也許就未必說得准了。

11 代 8 核處理器打平 10 代 10 核,Intel 正在進步

Core i7-11700KF 是目前最近曝光的 Intel 新處理器型號之一。規格上類似 Core i9-11900K ,兩者只差在時脈跟功率限制不太一樣。 兩者都是 8 核心處理器,加上 HT 技術而擁有多一倍的執行緒。L3 快取也都是 16MB。時脈的部分,11700KF 比 具有 3.60 GHz 時脈的 11900K 還高 100 MHz:

▲(圖片來源)

這個設定正好與 Core i7-10700K 及 Core i9-10900K 之間的比較相近,10700K 在時脈上也比 10900K 高 100MHz。不過 10900K 還比 10900K 多兩個核心與 4 個執行緒,因此多執行緒的效能上又注定了兩者的高下之分。

Core i7-11700KF 和 Core i9-11900K 的 TDP 為 125W(PL1),但 Core i9-11900K 的 TDP 為 250W(PL2)。至於 Core i7-10700KF 的 TDP 可能設定在 225 ~ 230W。

另外, Core i9 額外有 Thermal Velocity Boost 這項功能,但 Core i7 並沒有。因此, 11700KF 的時脈可能比 11900K 低100~200 MHz。不過,實際資訊仍要看正式發表時公布的內容為準:

▲(圖片來源)

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

雖說《奇點灰燼》測試能分辨出硬體的效能高下,但考慮到測試資料是來自玩家自行上傳而來,在基準平台上未必足夠公正。像是在測試數據圖中,可以發現 Ryzen 5 5600X 分數還比 Core i7-11700KF 還高,實際上的參考度仍有疑慮。

筆者認為 Intel 在新的 Rocket Lake-S 架構確實努力提升了效能,應該有機會追上 AMD Ryzen 5000 系列的腳步。但實際上雙方差距多少,甚至是前後世代產品的比較結果,仍有待第三方評測組織進行詳細的分析後,才能有個公允的結果

消息來源:PCGamesN、WCCFtech

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

OPPO Reno5 Pro+ 正式發表:搭載 S865 處理器、首發 5000 萬像素 SONY IMX766 感光元件相機、首款量產電致變色技術手機_網頁設計公司

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

大約兩週前, OPPO 在中國發表了全新 Reno5 系列新機,當時也預告將在今(24)日另外發表搭載高通 Snapdragon 865 旗艦處理器的 Reno5 Pro+ 。稍早, OPPO 終於發表 Reno5 Pro+ ,也成為旗下 Reno 系列首度搭載旗艦級處理器的機種。除了旗艦級的處理器, Reno5 Pro+ 仍維持輕薄的機身並首發搭載 5000 萬像素的 SONY IMX766 感光元件相機,同時也帶來首款量產電致變色技術的 Reno5 Pro+ 藝術家限定版。

OPPO Reno5 Pro+ 正式發表:搭載 S865 處理器、首發 5000 萬像素 SONY IMX766 感光元件相機、首款量產電致變色技術手機

硬體規格方面, Reno5 Pro+ 搭載 Qualcomm Snapdragon 865 5G 處理器、最高 12GB RAM 和 256GB ROM ,也是 OPPO Reno 系列發表至今首次搭載旗艦處理器的機型。

Reno5 Pro+ 採用 6.55 吋 90Hz 更新率的 OLED 曲面螢幕,螢幕符合 HDR10+ 認證、亦支持最高 180Hz 觸控採樣率。

相機部份則是 Reno5 Pro+ 相比 Reno5 和 Reno5 Pro 更明顯的特色。 OPPO Reno5 Pro+ 為全球首款採用 SONY IMX766 感光元件的機種, SONY IMX766 擁有更大面積和丹像素尺寸,能帶來更大的勁光亮與好品質。

主相機配置方面, Reno5 Pro+ 配備 5000 萬像素四鏡頭主相機,分別為 5000 萬像素主鏡頭(SONY IMX766 感光元件)、1600 萬像素超廣角鏡頭、1300 萬像素長焦鏡頭以及 200 萬像素微距鏡頭。前鏡頭部分則配備 3o00 萬像素自拍相機。

SONY IMX766 感光元件採用 2x2OCL 結構、共8192*6144 個點,每個指向都是對焦點。可實現錄影鎖定追焦,甚至走出鏡頭之外再返回,依然能秒速對焦。

全新 SONY IMX766 感光元件支持硬體 HDR 疊加錄影美顏,即便在逆光、光線昏暗場景都能更增添色彩:

Reno5 Pro+ 也擁有輕薄的機身,機身重量僅 184g 、機身厚度僅有 7.99mm :

電量方面, Reno5 Pro+  4500mAh 大電量電池,支持 65W SuperVOOC 2.0 超級閃充、VOOC 3.0、18W PD、 18W QC 快速充電協議:

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

價格方面, OPPO Reno5 Pro+ 8GB+128GB 版本建議售價人民幣 3,999 元(約合新台幣 17,217 元);128GB+256GB 版本建議售價人民幣 4,499 元(約合新台幣 19,370 元)。

同場加映: OPPO Reno5 Pro+ 藝術家限定版

除了採用 Reno Glow2.0 星鑽工藝的 OPPO Reno5 系列,在 OPPO Reno5 Pro+ 藝術家限定版更是首款搭載電致變色技術的量產手機。用戶只需在手機背面敲擊兩下,稍作等待就能在手機上呈現兩種不同顏色的變化,在機背搭載 0.15mm超薄膜片,能支持 3萬次變色壽命。

 

OPPO Reno5 Pro+ 藝術家限定版,推出 12GB+256GB 單一規格,建議售價人民幣 4,499 元人民幣(約合新台幣 19,370 元)。

圖片/消息來源:OPPO(中國)

延伸閱讀:
OPPO Reno5 系列正式發表:Reno Glow2.0 星鑽工藝提升質感,全面支援 90Hz 更新率螢幕、64MP 人像四鏡頭主相機、65W 超級閃充

MKBHD 公布 2020 年度智慧型手機獎 ,年度最佳手機獎落誰家?

您也許會喜歡:

【推爆】終身$0月租 打電話只要1元/分

立達合法徵信社-讓您安心的選擇

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

這些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/,如有侵權,請聯繫我們,我們將及時處理

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

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

春節從冬至開始_網頁設計公司

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。

晉城麵塑 資料圖片

臘月里蒸麥芽饃 資料圖片

臘月里蒸麥芽饃 資料圖片

過年是從冬至開始的。從冬至到臘八,從臘八到小年,從小年到大年,人們沿襲着祖先傳下來的風俗,操持着,準備着,迎接着,春節的氣氛也在幸福的忙碌中漸漸達到頂點。年俗是文化,也是人情,生生不息,代代相傳。

夫冬至之節,陽氣始萌

“天時人事日相催,冬至陽生春又來。”這是杜甫的七律《小至》的兩句詩。杜工部是對的,春天是隨着冬至來到人間的。

如果認為春節代表春天的到來,那就錯了。其實我們所過的春節僅僅只是春天的一個節日。春節到來的時候,人間早已經屬於春天了。春節只是給了我們一個春天已經來到人間的強烈感覺。或者說,春節只是慶祝春天已經來到人間的一個隆重儀式。

而真正意義上的春天,是從冬至開始的。我們在這裏所說“真正意義”,是指中國古代哲學中的實在意義。我們的先哲們認為,宇宙的萬事萬物無不在陰陽交替、互動、對立、統一中生存和消長。整個世界,是由陰和陽組成的。陰與陽,渾藏於天地間,是中國古代哲學的文化內核。陰與陽也因此易位於冬至和夏至兩個節日之間。夏至之後,日漸短,夜漸長,陰漸盛,陽漸衰,所有事物,所有生命,都在漸趨低谷,即“萬物收斂”。冬至之後,晝漸長,夜漸短,“一天長一線,十天長一截”。然而,冬至過後,天氣會一天比一天冷。從冬至節那一天起,就開始了數九天。“一九二九,關門袖手”“三九四九,凍破碓臼”,天氣的確是越來越冷了。

“夫冬至之節,陽氣始萌。”雖然正值數九寒天,春潮卻在暗中涌動。陽氣在暗中上升,物候的腳步在不知不覺中邁向了春天。春如初胎,從冬至那天起,已經沉靜地安附於大自然的宮室里,正如《西遊記》中邵康節所說:“冬至子之半,天心無改移。一陽初動處,萬物未生時。”“五九六九,沿河看柳。”“七九河開,八九雁來。”“九九加一九,耕牛遍地走。”說明陽氣在暗中悄悄上升,春天在不聲不響走近人間。這一點也被羅貫中寫進了《三國演義》。程昱入告曹操:“今日東南風起,宜預提防。”操笑曰:“冬至一陽生,來複之時,安得無東南風?”把一場赤壁之戰放在冬至,顯得波瀾壯闊,意味無窮。

中國“四大名著”無不拿冬至說事。曹雪芹在《紅樓夢》更是把冬至說到特別:“這年正是十一月三十日冬至。到交節的那幾日,賈母、王夫人、鳳姐兒日日差人去看秦氏,回來的人都說:‘這幾日也沒見添病,也不見甚好。’王夫人向賈母說:‘這個癥候,遇着這樣大節不添病,就有好大的指望了。’”說明冬至是個不同尋常節令,不光宇宙間萬物在蘇醒、發生、成長,就連病疽疾癘也一樣不會放過其生命活躍起來的機會。

《水滸傳》似乎沒有必要寫到冬至,但施耐庵並沒有放過這一個重要節點:“聞知今上大張燈火,與民同樂,慶賞元宵。自冬至后,便造起燈,至今才完。”我們先不說作者在敘事中來上這麼一筆的用意是什麼,施耐庵給了我們一個信息:春節乃至元宵節都是從冬至開始的。

其實春節不只是從冬至開始的,春節在中國古代與冬至是並肩同行的。

《詩經·七月》:“七月流火,九月授衣。一之日觱發,二之日栗烈。無衣無褐,何以卒歲?三之日於耜,四之日舉趾。”“一之日”是周曆和豳歷的正月。而周曆和豳歷的正月正是夏曆的十一月,就是我們現在所過的冬至的月份。而今的冬至在十一月末,或十二月初,春節則在正月初一,之間相隔時間近一個月,這並不是春節與冬至分道揚鑣,而是我們選擇了夏曆,即農曆。所以,春節是從冬至開始的,有它的歷史淵源,也有它的文化根據。

摔老南瓜

今天,儘管春節姍姍來遲於冬至之後,但人們並沒有忘記春節是從冬至開始的。尤其是在我的家鄉晉東南,依然回蕩着歷史的流響餘韻,也總是忘不了想方設法給冬至塗上一點文化色彩,讓冬至節沉染在豐富的文化意蘊中。

冬至節的五更天,天還不明,就能聽到各家各戶“嗵嗵”的響聲傳出來。那是家家都在摔老南瓜。秋天收穫老南瓜的時候,家家都要挑好的大的收藏起來,等到冬至的五更天,把老南瓜從架上取下來,抱到炕頭上,高高舉起,重重地摔到地上,南瓜子濺得到處都是。驚醒的孩子們會問父母,冬至為什麼摔老南瓜?父母會告訴孩子們冬至摔老南瓜的故事:

傳說有人要在冬至那天夜裡刺殺孔子,藏匿孔子那一家人,暗中放走了孔子,在孔子睡覺的枕頭上放了個老南瓜,用被子蓋上,偽裝成孔子正在睡覺。刺客夜入寢室,舉刀便砍,只聽“咔嚓”一聲,半個老南瓜“嗵”的一聲滾落到地上,刺客以為大功造成。於是,冬至摔老南瓜就成了祀孔的一種特殊形式。

冬至節,村子里和小學校也要祀孔。冬至那天學校放假一天,說是放假,學生並不離開學校,只是不準翻書而已。意思是,翻書會迷了孔夫子的眼。學生要穿上新衣,跟着村幹部和老師攜酒脯祀孔。祀孔結束后,村幹部陪老師吃油疙麻雜燴菜,學生回家吃餃子。我們把餃子叫“凍耳朵”,意思是,吃了凍耳朵,耳朵不怕凍壞。

冬至摔成碎塊的老南瓜,可以煮成“紅小豆老南瓜”吃。色質特別好的,留給“五豆”和“臘八”。臘月初五是“五豆節”,小節。家家吃紅豆小米撈飯,即用紅豆和小米一起燜的乾飯。五豆是冬至到臘八的一個小小跳板。

臘八粥

臘月初八,家家吃“臘八粥”。

“粥”是外鄉人的叫法,我們不叫粥,實質上也不是粥。我們叫黏米飯,也叫黏飯,又叫甜飯,實實在在的“飯”,能夠用筷子夾起來的。黏米與小米顏色一樣,黃燦燦的,顆粒大小也相同,外地人用眼睛是分辨不出來的。黏米做成的“黏米飯”特別“黏”,特別香。

臘月初七晚上,母親就要煮紅豆。紅紅的蘭花炭火,煮豆的鍋在火上嘩啦嘩啦響,孩子們的夢裡也是黏米飯香。

半夜時分,豆子煮熟了,母親會將老南瓜、黏米、紅薯、紅棗、核桃、柿餅、柿圪蓮,花生、紅糖、白糠等依次入鍋。什麼東西什麼時間放,既不能早,也不能遲。比如花生,早了不脆,遲了不熟;比如柿餅柿圪蓮,時間不對,不但不甜,還會發澀。做黏米飯最好用砂鍋,攪黏米飯最好用木板。用鐵傢伙做出來的黏米飯顏色不鮮明,吃起來味道也不對。對着黏米飯鍋不能說話,不能咳嗽,如果把唾沫星兒噴到黏米飯里,黏米飯就會“涎”成米是米、水是水,不融和,也不黏稠。

早晨,軟米飯做好了,各家各戶要相互饋贈。送贈黏米飯的任務大都是孩子們的事。一碗碗紅紅的黏米飯,像一盞盞的小紅燈籠,像一捧捧的火焰,像一朵朵鮮艷的花,在飛雪中,在白雪皚皚的大街小巷裡,燃燒,跳躍,綻放,如竄梭一般地來來去去。每碗黏米飯都是滿滿的,偶爾會滴一點在雪地上,像掉在雪地上的一塊紅紅的火炭,像一枝火的花朵,讓雪天顯得溫暖,讓雪天顯得爛漫,點燃着鄉村裡永遠的鄉愁。

家家戶戶都做黏米飯,家家戶戶相互饋贈,那是一種風俗。你送我一碗,我送你一碗,“親戚箢還箢,鄰家碗還碗”。那是鄉里鄉親熱絡感情、鞏固關係的一種最簡單、最樸素的一種方式。千年不變,也不應該變。

學生都要給老師送軟米飯,老師收很多黏米飯,凍起來,天天拿鏊子焐着吃,放一點油,焐出一層薄薄的皮,又香又甜,天下風味。

也有送黏米飯給村子里的藥鋪商鋪的,藥鋪商鋪也會準備一些核桃、紅棗、花生、柿餅之類回贈。

為什麼要吃臘八粥?為什麼要吃黏米飯?歷來傳說不一。但最好緣由應該是紀念佛祖成道日,效法牧女獻乳糜於佛的故事。不過,這也是人們賦予臘八節的一種文化色調。我看,其蘊包含在《詩經》里。

《詩經》有言:“物其多矣,維其嘉矣。物其旨矣,維其偕矣。物其有矣,維其時矣。”冬至時節,乃至整個臘月天,各種糧食果蔬藏儲豐富,是乃“物其多矣”“物其旨矣”“物其有矣”;選擇節日,如冬至、五豆、臘八、小年,做成合節的諸如黏米飯、豆撈飯、火燒之類的飯食,乃是“維其嘉矣”“維其偕矣”“維其時矣”。也就說,臘八吃黏米飯才有臘八氣氛,才是臘八的味道。也如八月十五吃月餅,三月三吃春餅,端午節吃粽子,此即“物其有矣,維其時矣”。

冬至說儒,臘八說佛,小年以至大年,就應該說“道”了。佛、儒、道,三家文化,融化了我家鄉的臘月天。

過了臘八,接着就是小年。臘月二十三,祭灶的日子到了。

祭灶祭哪個?祭祝融。《周禮》說:“顓頊氏有子日黎,為祝融,祀以為灶神。”漢之後,灶王爺掌握了人們的禍福、壽夭,出現了“灶神晦日歸天,白人罪”的說法。人們小心奉祀灶君,傳說灶君每年臘月二十三都要到天帝那兒去陳說人間的善與惡,因此各家各戶要為灶王爺送行,打些火燒給灶爺做乾糧,弄些麩皮草料給灶爺秣灶馬,在火口上塗些糖餳給老灶爺糊嘴巴,好讓老灶爺到天帝那兒多說好話,把天帝所降的吉祥帶回人間。

“二十三祭罷灶,夾上包袱往回趵。”住在娘家的媳婦,祭過灶之後,就該回到婆婆家準備過年了。

“好了!好了!到跟前兒都好了!”

過了冬至節,男人們忙着殺豬,宰羊,割肉,買菜,辦年貨。女人碾米,磨面,扯布,買衣線,做新衣,做新鞋。過了臘月二十三,就要掃屋子,做豆腐,坐蒸鍋,蹲油鍋。

晉城不缺香炭,火邊圍一圈香炭,把火燒得旺旺的,女人們各顯身手,蒸棗山、棗供、棗花、豬、羊、小兔兒、小魚兒、小刺蝟,炸菱花、饊花。所蒸所煮,都是敬神的供品。棗山像個大青蛙,背上許多面花兒。每朵花上都有一個紅棗,看起來像一朵盛開的大紅花。雜獻只是一個大饅頭,上邊摞幾層面花兒,最上面安一個大紅棗。比雜獻小一點的叫棗花兒,只有一層花,花上邊只是一個酸棗。棗山和雜獻上的花兒,有盤花,有剪花。盤花像牡丹,剪花像菊花。把筷子頭破開,析出一朵“小梅花”。在小小的瓷碟子里化一點品紅,把“小梅花”在品紅里蘸蘸,在棗山和雜獻上點上朵朵小梅花。將高粱秸破成兩半,摳去瓤子,便成為一個彎彎的月牙。把月牙兒蘸一點品綠,在“小梅花”的四角點四片,好花有了綠恭弘=叶 恭弘扶持,所有的獻供便飛一片春色。每朵花都有兩層三層,看上去重重疊疊,有點“層巒聳翠”的意思。

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

給女兒女婿蒸兩個大口禮饃,個子比頭盔大。把揉好的面用細繩從頂向下勒一個十字,蒸熟的口禮饃如四瓣盛開的花朵,點綴上品紅品綠,顯得喜氣洋洋,一片祥和。

給自己家裡每個人蒸一個“人口禮饃”,其中一個裡邊放個“制錢”,其餘放上一個紅棗。初七人日,誰拿到放“制錢”的口禮饃,誰運氣就是最好的,福氣也是最大的,大事小事都會成為家裡的靠山。

煮一鍋玉茭豆兒,蒸些豆餡饃、菜餡饃。從初二到初五,每天早晨喝玉茭豆兒,吃餡饃。

為了一個年節,家家戶戶都會忙得團團轉,腳步總是匆匆的。人與人見了面總要關切地問一聲:“準備好了嗎?”總是笑着回答:“好了!好了!到跟前兒都好了!”

洗了澡,理了發。糊了窗戶,架起正火。貼上對聯,掃了院子,就到大年三十了。

“二十三日去,初一五更回”

三十的晚上,家家戶戶吃“面恭弘=叶 恭弘”。脫玉茭、大白菜、紅蘿蔔、豆腐、豆芽,一鍋煮熟。寬寬的麵條,不放蔥蒜,只放花椒,因為要獻祖先。先盛一碗獻祖宗。燃上一炷香,大門口放三個炮,接祖宗回家過年,祖先就會跟着香煙走進大門,走進屋門。祖先畢竟是泉鄉之物,沒有香煙引路,門神不會放祖先進入家門。

把祖先請到祖先桌上,給祖先獻上一碗面恭弘=叶 恭弘,俗稱“爺奶奶湯兒”,讓祖宗先喝口湯,歇歇氣,等五更天敬神時,再給祖宗上獻。

從臘月二十三到年三十,人間是沒有神的,諸神都到天帝那裡參加年會了。這一段時間,人間是無忌諱的,人們可以為所欲為,特別是結婚辦喜事,不用“擇好兒”,想哪天辦就哪天辦。

臘月三十,祖宗也回來了,家人與祖宗一起,早早就要睡覺了。睡覺時放一個“關門炮”,說明這一年已經過完了,關門了,再開門的時候就是春節了。

神回到人間的時間,是正月初一的五更天,是所謂的“二十三日去,初一五更回”。初一五更,起床先放一個開門炮,春節的大門從此就打開了。

不論農家、官家與商家,不論窮家與富家,家家供奉灶爺,供奉天地爺、家堂老爺、財神爺,其他便不相同了。有的家庭供奉不知名姓的神仙,總稱仙家老爺。很多人家都供奉佛爺,讀書人供奉孔夫子,木匠供奉魯班,鐵匠供奉老君。

其實行走在我們桑梓間的不止佛、儒、道,還有天地、山神、龍王、馬王、牛王、青龍、白虎、紫姑、門神、樹神、花神、五道神、土地神,等等。當然,林林總總的神仙,也都出身於道家,平時不聞不問,過年時,不知道從哪裡蹣跚走來,在一元始旦,萬象更新,人世間充滿歡樂充滿希望的時候,同眾庶一起歡度春節,增加節日的氣氛,也讓人們的心靈有所依傍,靈魂有所棲止,精神有所寄託。

初一五更,點正火,接神,焚香。天地爺自是“滿斗焚香”,一炷炷的單香插得如滿天星斗。其他佛家道家的神仙都是三炷香,或者一炷整香。祖先不是神,所以不可與神一起受享獻饗。各種獻供只能等敬罷神,酌回來才能獻給祖先享用。

正火點着之後,青煙裊裊,火光衝天,火星直冒,紅光滿園,柏樹枝的香氣格外讓人心清氣爽。孩子們會圍着正火又跑又跳,又喊又笑,小臉一張張映得通紅,朝氣與喜氣沖溢在整個院子里。焚香的同時放鞭炮,孩子們手裡會提個小小的紅燈籠,到處搶鞭炮。大人們會告訴孩子,大年初一去抱住大椿樹,高聲喊:“椿樹娘,椿樹娘,你長高了做大梁,我長高了領衣裳。”希望椿樹帶領孩子與孩子一起長高。

初一五更,男人敬神,女人打火做飯。大年初一早晨多有吃拉麵的,意思全家互相拉着點,拉緊點,不要丟了一個,不要少了一個。女人拉麵,男人批蒜苗。白生生的面,拉得又長又細。頭一碗先送本院鄰居,鄰居也會送一碗過來,是鄰裡間年節時的一種交往。

吃過飯,父母要給孩派壓歲錢,還要教孩子怎麼拜年。同輩人見了面,也要互相說一聲:“拜年了!”“春節好!”“恭喜發財!”村子上的老會頭要飾鑼集中八音會,耍會,唱戲。

初五晚上要送祖先。端上半碗爺奶奶湯,燃上一炷香,隨着香煙裊裊,把祖宗送到大門口,放三個炮,年節基本就結束了。

元宵拱燈棚

說是年基本結束了,就是還沒有完全結束。還有個正月十五鬧元宵。

掛燈是我們家鄉一個古老的傳統,不僅家家門口掛燈,整個村子里也掛燈。我們村裡有好幾百對花燈,全部掛在後街上。後街從東到西二里長,燈棚用紅、黃、藍三色小布編成小方花格子作燈棚,把燈並排掛在燈棚下,橫看是一對一對的,順着街道看過去,像兩條火龍,從東頭一直蜿蜒到西頭。

吃晚飯時,鑼聲一響,人們都知道,要髮蠟了。二里長街,分段管理,負責髮蠟。髮蠟,就是點燃蠟燭的意思。蠟燭是用羊油掂的。熬上一大鍋羊油,把棉花做成的燭芯纏在蠟柱上,往大鍋里一沾一掂,反覆多次,便掂成一支蠟燭。白蠟是本色,紅蠟是添加了顏料。紅蠟白蠟都搖紅,把一條長街搖得輝煌壯麗。

蠟是年年要掂的,燈也是年年要掛的。即使最困難時期,也沒有停了掛燈。人們說:“討吃看煙火,肚飢眼歡樂。”可以不吃飯,卻不能不掛燈,好不容易又一年了。也許是想證明人這一年又活過來了。

燈棚下每隔十來步就有一爐正火。燒正火用的是香煤香炭,也叫蘭花香炭,也叫白煤,傳說是英國女王燒壁爐必用之物。燒正火不能用臭炭,否則會嗆得人打噴嚏,既出洋相,又不吉祥。

傍晚時分,把大塊的蘭花香炭添足,正火很快就燒起來,一堆火焰熊熊,一堆金光燦爛。天上月光,棚下燈光,街邊火光,加上社鼓笙簫,一派金碧輝煌。

後街的燈全是紗燈,繪有《三國演義》《封神榜》《水滸傳》人物情節。觀燈的人從燈棚下拱來拱去,拱燈棚大都是年輕人。拄着棍子的老人,引着孫兒老叟,傴僂着腰的老嫗,把孩子架在膀子上的父親,梳了圓頭的母親,大都圍在燈棚下,每盞燈下都會圍一個圈,仄着耳朵,聽老人們說些三國水滸的故事。

年輕人很少站在燈棚下看那些老故事。他們有自己的故事。“月上柳梢頭,人約黃昏后”,是他們故事的藍本。他們總是以“拱燈棚”,演繹他們的故事。

“拱燈棚”是小鎮一個古老的風俗。按風俗,不管男女老少,正月十五拱燈棚會吉祥如意,會免除許許多多的大災小難。

不管是男孩子還是女孩子,他們總是三個一群兩個一夥,貌似看燈,卻心不在焉。

女孩子們總手拉着手“拱燈棚”。從東頭拱到西頭,再從西頭拱到東頭。人前,不管內心多麼豐富,表面都是很文靜的,悄悄謐謐的,總是很害羞的樣子。如果不得不笑,也只是趕緊把嘴捂住,彎下腰,或者背過身,悄抿了嘴,齒頰之間發出一點吹涼風一樣的“噝噝”聲。當然,有時候也難免會笑出聲來,無非是忽然想起了,或者忽然看到了可笑的人和事,實在是忍不住了,就笑出來。一個人“疙啼”一聲,會傳染女孩子們無端“疙啼疙啼”笑成一堆。

有話說的時候,也只是悄聲細語,低聲喁喁。心裏卻熱烈。本來是三個兩個相跟着,牽着手,卻不知道什麼時候就少了一個。不知道其中哪個女孩什麼時候就拱出了燈棚,拱到了月光照不到,燈光也照不到的地方去了。

當然,過來人都知道,那燈火闌珊的角落有女孩子和男孩子的故事。他們知道,入春了,驚蟄了,野草也該句萌了。

藿谷洞的燈與後街不同,藿谷洞的燈不是為大眾看的,是專奉“四奶奶”即送子娘娘的,觀燈的人大都是母親或祖母,因此藿谷洞的燈上沒有故事,燈下也沒有故事,很雅靜,很純凈,很雅緻,雅緻到脫俗。燈的形式也很單純,一式宮燈,兩種燈罩。布罩和玻璃。布罩是綠裙紅褲,很鮮艷;玻璃罩繪有梅、蘭、竹、菊,石榴,荷花,魚兒,鳥兒,題些“玉燭豐年”“雨暘時若”“天地交泰”的文字。品位很高,有一點閨閣氣。倘若天空中有雪花飄下來,那才是真正的天上人間。後街的燈如果代表“俗”,那麼藿谷洞的燈就是一個“雅”。從後街到藿谷洞,就是一個雅俗共賞。

藿谷洞長不足百步,南瀕大箕河,北出後街。南北街口各有一爐正火,助“四奶奶”看烘火,供祖母或母親們熏手熏腳。母親們和奶奶們常常會搬個椅子或板床,穩穩噹噹坐在正火跟前,一邊烤火,一邊陪着“四奶奶”看燈。

俗話說三個女人一台戲,但那時候的女人卻沒戲,既不調笑,也不說穢語。所有的奶奶和母親們絕不開玩笑的。她們的心那時候是非常虔敬的,是懷着無限神聖的。她們心中的“四奶奶”就在燈下,護佑着他們的兒孫。不管誰家裡的孩子,都是四奶奶殿里來的,都是四奶奶的侍兒。四奶奶是鄉村女人們心中最可愛,最可敬,最可親,最嚴肅的一位女神。她們會拿五色紙給四奶奶糊些被子褥子、衣裳、鞋襪。四奶奶應該是三寸金蓮,因此那鞋也糊得小辣椒一樣,很俊,很俏。除了鋪、蓋、穿、戴,還要給四奶奶上“銀兩”,即錫箔之類。

供品是“桃”。面蒸的,洋紅洋綠點綴些花恭弘=叶 恭弘,給人的感覺是喜氣盈盈,這叫“壽桃”,是寶塔狀的。還有“油桃”,偏形的,卧式的。蒸熟之後,在鍋里放點油,燒熱,把“桃”背在油鍋里擦一擦,又香又好看。最簡單最聖潔的供品是“香米茶飯”。名字看上去太詩意了!把小米炒開花,放點水,熗一下,用酒盅一盅一盅扣在盤子里,像一個個小沙包。

祖母和母親們在用心觀燈。那綠褲紅裙之間所包含的,那玻璃罩所罩的,是仙緣,是仙機。她們在和“四奶奶”一起度過元宵,她們在恬靜中陪伴着她們心中的“四奶奶”。她們也知道“四奶奶”不是世界上最高和最有權威的神或仙,但“四奶奶”最喜歡孩子,是一位慈祥的奶奶。為了孩子,為了孫子,她們願意那麼陪着。那樣陪着,她們的心裏是安定的,是穩貼的。她們的內心永遠有那麼一團神聖。“漠虛靜以恬愉兮,澹無為而自得。聞赤松之清塵兮,願承風乎遺則。貴真人之休德兮,美往世之登仙。”這才是她們的真心,雖然她們並未讀過《楚辭》。

掛起燈的時候,能有雪花飄落,那是再美不過了。那叫“瑞雪兆豐年”,最富詩意。

到此,年就算完全結束了。“九九加一九,耕牛遍地走”,到一心一意種莊稼的時候了。

(作者:卓 然,系山西省晉城市作協名譽主席)

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

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

吃糖瓜、祭灶神……小年如何過出儀式感?_網頁設計公司

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

“二十三日過小年,差不多就是過新年的‘綵排’。”著名作家老舍在《北京的春節》中,曾記錄過一系列有關春節的民俗,其中就提到了小年,字里行間透出了濃濃的年味兒。

不過,小年的日期並不一致,有的是在臘月二十三,有的是在臘月二十四……但一般而言,小年都被當做是春節的序曲,等那首“過年謠”唱起來,人們就開始按部就班做準備,直到迎來熱熱鬧鬧的中國年。

小年日期不相同

小年是一個傳統節日,也被稱為謝灶、祭灶節、灶王節等。由於各地風俗,“小年”有着不同的概念,日期也不盡相同。

在古代,過小年有“官三民四船五”的傳統,也就是說,官家的小年是臘月二十三,百姓家的是臘月二十四,而水上人家則是臘月二十五。還有的地方把“臘月廿四”和“除夕前一夜”都稱為小年。

關於小年,還有一首“過年謠”,忙碌中自帶喜慶:“二十三,捏糖瓜;二十四,掃屋子;二十五,凍豆腐;二十六,燉豬肉;二十七,殺肥雞;二十八,把面發;二十九,蒸饅頭;三十上炕包餃子。”

不同地區的過年謠,內容會略有差別。但總體來說,都是表達了一種辭舊迎新、迎祥納福的美好心愿。

過小年為啥要“祭灶”?

小年被視為過年的開端,也自然會受到格外重視,祭灶便是期間一項重要的民俗活動。

灶神是中國古代神話傳說中的司飲食之神。也有傳說稱,灶王爺原本是一介平民,叫做張生。他成家后終日花天酒地,終於淪落到以乞討為生的地步。有一天,他恰好乞討到前妻家,羞愧難當,一頭鑽到灶鍋底下燒死了。

玉帝知道后,認為張生還有羞恥心,又是在鍋底死去,就把他封為灶王,每年臘月二十三、二十四上天“彙報”一家人的善惡,大年三十再回去。於是,漢族民間就有了“小年”祭灶的習慣,祈求來年平安順遂。

宋代的范成大在《祭灶詩》中說:“古傳臘月二十四,灶君朝天欲言事……杓長杓短勿復雲,乞取利市歸來分。”這首詩很形象地說明了古代有關祭灶的一些風俗習慣。

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

灶王爺畫像一般貼在灶台附近,祭灶時要把關東糖用火融化,塗在灶王爺的嘴上,這樣他就不能在玉帝面前說壞話。還要把舊畫像揭下來,再和用稻草紮成的“馬”一起燒掉,象徵著送灶神上天,也叫“辭灶”。之後,新年後再把新畫像貼上,迎回灶神。

除了糖瓜,這時還會吃些啥?

提到小年的飲食,糖瓜自然是標誌性食品之一。除了用來祭灶外,過去也是人們口中的美食。

糖瓜一般用黃米和麥芽熬制而成。這種糖有兩種形狀,長條的叫“關東糖”,扁圓的叫“糖瓜”,吃起來滿口生香,別有風味。

舊日,农民們一般到了隆冬季節沒什麼農活時才能休息,那時從臘月二十三到正月十五甚至是整個正月都是“年”,過年自然要吃餃子,時間久了,吃餃子也成了小年的習俗。

晉東南地區,流行小年吃炒玉米的習俗,民諺有“二十三,不吃炒,大年初—一鍋倒”的說法。人們喜歡將炒玉米用麥芽糖粘結起來,冰凍成大塊,咬上一口,又酥又脆。

剪窗花、掃房子……過年準備工作有哪些?

過了小年,離着春節只剩下不到十天時間了。剪窗花、貼對聯、貼年畫……過年的準備工作會更加熱鬧。

例如,各家各戶都會認真打掃房子、清除灰塵,窗明几淨迎接新年。據說,小年也叫掃塵日,源於堯舜時期的“掃年”習俗,原本是古代人民驅除病疫的一種儀式。

在所有準備過年的活動中,剪貼窗花是最流行的。窗花的內容可以是喜鵲登梅、燕穿桃柳、蓮(連)年有魚(餘)、和合二仙等,也有各種戲劇故事。

過去,臘月二十三后,家家戶戶要蒸饅頭,特別要製做一個“大棗山”來供奉灶君,饅頭也可以有許多造型,往往是大家一展靈巧手藝的好機會。

俗話說,“有錢沒錢,剃頭過年”。在此期間,大人、小孩都要洗澡、理髮,一身清爽迎接新年,人們認為,這樣也有“辭舊迎新”的意味。

其實,小年並不只是一個簡單的日期,重要的是它作為春節的前奏,此後的一系列民俗活動都強調了“參與感”,也是在這個過程中,年味越來越濃了。(記者 上官雲)

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

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

記一次使用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 

好了,搞定

 

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

 

 

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

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

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