jQuery หรือ javascript เพื่อค้นหาการใช้หน่วยความจำของเพจ


100

มีวิธีค้นหาว่าหน้าเว็บใช้หน่วยความจำมากแค่ไหนหรือโดยแอปพลิเคชัน jquery ของฉัน

นี่คือสถานการณ์ของฉัน:

ฉันกำลังสร้างเว็บแอปที่มีข้อมูลจำนวนมากโดยใช้ส่วนหน้า jquery และแบ็กเอนด์ที่เงียบสงบซึ่งให้บริการข้อมูลใน JSON โหลดหน้าเว็บครั้งเดียวจากนั้นทุกอย่างจะเกิดขึ้นผ่าน ajax

UI ช่วยให้ผู้ใช้สามารถสร้างแท็บต่างๆภายใน UI และแต่ละแท็บสามารถมีข้อมูลจำนวนมากได้ ฉันกำลังพิจารณาที่จะ จำกัด จำนวนแท็บที่พวกเขาสามารถสร้างได้ แต่ก็คิดว่าจะเป็นการดีที่จะ จำกัด เฉพาะเมื่อการใช้งานหน่วยความจำเกินเกณฑ์ที่กำหนด

จากคำตอบฉันต้องการชี้แจงบางส่วน:

  • ฉันกำลังมองหาโซลูชันรันไทม์ (ไม่ใช่แค่เครื่องมือสำหรับนักพัฒนา) เพื่อให้แอปพลิเคชันของฉันสามารถกำหนดการทำงานตามการใช้หน่วยความจำในเบราว์เซอร์ของผู้ใช้
  • การนับองค์ประกอบ DOM หรือขนาดเอกสารอาจเป็นการประมาณที่ดี แต่อาจมีความคลาดเคลื่อนได้มากเนื่องจากจะไม่รวมการโยงเหตุการณ์ข้อมูล () ปลั๊กอินและโครงสร้างข้อมูลในหน่วยความจำอื่น ๆ

คุณควรตรวจสอบประเภทของผู้ใช้สำหรับเว็บแอปของคุณเพื่อดูว่าพวกเขาทำหรือไม่มีปัญหาเกี่ยวกับหน่วยความจำขณะใช้งานเว็บแอปของคุณ หรือคุณมีปัญหาเกี่ยวกับหน่วยความจำ / ประสิทธิภาพกับเว็บแอพของคุณเอง?
Prutswonder

@Prutswonder: ไม่ฉันไม่มีปัญหา แต่ฉันแค่อยากรู้ว่ามีเครื่องมือดังกล่าวอยู่หรือเปล่า คิดว่าแทนที่จะกำหนดขีด จำกัด ตายตัวบนแท็บวิธีการแบบไดนามิกอาจจะเจ๋ง
Tauren

ฉันเพิ่งเพิ่มรายละเอียดเพิ่มเติมบางอย่างในคำถามเพื่อช่วยชี้แจงว่าฉันกำลังมองหาโซลูชันรันไทม์ไม่ใช่โซลูชันบิลด์ไทม์
Tauren

2
แค่คำถามถ้ามีบางอย่างถูกแคชไว้แล้วจะยังคงนับอยู่หรือไม่?
ajax333221

คำตอบ:


67

ปรับปรุง 2015

ย้อนกลับไปในปี 2012 สิ่งนี้ไม่สามารถทำได้หากคุณต้องการรองรับเบราว์เซอร์หลัก ๆ ทั้งหมดที่ใช้งานอยู่ น่าเสียดายที่ตอนนี้ยังคงเป็นคุณลักษณะเฉพาะของ Chrome (ส่วนขยายที่ไม่ได้มาตรฐานwindow.performance)

window.performance.memory

รองรับเบราว์เซอร์: Chrome 6+


2012 คำตอบ

มีวิธีค้นหาว่าหน้าเว็บใช้หน่วยความจำมากแค่ไหนหรือโดยแอปพลิเคชัน jquery ของฉัน ฉันกำลังมองหาโซลูชันรันไทม์ (ไม่ใช่แค่เครื่องมือสำหรับนักพัฒนา) เพื่อให้แอปพลิเคชันของฉันสามารถกำหนดการทำงานตามการใช้หน่วยความจำในเบราว์เซอร์ของผู้ใช้

คำตอบง่ายๆ แต่ที่ถูกต้องคือไม่มี ไม่ใช่ทุกเบราว์เซอร์ที่เปิดเผยข้อมูลดังกล่าวกับคุณ และฉันคิดว่าคุณควรทิ้งความคิดเพียงเพราะความซับซ้อนและความไม่ถูกต้องของไฟล์โซลูชัน"แฮนด์เมด"อาจทำให้เกิดปัญหามากกว่าที่จะแก้ได้

การนับองค์ประกอบ DOM หรือขนาดเอกสารอาจเป็นการประมาณที่ดี แต่อาจมีความคลาดเคลื่อนได้มากเนื่องจากจะไม่รวมการโยงเหตุการณ์ข้อมูล () ปลั๊กอินและโครงสร้างข้อมูลในหน่วยความจำอื่น ๆ

หากคุณต้องการยึดติดกับแนวคิดของคุณจริงๆคุณควรแยกเนื้อหาคงที่และไดนามิกออกจากกัน

เนื้อหาคงที่ไม่ขึ้นอยู่กับการกระทำของผู้ใช้ (หน่วยความจำที่ใช้โดยไฟล์สคริปต์ปลั๊กอิน ฯลฯ )
สิ่งอื่น ๆ ถือเป็นแบบไดนามิกและควรเป็นจุดสนใจหลักของคุณเมื่อกำหนดขีด จำกัด ของคุณ

แต่ไม่มีวิธีง่ายๆที่จะสรุปได้ คุณสามารถใช้การติดตามระบบที่รวบรวมข้อมูลเหล่านี้ทั้งหมด การดำเนินการทั้งหมดควรเรียกใช้วิธีการติดตามที่เหมาะสม เช่น:

วิธีตัดหรือเขียนทับjQuery.dataเพื่อแจ้งระบบติดตามเกี่ยวกับการจัดสรรข้อมูลของคุณ

ตัดการปรับแต่ง html เพื่อให้มีการติดตามการเพิ่มหรือลบเนื้อหาด้วย ( innerHTML.lengthเป็นการประมาณที่ดีที่สุด)

หากคุณเก็บอ็อบเจ็กต์ไว้ในหน่วยความจำขนาดใหญ่ก็ควรตรวจสอบด้วย

สำหรับการผูกเหตุการณ์คุณควรใช้การมอบหมายเหตุการณ์และอาจถือได้ว่าเป็นปัจจัยที่ค่อนข้างตายตัว

อีกแง่มุมหนึ่งที่ทำให้ยากต่อการประมาณความต้องการหน่วยความจำของคุณอย่างถูกต้องคือเบราว์เซอร์ที่แตกต่างกันอาจจัดสรรหน่วยความจำแตกต่างกัน (สำหรับวัตถุ Javascript และองค์ประกอบ DOM)


ไม่innerHTML.lengthใช้หน่วยความจำหรือ RAM หรือ CPU (หรืออย่างอื่นฉันไม่รู้) ในการประมวลผลด้วยหรือไม่?
mrReiha

การสนับสนุนเบราว์เซอร์สำหรับคุณลักษณะนี้ไม่ใช่ IE9 + หรือสิ่งอื่นใดนอกจาก Chrome Window.performance.memory เป็น Chrome เท่านั้น docs.webplatform.org/wiki/apis/timing/properties/memory
Blunderfest

คุณพูดถูกฉันคิดว่าหน่วยความจำเป็นส่วนหนึ่งของมาตรฐานการกำหนดเวลาการนำทางและwindow.performanceวัตถุ รายการ "สนับสนุนโดย" แบบเก่าใช้ได้กับมาตรฐานนั้น window.performance.memoryถือเป็นส่วนขยายที่ไม่ได้มาตรฐานโดย Chrome
gblazex

หากต้องการเปิดใช้งานการตรวจสอบหน่วยความจำแบบเรียลไทม์ผ่าน window.performance.memory คุณต้องเริ่ม Chrome ด้วยแฟล็ก --enable-precision-memory-info
kluverua

อัปเดต: Opera ยังรองรับสิ่งนี้ ที่มา: Mozilla developer.mozilla.org/en-US/docs/Web/API/…
HoldOffHunger

39

คุณสามารถใช้Timing API

Navigation Timing เป็น JavaScript API สำหรับการวัดประสิทธิภาพบนเว็บอย่างแม่นยำ API ให้วิธีง่ายๆในการรับสถิติเวลาที่แม่นยำและละเอียด - เนทีฟ - สำหรับการนำทางหน้าเว็บและโหลดเหตุการณ์

window.performance.memory ให้การเข้าถึงข้อมูลการใช้หน่วยความจำ JavaScript


แนะนำให้อ่าน


ข้อเสนอแนะที่ดี ขอบคุณ.
MaximOrlovsky

22

คำถามนี้มีอายุ 5 ปีและทั้งจาวาสคริปต์และเบราว์เซอร์มีการพัฒนาอย่างไม่น่าเชื่อในเวลานี้ เนื่องจากตอนนี้เป็นไปได้แล้ว (อย่างน้อยก็ในบางเบราว์เซอร์) และคำถามนี้เป็นผลลัพธ์แรกเมื่อคุณ Google "จาวาสคริปต์แสดงการใช้หน่วยความจำ" ฉันคิดว่าฉันจะเสนอโซลูชันที่ทันสมัย

memory-stats.js: https://github.com/paulirish/memory-stats.js/tree/master

สคริปต์นี้ (ซึ่งคุณสามารถเรียกใช้เมื่อใดก็ได้บนเพจใดก็ได้) จะแสดงการใช้หน่วยความจำปัจจุบันของเพจ:

var script=document.createElement('script');
script.src='https://rawgit.com/paulirish/memory-stats.js/master/bookmarklet.js';
document.head.appendChild(script);


1
ดูเหมือนว่าจะรายงานการใช้หน่วยความจำ JS ไม่ใช่การใช้หน่วยความจำเพจตัวจัดการงานในตัวของ Chrome ระบุว่า Gmail ใช้ 250MB ในขณะที่ memory-stats.js รายงาน 33.7MB
Brandito

ไม่มีใบอนุญาตสำหรับหน้า github ของ bookmarklet.js ดังนั้นจึงน่าจะเป็นลิขสิทธิ์ทรัพย์สินทางปัญญา นั่นทำให้เกิดความไม่แน่นอนขึ้นอยู่กับโครงการนั้น ๆ
HoldOffHunger

8

ฉันไม่รู้วิธีใดเลยที่คุณจะทราบได้ว่าเบราว์เซอร์ใช้หน่วยความจำมากแค่ไหน แต่คุณอาจสามารถใช้ฮิวริสติกตามจำนวนองค์ประกอบบนหน้าได้ Uinsg jQuery คุณสามารถทำได้$('*').lengthและจะให้คุณนับจำนวนองค์ประกอบ DOM ตามจริงแล้วมันอาจจะง่ายกว่าแค่ทำการทดสอบการใช้งานบางอย่างและสร้างแท็บจำนวนคงที่เพื่อรองรับ


3
@tvanfosson: ไม่ใช่ความคิดที่ไม่ดี แต่นี่จะไม่ให้ข้อมูลเกี่ยวกับหน่วยความจำที่ไม่ใช่ DOM เช่น. data () และในโครงสร้างข้อมูลหน่วยความจำ แต่มันสามารถให้การประมาณน้ำหนักโดยรวมที่ดีซึ่งฉันสามารถใช้ได้
Tauren

4

ใช้เครื่องมือ Chrome Heap Snapshot

นอกจากนี้ยังมีเครื่องมือ Firebug ที่เรียกว่าMemoryBugแต่ดูเหมือนว่าจะยังไม่สุกมาก


@Pablo: ขอบคุณ ฉันจะใช้เครื่องมือ dev อย่างแน่นอน แต่หวังว่าจะพบบางสิ่งที่ฉันสามารถใช้ระหว่างรันไทม์เพื่อค้นหาการใช้หน่วยความจำในเบราว์เซอร์ของผู้ใช้แต่ละคน
Tauren

3

หากคุณต้องการเพียงแค่ดูเพื่อทดสอบมีวิธีใน Chrome ผ่านหน้านักพัฒนาซอฟต์แวร์เพื่อติดตามการใช้หน่วยความจำ แต่ไม่แน่ใจว่าจะทำอย่างไรในจาวาสคริปต์โดยตรง


@ Zachary: ขอบคุณ ฉันจะใช้เครื่องมือ dev อย่างแน่นอน แต่หวังว่าจะพบโซลูชันการวิเคราะห์รันไทม์
Tauren

1
หากคุณพบใครแจ้งให้เราทราบฉันชอบที่จะมีสักอันที่มีประโยชน์
Zachary K

3

ฉันอยากจะแนะนำวิธีแก้ปัญหาที่แตกต่างไปจากคำตอบอื่น ๆ โดยสิ้นเชิงนั่นคือสังเกตความเร็วของแอปพลิเคชันของคุณและเมื่อมันลดลงต่ำกว่าระดับที่กำหนดไว้ให้แสดงคำแนะนำแก่ผู้ใช้เพื่อปิดแท็บหรือปิดการใช้งานแท็บใหม่จากการเปิด ชั้นที่เรียบง่ายซึ่งมีชนิดของข้อมูลนี้เป็นตัวอย่างhttps://github.com/mrdoob/stats.js นอกเหนือจากนั้นอาจไม่เป็นการดีสำหรับแอปพลิเคชันที่เข้มข้นเช่นนี้ที่จะเก็บแท็บทั้งหมดไว้ในหน่วยความจำตั้งแต่แรก เช่นเก็บเฉพาะสถานะผู้ใช้ (เลื่อน) และโหลดข้อมูลทั้งหมดทุกครั้ง แต่เปิดสองแท็บสุดท้ายอาจเป็นตัวเลือกที่ปลอดภัยกว่า

สุดท้ายนักพัฒนา Webkit ได้พูดคุยเกี่ยวกับการเพิ่มข้อมูลหน่วยความจำลงในจาวาสคริปต์ แต่พวกเขามีข้อโต้แย้งมากมายเกี่ยวกับสิ่งที่ไม่ควรเปิดเผย ไม่ว่าจะด้วยวิธีใดก็ไม่น่าจะเป็นไปได้ที่ข้อมูลประเภทนี้จะพร้อมใช้งานในอีกไม่กี่ปี (แม้ว่าข้อมูลนั้นจะไม่เป็นประโยชน์ในตอนนี้ก็ตาม)


1

คำถามที่สมบูรณ์แบบกับฉันเริ่มต้นในโครงการที่คล้ายกัน!

ไม่มีวิธีที่ถูกต้องในการตรวจสอบการใช้หน่วยความจำ JS ในแอปเนื่องจากต้องใช้สิทธิ์ระดับสูงกว่า ตามที่กล่าวไว้ในความคิดเห็นการตรวจสอบจำนวนองค์ประกอบทั้งหมด ฯลฯ จะเสียเวลาเนื่องจากไม่สนใจเหตุการณ์ที่ถูกผูกไว้เป็นต้น

นี่จะเป็นปัญหาด้านสถาปัตยกรรมหากหน่วยความจำรั่วไหลรายการหรือองค์ประกอบที่ไม่ได้ใช้ยังคงมีอยู่ ตรวจสอบให้แน่ใจว่าเนื้อหาของแท็บปิดถูกลบอย่างสมบูรณ์โดยไม่มีตัวจัดการเหตุการณ์ ฯลฯ จะสมบูรณ์แบบ สมมติว่าเสร็จแล้วคุณสามารถจำลองการใช้งานหนักในเบราว์เซอร์และคาดการณ์ผลลัพธ์จากการตรวจสอบหน่วยความจำ (พิมพ์about: memoryในแถบที่อยู่)

Protip: หากคุณเปิดหน้าเดียวกันใน IE, FF, Safari ... และ Chrome; และกว่าจะไปที่about: memoryใน Chrome มันจะรายงานการใช้หน่วยความจำในเบราว์เซอร์อื่น ๆทั้งหมด เรียบร้อย!


0

สิ่งที่คุณอาจต้องทำคือให้เซิร์ฟเวอร์ติดตามแบนด์วิดท์สำหรับเซสชันนั้น (ส่งข้อมูลไปกี่ไบต์) เมื่อใช้งานเกินขีด จำกัด แทนที่จะส่งข้อมูลผ่าน ajax เซิร์ฟเวอร์ควรส่งรหัสข้อผิดพลาดซึ่งจาวาสคริปต์จะใช้เพื่อบอกผู้ใช้ว่าใช้ข้อมูลมากเกินไป


@incrediman: นั่นเป็นความคิดที่ยอดเยี่ยมเช่นกัน แต่ฉันไม่คิดว่ามันจะทำงานได้โดยไม่ต้องสร้างคุณสมบัติการติดตามจำนวนมาก - การนับไบต์จะไม่ทำงาน ปัญหาคือข้อมูลในแท็บเป็นรายการที่ผู้ใช้จะกรองและจัดเรียงในรูปแบบต่างๆ ทุกครั้งที่มีการเปลี่ยนแปลงข้อมูลใหม่จะถูกดึงจากเซิร์ฟเวอร์และแทนที่องค์ประกอบ Dom ปัจจุบัน นอกจากนี้ยังมีอะไรบอกว่าพวกเขาไม่กด "โหลดซ้ำ" และเริ่มต้นด้วยหน้าใหม่ ฉันต้องติดตาม 304s แล้วเช่นกัน แต่ฉันตั้งใจจะให้บริการ html แบบคงที่ข้อมูลทั้งหมดมาจากบริการ REST
Tauren

แนวทางนี้ไม่ได้อธิบายถึงองค์ประกอบที่สร้างหรือทำลายด้วย createElement () หรือ remove () ซึ่งจะส่งผลต่อการใช้งานหน่วยความจำของไคลเอ็นต์ แต่มันแตกต่างจากคำตอบอื่น ๆ อย่างน่าสนใจ (โดยการวัดฝั่งเซิร์ฟเวอร์ไม่ใช่ฝั่งไคลเอ็นต์การวัดของคุณจะไม่เปลี่ยนหน่วยความจำเหมือนคำตอบอื่น ๆ )
HoldOffHunger

0

คุณจะได้รับ document.documentElement.innerHTML และตรวจสอบความยาว มันจะให้จำนวนไบต์ที่ใช้โดยหน้าเว็บของคุณ

ซึ่งอาจใช้ไม่ได้กับทุกเบราว์เซอร์ ดังนั้นคุณสามารถรวมองค์ประกอบร่างกายทั้งหมดของคุณใน div ขนาดยักษ์และเรียก innerhtml บน div นั้น สิ่งที่ต้องการ<body><div id="giantDiv">...</div></body>


4
ความยาวของinnerHTMLสตริงที่สร้างขึ้นไม่น่าจะถูกปรับให้เป็นประโยชน์กับหน่วยความจำที่เบราว์เซอร์ใช้ (เช่นในโมเดลอ็อบเจ็กต์ภายใน) เพื่อแสดง HTML นั้น
TJ Crowder

แล้วทำไมล่ะ? เหตุผลของฉันคือถ้าข้อความบางส่วนถูกโหลดในเบราว์เซอร์ข้อความนั้นจะต้องถูกเก็บไว้ในหน่วยความจำ ดังนั้นจึงให้หน่วยความจำบางส่วนที่เบราว์เซอร์ใช้ในการแสดงผลเพจ
Midhat

4
คิดเกี่ยวกับวิธีนี้ ถ้าคุณพูดว่า "ฉันต้องการให้คุณ 10 ล้านดอลลาร์" นั่นคือ 8 คำ ในทางกลับกันถ้าคุณพูดว่า "ฉันอยากจะจามใส่ผ้าเช็ดปาก" นั่นคือ 7. 8/7 อันแรกมีค่ามากกว่าอันที่สองหรือไม่?
ปรีชา

1
สิ่งนี้คล้ายกับคำแนะนำของ @tvanfosson ในการนับองค์ประกอบ DOM ของคุณน่าจะแม่นยำกว่าเล็กน้อยเนื่องจากองค์ประกอบ Dom ที่แตกต่างกันอาจมีข้อความจำนวนต่างกัน แต่ก็ยังไม่ได้รับข้อมูลใด ๆ เกี่ยวกับ data () ตัวจัดการการคลิกในโครงสร้างข้อมูลหน่วยความจำและออบเจ็กต์และอื่น ๆ แอปของฉันใช้คุณสมบัติเหล่านี้มากมาย
Tauren

1
อาจมีตัวแปร JS ในขอบเขตที่ชี้ไปยังโหนด DOM ที่แยกออกซึ่งจะไม่เป็นส่วนหนึ่งขององค์ประกอบเอกสาร นอกจากนี้คุณยังสามารถเขียนโค้ดเพื่อโหลดสตริงที่ยาวมาก ๆ ลงในตัวแปรโดยใช้หน่วยความจำกิกะไบต์โดยไม่ส่งผลกระทบต่อข้อความบนเพจ
Josh Ribakoff
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.