⑴ Web前端崗位面試題有哪些
前端面試題匯總,基本上會有四大類問題,具體如下:
一、HTML
1、Doctype作用?嚴格模式與混雜模式如何區分?它們有何意義?
2、HTML5 為什麼只需要寫 <!DOCTYPE HTML>?
3、行內元素有哪些?塊級元素有哪些? 空(void)元素有那些?
4、頁面導入樣式時,使用link和@import有什麼區別?
5、介紹一下你對瀏覽器內核的理解?
6、常見的瀏覽器內核有哪些?
7、html5有哪些新特性、移除了那些元素?如何處理HTML5新標簽的瀏覽器兼容問題?如何區分 HTML 和 HTML5?
8、簡述一下你對HTML語義化的理解?
9、HTML5的離線儲存怎麼使用,工作原理能不能解釋一下?
10、瀏覽器是怎麼對HTML5的離線儲存資源進行管理和載入的呢?
11、請描述一下 cookies,sessionStorage 和 localStorage 的區別?
12、iframe有那些缺點?
13、Label的作用是什麼?是怎麼用的?(加 for 或 包裹)
14、HTML5的form如何關閉自動完成功能?
15、如何實現瀏覽器內多個標簽頁之間的通信? (阿里)
16、webSocket如何兼容低瀏覽器?(阿里)
17、頁面可見性(Page Visibility)API 可以有哪些用途?
18、如何在頁面上實現一個圓形的可點擊區域?
19、實現不使用 border 畫出1px高的線,在不同瀏覽器的Quirksmode和CSSCompat模式下都能保持同一效果。
20、網頁驗證碼是幹嘛的,是為了解決什麼安全問題?
21、tite與h1的區別、b與strong的區別、i與em的區別?
二、css
1、介紹一下標準的CSS的盒子模型?與低版本IE的盒子模型有什麼不同的?
2、CSS選擇符有哪些?哪些屬性可以繼承?
3、CSS優先順序演算法如何計算?
4、CSS3新增偽類有那些?
5、如何居中div?如何居中一個浮動元素?如何讓絕對定位的div居中?
6、display有哪些值?說明他們的作用。
7、position的值relative和absolute定位原點是?
8、CSS3有哪些新特性?
9、請解釋一下CSS3的Flexbox(彈性盒布局模型),以及適用場景?
10、用純CSS創建一個三角形的原理是什麼?
11、一個滿屏 品 字布局 如何設計?
三、常見兼容性問題?
1、li與li之間有看不見的空白間隔是什麼原因引起的?有什麼解決辦法?
2、經常遇到的瀏覽器的兼容性有哪些?原因,解決方法是什麼,常用hack的技巧 ?
3、為什麼要初始化CSS樣式。
4、absolute的containing block計算方式跟正常流有什麼不同?
5、CSS里的visibility屬性有個collapse屬性值是幹嘛用的?在不同瀏覽器下以後什麼區別?
6、position跟display、margin collapse、overflow、float這些特性相互疊加後會怎麼樣?
7、對BFC規范(塊級格式化上下文:block formatting context)的理解?
8、CSS權重優先順序是如何計算的?
9、請解釋一下為什麼會出現浮動和什麼時候需要清除浮動?清除浮動的方式
10、移動端的布局用過媒體查詢嗎?
11、使用 CSS 預處理器嗎?喜歡那個?
12、CSS優化、提高性能的方法有哪些?
13、瀏覽器是怎樣解析CSS選擇器的?
14、在網頁中的應該使用奇數還是偶數的字體?為什麼呢?
15、margin和padding分別適合什麼場景使用?
16、抽離樣式模塊怎麼寫,說出思路,有無實踐經驗?[阿里航旅的面試題]
17、元素豎向的百分比設定是相對於容器的高度嗎?
18、全屏滾動的原理是什麼?用到了CSS的那些屬性?
19、什麼是響應式設計?響應式設計的基本原理是什麼?如何兼容低版本的IE?
20、視差滾動效果,如何給每頁做不同的動畫?(回到頂部,向下滑動要再次出現,和只出現一次分別怎麼做?)
21、::before 和 :after中雙冒號和單冒號 有什麼區別?解釋一下這2個偽元素的作用。
22、如何修改chrome記住密碼後自動填充表單的黃色背景 ?
23、你對line-height是如何理解的?
24、設置元素浮動後,該元素的display值是多少?(自動變成display:block)
25、怎麼讓Chrome支持小於12px 的文字?
26、讓頁面里的字體變清晰,變細用CSS怎麼做?(-webkit-font-smoothing: antialiased;)
27、font-style屬性可以讓它賦值為「oblique」 oblique是什麼意思?
28、position:fixed;在android下無效怎麼處理?
29、如果需要手動寫動畫,你認為最小時間間隔是多久,為什麼?(阿里)
30、display:inline-block 什麼時候會顯示間隙?(攜程)
31、overflow: scroll時不能平滑滾動的問題怎麼處理?
32、有一個高度自適應的div,裡面有兩個div,一個高度100px,希望另一個填滿剩下的高度。
33、png、jpg、gif 這些圖片格式解釋一下,分別什麼時候用。有沒有了解過webp?
34、什麼是Cookie 隔離?(或者說:請求資源的時候不要讓它帶cookie怎麼做)
35、style標簽寫在body後與body前有什麼區別?
四、JavaScript
1、介紹JavaScript的基本數據類型。
2、說說寫JavaScript的基本規范?
3、JavaScript原型,原型鏈 ? 有什麼特點?
4、JavaScript有幾種類型的值?(堆:原始數據類型和 棧:引用數據類型),你能畫一下他們的內存圖嗎?
5、Javascript如何實現繼承?
6、Javascript創建對象的幾種方式?
7、Javascript作用鏈域?
8、談談This對象的理解。
9、eval是做什麼的?
10、什麼是window對象? 什麼是document對象?
11、null,undefined的區別?
12、寫一個通用的事件偵聽器函數(機試題)。
13、[「1」, 「2」, 「3」].map(parseInt) 答案是多少?
14、關於事件,IE與火狐的事件機制有什麼區別? 如何阻止冒泡?
15、什麼是閉包(closure),為什麼要用它?
16、javascript 代碼中的」use strict」;是什麼意思 ? 使用它區別是什麼?
17、如何判斷一個對象是否屬於某個類?
18、new操作符具體幹了什麼呢?
19、用原生JavaScript的實現過什麼功能嗎?
20、Javascript中,有一個函數,執行時對象查找時,永遠不會去查找原型,這個函數是?
21、對JSON的了解?
22、[].forEach.call($$("*"),function(a){ a.style.outline="1px solid #"+(~~(Math.random()*(1<<24))).toString(16) }) 能解釋一下這段代碼的意思嗎?
23、js延遲載入的方式有哪些?
24、Ajax 是什麼? 如何創建一個Ajax?
25、同步和非同步的區別?
26、如何解決跨域問題?
27、頁面編碼和被請求的資源編碼如果不一致如何處理?
28、模塊化開發怎麼做?
29、AMD(Moles/Asynchronous-Definition)、CMD(Common MoleDefinition)規范區別?
30、requireJS的核心原理是什麼?(如何動態載入的?如何避免多次載入的?如何 緩存的?)
31、讓你自己設計實現一個requireJS,你會怎麼做?
32、談一談你對ECMAScript6的了解?
33、ECMAScript6 怎麼寫class么,為什麼會出現class這種東西?
34、非同步載入的方式有哪些?
35、documen.write和 innerHTML的區別?
36、DOM操作——怎樣添加、移除、移動、復制、創建和查找節點?
37、.call() 和 .apply() 的含義和區別?
38、數組和對象有哪些原生方法,列舉一下?
39、JS 怎麼實現一個類。怎麼實例化這個類
40、JavaScript中的作用域與變數聲明提升?
41、如何編寫高性能的Javascript?
42、那些操作會造成內存泄漏?
43、JQuery的源碼看過嗎?能不能簡單概況一下它的實現原理?
44、jQuery.fn的init方法返回的this指的是什麼對象?為什麼要返回this?
45、jquery中如何將數組轉化為json字元串,然後再轉化回來?
46、jQuery 的屬性拷貝(extend)的實現原理是什麼,如何實現深拷貝?
47、jquery.extend 與 jquery.fn.extend的區別?
48、jQuery 的隊列是如何實現的?隊列可以用在哪些地方?
49、談一下Jquery中的bind(),live(),delegate(),on()的區別?
50、JQuery一個對象可以同時綁定多個事件,這是如何實現的?
51、是否知道自定義事件。jQuery里的fire函數是什麼意思,什麼時候用?
52、jQuery 是通過哪個方法和 Sizzle 選擇器結合的?(jQuery.fn.find()進入Sizzle)
53、針對 jQuery性能的優化方法?
54、Jquery與jQuery UI有啥區別?
55、JQuery的源碼看過嗎?能不能簡單說一下它的實現原理?
56、jquery 中如何將數組轉化為json字元串,然後再轉化回來?
57、jQuery和Zepto的區別?各自的使用場景?
58、針對 jQuery 的優化方法?
59、Zepto的點透問題如何解決?
60、jQueryUI如何自定義組件?
61、需求:實現一個頁面操作不會整頁刷新的網站,並且能在瀏覽器前進、後退時正確響應。給出你的技術實現方案?
62、如何判斷當前腳本運行在瀏覽器還是node環境中?(阿里)
63、移動端最小觸控區域是多大?
64、jQuery 的 slideUp動畫 ,如果目標元素是被外部事件驅動, 當滑鼠快速地連續觸發外部元素事件, 動畫會滯後的反復執行,該如何處理呢?
65、把 Script 標簽 放在頁面的最底部的body封閉之前 和封閉之後有什麼區別?瀏覽器會如何解析它們?
66、移動端的點擊事件的有延遲,時間是多久,為什麼會有? 怎麼解決這個延時?(click 有 300ms 延遲,為了實現safari的雙擊事件的設計,瀏覽器要知道你是不是要雙擊操作。)
67、知道各種JS框架(Angular, Backbone, Ember, React, Meteor, Knockout…)么? 能講出他們各自的優點和缺點么?
68、Underscore 對哪些 JS 原生對象進行了擴展以及提供了哪些好用的函數方法?
69、解釋JavaScript中的作用域與變數聲明提升?
70、那些操作會造成內存泄漏?
71、JQuery一個對象可以同時綁定多個事件,這是如何實現的?
72、Node.js的適用場景?
(如果會用node)知道route, middleware, cluster, nodemon, pm2, server-side rendering么?
73、解釋一下 Backbone 的 MVC 實現方式?
74、什麼是「前端路由」?什麼時候適合使用「前端路由」? 「前端路由」有哪些優點和缺點?
75、知道什麼是webkit么? 知道怎麼用瀏覽器的各種工具來調試和debug代碼么?
76、如何測試前端代碼么? 知道BDD, TDD, Unit Test么? 知道怎麼測試你的前端工程么(mocha, sinon, jasmin, qUnit..)?
77、前端templating(Mustache, underscore, handlebars)是幹嘛的, 怎麼用?
78、簡述一下 Handlebars 的基本用法?
79、簡述一下 Handlerbars 的對模板的基本處理流程, 如何編譯的?如何緩存的?
80、用js實現千位分隔符?(來源:前端農民工,提示:正則+replace)
檢測瀏覽器版本版本有哪些方式?
81、我們給一個dom同時綁定兩個點擊事件,一個用捕獲,一個用冒泡,你來說下會執行幾次事件,然後會先執行冒泡還是捕獲
⑵ javascript如何進行垃圾回收
樓主問的這些,其實在javascript高級程序設計一書里已有詳細說明了。我覺得需要糾正的是:
1、並不是所有的瀏覽器使用的都是」引用計數「這種垃圾回收演算法,貌似只有IE6/IE7/IE8在用,現代瀏覽器比如Chrome/Firefox/Opera使用的比較好的」標記清除「演算法。
2、並不是引用計數為0了,垃圾回收器就會立馬回收,回收是會消耗一些性能,所以瀏覽器會在瀏覽器佔用內存達到一定數值的時候,才會執行垃圾回收。當然可以通過強制調用方法執行。具體請看高程那邊書
3、執行玩problem方法後,objctA、objectB可以被回收,因為它們在函數內相互引用,而沒有引用函數外的其他對象,或者函數外沒有其他引用它們,所以函數執行完,會被釋放的。
請樓主再詳細閱讀高程那邊書,你會更加深理解的。
⑶ js中的垃圾回收機制有啥作用,如果你不要某個變數了,直接自己動手刪了不也行嗎
理論上不回收。因為閉包中的變數不會被回收這是閉包的特性之一。
但是實際上不同的瀏覽器實現的可能不一樣。一些高端瀏覽器如果確認這個變數沒有且不會再被使用的話,也可能將其回收。
找到stackoverflow上面的一個講的相對詳細的答案:
⑷ WEB前端學習五 什麼是閉包
前端前景是很不錯的,像前端這樣的專業還是一線城市比較好,師資力量跟得上、就業的薪資也是可觀的,學習前端面授班的時間大約半年,學習前端可以按照路線圖的順序,
0基礎學習前端是沒有問題的,關鍵是找到靠譜的前端培訓機構,你可以深度了解機構的口碑情況,問問周圍知道這家機構的人,除了口碑再了解機構的以下幾方面:
1. 師資力量雄厚
要想有1+1>2的實際效果,很關鍵的一點是師資隊伍,你接下來無論是找個工作還是工作中出任哪些的人物角色,都越來越愛你本身的技術專業前端技術性,也許的技術專業前端技術性則絕大多數來自你的技術專業前端教師,一個好的前端培訓機構必須具備雄厚的師資力量。
2. 就業保障完善
實現1+1>2效果的關鍵在於能夠為你提供良好的發展平台,即能夠為你提供良好的就業保障,讓學員能夠學到實在實在的知識,並向前端學員提供一對一的就業指導,確保學員找到自己的心理工作。
3. 學費性價比高
一個好的前端培訓機構肯定能給你帶來1+1>2的效果,如果你在一個由專業的前端教師領導並由前端培訓機構自己提供的平台上工作,你將獲得比以往更多的投資。
希望你早日學有所成。
⑸ java中垃圾回收機制的原理是什麼
回收機制就是 當一些資源被創建使用之後或不在調用的話 就會變成垃圾,垃圾的話會佔用空間,這時候就需要釋放空間給其他程序使用,所以JAVA擁有自動垃圾回收機制。
GC的工作原理: 引用計數,標記復制"引用計數"是一種簡單但速度很慢的垃圾回收技術.
"標記復制"的運行機制,垃圾回收器遍歷包含所有引用的列表,當發現存活的對象引用時做上標記,這樣當遍歷完所有對象引用並做上標記的時候,執行垃圾回收,將沒有標記的對象堆空間釋放.
垃圾回收機制的優點:Java的垃圾回收機制使得java程序員不用擔心內存空間的分配,減少了內存溢出.但同時也犧牲了一定的性能.
⑹ spring+mybatis+cxf開發的WebService垃圾回收問題
有沒有可能用軟引用管理一下引用,可能會有用,虛擬機在內存溢出之前會回收這種引用的內存,之後如果不夠才會報內存溢出;
⑺ javascript垃圾回收方法
一、垃圾回收的必要性
下面這段話引自《JavaScript權威指南(第四版)》
由於字元串、對象和數組沒有固定大小,所有當他們的大小已知時,才能對他們進行動態的存儲分配。JavaScript程序每次創建字元串、數組或對象時,解釋器都必須分配內存來存儲那個實體。只要像這樣動態地分配了內存,最終都要釋放這些內存以便他們能夠被再用,否則,JavaScript的解釋器將會消耗完系統中所有可用的內存,造成系統崩潰。
這段話解釋了為什麼需要系統需要垃圾回收,JS不像C/C++,他有自己的一套垃圾回收機制(Garbage Collection)。JavaScript的解釋器可以檢測到何時程序不再使用一個對象了,當他確定了一個對象是無用的時候,他就知道不再需要這個對象,可以把它所佔用的內存釋放掉了。例如:
var a = "before";
var b = "override a";
var a = b; //重寫a
這段代碼運行之後,「before」這個字元串失去了引用(之前是被a引用),系統檢測到這個事實之後,就會釋放該字元串的存儲空間以便這些空間可以被再利用。
二、垃圾回收原理淺析
現在各大瀏覽器通常用採用的垃圾回收有兩種方法:標記清除、引用計數。
1、標記清除
這是javascript中最常用的垃圾回收方式。當變數進入執行環境是,就標記這個變數為「進入環境」。從邏輯上講,永遠不能釋放進入環境的變數所佔用的內存,因為只要執行流進入相應的環境,就可能會用到他們。當變數離開環境時,則將其標記為「離開環境」。
垃圾收集器在運行的時候會給存儲在內存中的所有變數都加上標記。然後,它會去掉環境中的變數以及被環境中的變數引用的標記。而在此之後再被加上標記的變數將被視為准備刪除的變數,原因是環境中的變數已經無法訪問到這些變數了。最後。垃圾收集器完成內存清除工作,銷毀那些帶標記的值,並回收他們所佔用的內存空間。
關於這一塊,建議讀讀Tom大叔的幾篇文章,關於作用域鏈的一些知識詳解,讀完差不多就知道了,哪些變數會被做標記。
2、引用計數
另一種不太常見的垃圾回收策略是引用計數。引用計數的含義是跟蹤記錄每個值被引用的次數。當聲明了一個變數並將一個引用類型賦值給該變數時,則這個值的引用次數就是1。相反,如果包含對這個值引用的變數又取得了另外一個值,則這個值的引用次數就減1。當這個引用次數變成0時,則說明沒有辦法再訪問這個值了,因而就可以將其所佔的內存空間給收回來。這樣,垃圾收集器下次再運行時,它就會釋放那些引用次數為0的值所佔的內存。
但是用這種方法存在著一個問題,下面來看看代碼:
function problem() {
var objA = new Object();
var objB = new Object();
objA.someOtherObject = objB;
objB.anotherObject = objA;
}
在這個例子中,objA和objB通過各自的屬性相互引用;也就是說這兩個對象的引用次數都是2。在採用引用計數的策略中,由於函數執行之後,這兩個對象都離開了作用域,函數執行完成之後,objA和objB還將會繼續存在,因為他們的引用次數永遠不會是0。這樣的相互引用如果說很大量的存在就會導致大量的內存泄露。
我們知道,IE中有一部分對象並不是原生JavaScript對象。例如,其BOM和DOM中的對象就是使用C++以COM(Component Object
Model,組件對象)對象的形式實現的,而COM對象的垃圾回收器就是採用的引用計數的策略。因此,即使IE的Javascript引擎使用標記清除的策略來實現的,但JavaScript訪問的COM對象依然是基於引用計數的策略的。說白了,只要IE中涉及COM對象,就會存在循環引用的問題。看看下面的這個簡單的例子:
var element = document.getElementById("some_element");
var myObj =new Object();
myObj.element = element;
element.someObject = myObj;
上面這個例子中,在一個DOM元素(element)與一個原生JavaScript對象(myObj)之間建立了循環引用。其中,變數myObj有一個名為element的屬性指向element;而變數element有一個名為someObject的屬性回指到myObj。由於循環引用,即使將例子中的DOM從頁面中移除,內存也永遠不會回收。
不過上面的問題也不是不能解決,我們可以手動切斷他們的循環引用。
myObj.element = null;
element.someObject =null;
這樣寫代碼的話就可以解決循環引用的問題了,也就防止了內存泄露的問題。
三、減少JavaScript中的垃圾回收
首先,最明顯的,new關鍵字就意味著一次內存分配,例如 new Foo()。最好的處理方法是:在初始化的時候新建對象,然後在後續過程中盡量多的重用這些創建好的對象。
另外還有以下三種內存分配表達式(可能不像new關鍵字那麼明顯了):
{} (創建一個新對象)
[] (創建一個新數組)
function() {…} (創建一個新的方法,注意:新建方法也會導致垃圾收集!!)
1、對象object優化
為了最大限度的實現對象的重用,應該像避使用new語句一樣避免使用{}來新建對象。
{「foo」:」bar」}這種方式新建的帶屬性的對象,常常作為方法的返回值來使用,可是這將會導致過多的內存創建,因此最好的解決辦法是:每一次函數調用完成之後,將需要返回的數據放入一個全局的對象中,並返回此全局對象。如果使用這種方式,就意味著每一次方法調用都會導致全局對象內容的修改,這有可能會導致錯誤的發生。因此,一定要對此全局對象的使用進行詳細的注釋和說明。
有一種方式能夠保證對象(確保對象prototype上沒有屬性)的重復利用,那就是遍歷此對象的所有屬性,並逐個刪除,最終將對象清理為一個空對象。
cr.wipe(obj)方法就是為此功能而生,代碼如下:
// 刪除obj對象的所有屬性,高效的將obj轉化為一個嶄新的對象!
cr.wipe = function (obj) {
for (var p in obj) {
if (obj.hasOwnProperty(p))
delete obj[p];
}
};
有些時候,你可以使用cr.wipe(obj)方法清理對象,再為obj添加新的屬性,就可以達到重復利用對象的目的。雖然通過清空一個對象來獲取「新對象」的做法,比簡單的通過{}來創建對象要耗時一些,但是在實時性要求很高的代碼中,這一點短暫的時間消耗,將會有效的減少垃圾堆積,並且最終避免垃圾回收暫停,這是非常值得的!
2、數組array優化
將[]賦值給一個數組對象,是清空數組的捷徑(例如: arr = [];),但是需要注意的是,這種方式又創建了一個新的空對象,並且將原來的數組對象變成了一小片內存垃圾!實際上,將數組長度賦值為0(arr.length = 0)也能達到清空數組的目的,並且同時能實現數組重用,減少內存垃圾的產生。
3、方法function優化
方法一般都是在初始化的時候創建,並且此後很少在運行時進行動態內存分配,這就使得導致內存垃圾產生的方法,找起來就不是那麼容易了。但是從另一角度來說,這更便於我們尋找了,因為只要是動態創建方法的地方,就有可能產生內存垃圾。例如:將方法作為返回值,就是一個動態創建方法的實例。
在游戲的主循環中,setTimeout或requestAnimationFrame來調用一個成員方法是很常見的,例如:
setTimeout(
(function(self) {
return function () {
self.tick();
};
})(this), 16)
每過16毫秒調用一次this.tick(),嗯,乍一看似乎沒什麼問題,但是仔細一琢磨,每一次調用都返回了一個新的方法對象,這就導致了大量的方法對象垃圾!
為了解決這個問題,可以將作為返回值的方法保存起來,例如:
// at startup
this.tickFunc = (
function(self) {
return function() {
self.tick();
};
}
)(this);
// in the tick() function
setTimeout(this.tickFunc, 16);
相比於每次都新建一個方法對象,這種方式在每一幀當中重用了相同的方法對象。這種方式的優勢是顯而易見的,而這種思想也可以應用在任何以方法為返回值或者在運行時創建方法的情況當中。
4、高級技術
從根本上來說,javascript本身就是圍繞著垃圾收集來設計的。隨著我們工作的進行,避免內存垃圾變得越來越困難。因為很多方便實用的Javascript庫方法也會產生一些新的對象。對於這些庫方法產生的垃圾,我們束手無策,只能重新翻看文檔,並且檢查方法的返回值。例如,數組的slice方法返回一個新的數組(在不修改原數組的基礎上,截取出一部分作為新數組),字元串的substr方法返回一個新的字元串(在不修改原字元串的基礎上,截取出一部分字元串作為返回值)等等。
調用這些庫方法,將會創建內存垃圾,而你能做的,只有避免調用這些方法,或者用不創建系統垃圾的方式重寫這些方法(有點極端啦~)。
例如,在Construct 2引擎中,從數組中利用下標來刪除一個元素,是經常進行的操作。最初我們是用下面這種方式來實現的:
var sliced = arr.slice(index + 1);
arr.length = index;
arr.push.apply(arr, sliced);
然而,slice方法會返回一個新的數組對象(數組中的元素是原數組中刪掉的部分),並且會通過arr.push.apply方法將元素重新復制回原數組,但是在此操作之後,該數組就成為了一片內存垃圾。由於這是我們引擎中的垃圾產生的熱點代碼(使用頻率非常很高),因此我們利用了迭代的方式重寫了上述代碼:
for (var i = index, len = arr.length – 1; i < len; i++)
arr[i] = arr[i + 1];
arr.length = len;
顯然,重寫大量的庫函數是非常痛苦的,因此你必須仔細權衡方法的易用性和內存垃圾產生情況。如果產生大量內存垃圾的方法在動畫的每一幀中被多次調用,你可能就會興高采烈的重寫庫函數啦。
在遞歸函數中,通過{}構造空對象,並在遞歸過程中傳遞數據,雖然是很方便的。但是更好的方式是:利用一個單獨的數組對象作為堆棧,在遞歸過程中對數組進行push和pop操作。更進一步,不要調用array的pop方法(pop將會使得array的最後一個元素將會變成內存垃圾),而應該使用一個索引來記錄數組的最後一個元素的位置,在pop時簡單的將索引減一即可;類似的,將索引加1來代替array的push操作,只有當索引對應的元素不存在時,才執行真正的push為數組加入一個新元素。
另外,在任何時候,都應該避免使用向量對象(例如:包含x和y屬性的vector2對象)。有些方法將向量對象作為方法返回值,既可以支持返回值的再次修改,又能夠將需要的屬性一次性返回,使用起來非常方便。但是有時候在一幀動畫中,創建了成百上千個這樣的向量對象,從而導致嚴重的垃圾回收性能問題,也是非常常見的。因此最好將這些方法分離成具有獨立職責的功能個體,例如:利用getX()和getY()方法(返回具體數據)代替getPosition()方法(返回一個vector2對象)。
四、總結
在Javascript中,徹底避免垃圾回收是非常困難的。垃圾回收機制與實時軟體(例如:游戲)的實時性要求,從根本上就是對立的。
但是,為了減少內存垃圾,我們還是可以對javascript代碼進行徹底檢查,有些代碼中存在明顯的產生過多內存垃圾的問題代碼,這些正是我們需要檢查並且完善的。
我認為,只要我們投入更多的精力和關注,實現實時的、低垃圾收集的javascript應用還是很有可能的。畢竟,對於可交互性要求較高的游戲或應用來說,實時性和低垃圾收集,兩者都是至關重要。
⑻ java什麼是垃圾回收機制
1、回收的內容是new出來的對象所佔內存;
2、垃圾回收只與內存有關,清理內存外的資源依靠finalize()方法。垃圾回收機制在回收某個對象的內存前會調用該對象的finalize()方法。
3、強制系統垃圾回收的方式(通過程序通知系統進行垃圾回收,但系統還不一定進行垃圾回收):
System.gc();
Runtime.getRuntime().gc();
- 4、垃圾回收以單獨的線程在後台運行,為減少虛擬機額外消耗,一般在內存不足時會進行垃圾回收,所以就算強制系統垃圾回收,垃圾回收也不一定發生;
5、對象在內存中的狀態有可達狀態、可恢復狀態、不可達狀態,當處於可恢復狀態時可能會進行垃圾回收。
⑼ 主流的垃圾回收機制都有哪些
總的來說,GC 可以有很多種分類方式:有一部分 GC 一定要遍歷需要 GC 的對象的圖,從而獲得一個精確的哪個對象活著哪個對象死了的信息。我們稱這種 GC 為 tracing GC,不需要遍歷的稱為 non-tracing GC (比如 reference counting,它只能獲得一個近似的信息,所以無法處理圖里的環)。有的 GC 需要程序員/編譯器提供合作,以精確的知道哪個 pointer 是對象(指需要 GC 的對象)。有的 GC 不需要,光靠猜(猜也是很難的!猜不出來就只能當做是 pointer 了),也能做到 GC。前者稱之為 precise GC,後者稱之為 conservative GC(比如 Boehm GC)。我們下面主要討論 precise GC。有的 GC 分配了內存之後,這塊內存可能會被移動到另外一個地方去,防止內存碎片化,提高緩存局部性(cache locality,這個怎麼翻譯呢..),這種 GC 被稱為 moving GC,而不這么做的 GC 就稱為 non-moving GC。moving GC 自然都是 tracing GC,因為它們必須要知道怎麼遍歷需要 GC 的對象的圖,不然沒法移動(畢竟移動某個對象的時候,也要修改存有這個對象的地方的值,指向新的位置)。有的 GC 一次處理整個對象圖,有的 GC 則做了優化,一部分時間只處理較新的對象。這個優化是建立在一個現象上的:新的對象比較容易指向老的對象,而老的對象較少指向新的對象;新的對象比較容易死掉,而活了比較久的對象則很有可能會活更久。很多編程的方式都會造成這種現象比如 immutable data structures那麼針對性的,GC 就可以區分對象的年紀,把內存分配的區域分為(較大的)老區和(較小的,為了緩存局部性)新區,然後根據老區滿了與否,每次 GC 判斷到底是只需要 GC 新區還是全都需要 GC。
⑽ 談談垃圾回收機制方式內存管理
1、原理
js按照固定的時間間隔找到不在繼續使用的變數,釋放其佔用的內存。
2.實現方式
(1)標記清除
垃圾收集器給存儲在內存上的所有變數都加上標記;
之後,去掉環境中的變數以及被環境引用變數的標記;
之後,被加上標記的變數就是准備刪除的變數(原因是環境中的變數無法訪問到這些變數了)。
目前,IE、firefox、opera、chrome和Safari瀏覽器都是標記清除的垃圾回收策略,只是回收時間間隔不一樣。
(2)引用計數
原理:記錄每個變數被引用的次數。釋放引用計數為0的變數所佔用的內存。
IE9 將BOM和DOM對象轉換成了真正的js對象。
3、管理內存
背景:分配給瀏覽器的可用內存通常會比桌面應用程序少。
因此,如何使用最少的內存讓頁面獲得最優的性能,就需要考慮管理內存。
一個比較好的做法是:解除引用,即不再使用的變數設置為null。