การตั้งค่ากอง
-XMX3550M: ตั้งค่าหน่วยความจำกองสูงสุดของ JVM เป็น 3550M
-XMS3550M: ตั้งค่าหน่วยความจำกองเริ่มต้นของ JVM เป็น 3550M ค่านี้สามารถตั้งค่าเช่นเดียวกับ -xmx เพื่อหลีกเลี่ยงการจัดสรรหน่วยความจำ JVM ใหม่ทุกครั้งที่คอลเลกชันขยะเสร็จสมบูรณ์
-xSS128K: ตั้งค่าขนาดสแต็กของแต่ละเธรด หลังจาก JDK5.0 ขนาดสแต็กแต่ละเธรดจะเป็น 1m และก่อนหน้านั้นแต่ละขนาดสแต็กเธรดแต่ละตัวจะเป็น 256k ควรปรับตามขนาดหน่วยความจำที่ต้องการของเธรดของแอปพลิเคชัน ในหน่วยความจำทางกายภาพเดียวกันการลดค่านี้สามารถสร้างเธรดได้มากขึ้น อย่างไรก็ตามระบบปฏิบัติการยังคงมีข้อ จำกัด เกี่ยวกับจำนวนเธรดในกระบวนการและไม่สามารถสร้างได้อย่างไม่สิ้นสุดโดยมีค่าประสบการณ์ตั้งแต่ประมาณ 3,000 ถึง 5,000
-xmn2g: ตั้งค่าหน่วยความจำกองเล็ก ๆ รุ่นรุ่นเล็กเป็น 2G ขนาดหน่วยความจำฮีปทั้งหมด = ขนาดรุ่นเล็ก + ขนาดรุ่นเก่า + ขนาดการสร้างถาวร โดยทั่วไปแล้วรุ่นถาวรมีขนาด 64 เมตรดังนั้นหลังจากเพิ่มคนรุ่นใหม่ขนาดของรุ่นเก่าจะลดลง ค่านี้มีผลกระทบอย่างมากต่อประสิทธิภาพของระบบและ Sun อย่างเป็นทางการแนะนำให้กำหนดค่าเป็น 3/8 ของกองทั้งหมด
-xx: Permsize = 256m: ตั้งค่าเริ่มต้นของหน่วยความจำฮีปต่อเนื่องเป็น 256m (ดูเหมือนว่าจะเป็นพารามิเตอร์การเริ่มต้นของ ides เช่น eclipse)
-xx: maxNewSize = size: ค่าสูงสุดที่วัตถุที่สร้างขึ้นใหม่สามารถครอบครองหน่วยความจำ
-xx: Maxpermsize = 512m: ตั้งค่าสูงสุดของการสร้างแบบถาวรเป็น 512m
-xx: newRatio = 4: ตั้งค่าอัตราส่วนของหน่วยความจำกองเล็ก ๆ (รวมถึงอีเด็นและสองภูมิภาคผู้รอดชีวิต) ไปยังหน่วยความจำรุ่นเก่า (ไม่รวมรุ่นถาวร) หากตั้งค่าเป็น 4 อัตราส่วนของคนรุ่นใหม่ต่อคนรุ่นเก่าคือ 1: 4
-xx: Survivorratio = 4: กำหนดอัตราส่วนของพื้นที่ Eden ต่อพื้นที่ผู้รอดชีวิตในหน่วยความจำกองรุ่นเยาว์ ตั้งค่าเป็น 4 อัตราส่วนระหว่างสองพื้นที่ผู้รอดชีวิต (JVM Heap Memory รุ่นเยาว์มี 2 พื้นที่ผู้รอดชีวิตตามค่าเริ่มต้น) และพื้นที่ Eden หนึ่งแห่งคือ 2: 4 และพื้นที่ผู้รอดชีวิตหนึ่งคนคิดเป็น 1/6 ของรุ่นเยาวชนทั้งหมด
-xx: MaxtEnuringThreshold = 7: หมายความว่าวัตถุถูกวางไว้ในผู้สูงอายุหากเคลื่อนที่ 7 ครั้งในพื้นที่ช่วยเหลือ (พื้นที่ผู้รอดชีวิต) และยังไม่ได้รีไซเคิล
หากตั้งค่าเป็น 0 วัตถุรุ่นใหม่จะไม่ผ่านพื้นที่ผู้รอดชีวิตและเข้าสู่รุ่นเก่าโดยตรง สำหรับแอพพลิเคชั่นเพิ่มเติมในรุ่นเก่านี้สามารถปรับปรุงประสิทธิภาพได้
หากค่านี้ถูกตั้งค่าเป็นค่าที่ใหญ่กว่าวัตถุรุ่นเยาว์จะถูกคัดลอกหลายครั้งในพื้นที่ผู้รอดชีวิตซึ่งสามารถเพิ่มเวลาการอยู่รอดของวัตถุในรุ่นเยาวชนและเพิ่มความน่าจะเป็นที่วัตถุจะถูกรีไซเคิลในรุ่นเยาวชน
การเลือกรีไซเคิล
JVM ให้สามตัวเลือก: นักสะสมอนุกรมนักสะสมแบบขนานและนักสะสมที่เกิดขึ้นพร้อมกัน แต่นักสะสมอนุกรมเหมาะสำหรับปริมาณข้อมูลขนาดเล็กเท่านั้นดังนั้นตัวเลือกที่นี่จึงเป็นหลักสำหรับนักสะสมคู่ขนานและนักสะสมที่เกิดขึ้นพร้อมกัน
โดยค่าเริ่มต้น JDK5.0 ใช้นักสะสมอนุกรมมาก่อน หากคุณต้องการใช้นักสะสมรายอื่นคุณจะต้องเพิ่มพารามิเตอร์ที่เกี่ยวข้องเมื่อเริ่มต้น หลังจาก JDK5.0 JVM จะทำการตัดสินอัจฉริยะตามการกำหนดค่าระบบปัจจุบัน
นักสะสมอนุกรม
-xx:+USERIALGC: ตั้งค่าตัวสะสมอนุกรม
ตัวสะสมแบบขนาน (ลำดับความสำคัญของปริมาณงาน)
-XX:+USEPRALLEGC: เลือก Garbage Collector เป็นตัวสะสมแบบขนาน การกำหนดค่านี้ใช้ได้เฉพาะสำหรับคนรุ่นใหม่เท่านั้น นั่นคือภายใต้การกำหนดค่าข้างต้นคนรุ่นใหม่ใช้คอลเลกชันพร้อมกันในขณะที่คนรุ่นเก่ายังคงใช้คอลเลกชันอนุกรม
-xx: ParallelGcThreads = 20: กำหนดค่าจำนวนเธรดของตัวสะสมแบบขนานนั่นคือจำนวนเธรดที่เก็บรวบรวมในเวลาเดียวกัน ค่านี้ได้รับการกำหนดค่าที่ดีที่สุดให้เท่ากับจำนวนโปรเซสเซอร์
-xx:+USEPRALLELLOLDGC: กำหนดค่าวิธีการรวบรวมขยะรุ่นเก่าในการรวบรวมแบบขนาน JDK6.0 รองรับคอลเลกชันแบบขนานสำหรับคนรุ่นเก่า
-xx: MaxGCPAUSEMILLIS = 100: ตั้งเวลาสูงสุด (เป็นมิลลิวินาที) สำหรับคอลเลกชันขยะรุ่นเยาวชนแต่ละคน หากไม่สามารถตอบสนองเวลานี้ JVM จะปรับขนาดของคนรุ่นใหม่โดยอัตโนมัติเพื่อให้ได้ค่านี้
-XX:+USEADAPTIVESIPOLICY: หลังจากตั้งค่าตัวเลือกนี้ตัวสะสมแบบขนานจะเลือกขนาดของพื้นที่รุ่นใหม่โดยอัตโนมัติและอัตราส่วนพื้นที่ผู้รอดชีวิตที่สอดคล้องกันโดยอัตโนมัติเพื่อให้ได้เวลาตอบสนองขั้นต่ำหรือความถี่ในการรวบรวมที่ระบุโดยระบบเป้าหมาย
แนะนำให้เปิดพารามิเตอร์เมื่อใช้ตัวสะสมแบบขนาน
ตัวสะสมพร้อมกัน (ต้องการเวลาตอบสนอง)
-xx:+USPARNEWGC: ตั้งค่ารุ่นเยาวชนให้เป็นคอลเลกชันพร้อมกัน สามารถใช้พร้อมกันกับคอลเลกชัน CMS JDK5.0 หรือสูงกว่า JVM จะตั้งค่าด้วยตัวเองตามการกำหนดค่าระบบดังนั้นจึงไม่จำเป็นต้องตั้งค่านี้อีกครั้ง
CMS ชื่อเต็มพร้อมกัน Pausecollector เป็นอัลกอริทึม GC ใหม่ที่แนะนำใน JDK1.4 เวอร์ชันต่อมา มันได้รับการปรับปรุงเพิ่มเติมใน JDK5 และ JDK6 สถานการณ์ที่เหมาะสมหลักคือความสำคัญของเวลาตอบสนองมากกว่าข้อกำหนดสำหรับปริมาณงานสามารถทนต่อเธรดการรวบรวมขยะและหัวข้อการแชร์โปรเซสเซอร์ของแอปพลิเคชันและมีวัตถุชีวิตที่ค่อนข้างยาวนานในแอปพลิเคชัน CMS ใช้สำหรับการรีไซเคิลของการครอบครองซึ่งคือการรีไซเคิลผู้สูงอายุ เป้าหมายคือการลดเวลาหยุดแอปพลิเคชันลดโอกาสที่จะเกิดขึ้นอย่างเต็มรูปแบบและใช้เธรดการรวบรวมขยะพร้อมกันกับเธรดแอปพลิเคชันเพื่อทำเครื่องหมายและล้างผู้สูงอายุ
-xx:+USECONCMARKSWEEPGC: ตั้งค่ารุ่นเก่าเป็นคอลเลกชันพร้อมกัน หลังจากกำหนดค่าสิ่งนี้ในการทดสอบการกำหนดค่าของ -xx: newRatio = 4 ไม่ถูกต้อง ดังนั้นจึงเป็นการดีที่สุดที่จะกำหนดขนาดของคนรุ่นใหม่ด้วย -xmn ในเวลานี้
-XX: CMSFULLGCSBEFORECOMPACTION =: เนื่องจากตัวสะสมพร้อมกันไม่ได้บีบอัดหรือจัดระเบียบพื้นที่หน่วยความจำ "ชิ้นส่วน" จะถูกสร้างขึ้นหลังจากทำงานเป็นระยะเวลาหนึ่งซึ่งจะลดประสิทธิภาพการทำงาน พารามิเตอร์นี้ตั้งค่าพื้นที่หน่วยความจำที่จะบีบอัดและจัดระเบียบหลังจากเรียกใช้ FullGC
-xx:+USECMSCOMPACTATATFULLCOLLECTION: เปิดการบีบอัดสำหรับคนรุ่นเก่า อาจส่งผลกระทบต่อประสิทธิภาพ แต่สามารถกำจัดการกระจายตัวของหน่วยความจำ
-XX:+CMSIncrementalMode: ตั้งค่าเป็นโหมดคอลเลกชันที่เพิ่มขึ้น โดยทั่วไปใช้กับสถานการณ์ CPU เดี่ยว
-XX: CMSInitiatingOcCupancyFraction = 70: หมายความว่าเมื่อพื้นที่ของคนรุ่นเก่าถึง 70%CMS จะเริ่มดำเนินการเพื่อให้แน่ใจว่าคนรุ่นเก่ามีพื้นที่เพียงพอที่จะรับวัตถุจากคนรุ่นใหม่
หมายเหตุ: หากคุณใช้นักสะสมขยะสองตัว, throughputCollector และ ConcurrentLowPausEcollector คุณจะต้องมีขนาดหน่วยความจำสูงที่เหมาะสมเพื่อเตรียมพร้อมสำหรับมัลติเธรด
อื่น
-xx:+ScavengeBeforefullgc: GC รุ่นต่อไปจะมีความสำคัญเหนือกว่า FullGC
-xx: -disable ExplicitGc: ยับยั้งการโทร System.gc () แต่ GC ของ JVM ยังคงถูกต้อง
-xx:+maxfdlimit: เพิ่มขีด จำกัด สูงสุดของจำนวนตัวอธิบายไฟล์
-xx:+usethreadpriorities: เปิดใช้งานเธรดลำดับความสำคัญ API แม้ว่า java.lang.thread.setPriority () จะมีผลมันจะไม่ถูกต้อง
-xx: Softreflrupolicymspermb = 0: วัตถุ "การอ้างอิงที่อ่อนนุ่ม" สามารถอยู่รอดได้ 0 มิลลิวินาทีหลังจากการเข้าถึงครั้งล่าสุด (ค่าเริ่มต้นคือ 1 วินาที)
-xx: TargetSurvivorratio = 90: อนุญาตให้ 90% ของพื้นที่ผู้รอดชีวิตถูกครอบครอง (ค่าเริ่มต้นคือ 50%) เพิ่มอัตราการใช้งานของผู้รอดชีวิต - ถ้าคุณเกินกว่านั้นคุณจะลองเก็บขยะ
ข้อมูลเสริม
-xx: -citime: การพิมพ์ใช้เวลาในการรวบรวม JIT
-xx: errorfile =./hs_err_pid.log: บันทึกบันทึกข้อผิดพลาดหรือข้อมูลลงในไฟล์ที่ระบุ
-xx: -ExtendedDtraceProbes: เปิดโพรบ DTRACE เฉพาะ Solaris
-xx: heapdumppath =./java_pid.hprof: ระบุเส้นทางหรือชื่อไฟล์เมื่อส่งออกข้อมูลฮีป
-xx: -HeapDumponOutoFMemoryError: ส่งออกข้อมูลที่เกี่ยวข้องในกองในเวลานี้เมื่อพบหน่วยความจำล้นครั้งแรก
-xx: onerror = ";": เรียกใช้คำสั่งที่กำหนดเองหลังจากเกิดข้อผิดพลาดร้ายแรงปรากฏขึ้น
-xx: onoutofMemoryError = ";": ดำเนินการคำสั่งที่กำหนดเองเมื่อพบหน่วยความจำล้นเป็นครั้งแรก
-xx: -printclasshistogram: การพิมพ์ข้อมูลคอลัมน์ของอินสแตนซ์คลาสหลังจากพบกับ Ctrl-break เช่นเดียวกับฟังก์ชัน JMAP-Histo
-xx: -printconcurrentlocks: พิมพ์ข้อมูลที่เกี่ยวข้องเกี่ยวกับการล็อคพร้อมกันหลังจากพบ Ctrl-Break เช่นเดียวกับฟังก์ชัน JStack-L
-xx: -PrintCommandLineFlags: เครื่องหมายการพิมพ์ที่ปรากฏบนบรรทัดคำสั่ง
-xx: -PrintCompilation: พิมพ์ข้อมูลที่เกี่ยวข้องเมื่อรวบรวมวิธีการ
-xx: -printgc: พิมพ์ข้อมูลที่เกี่ยวข้องทุกครั้งที่ GC
-xx: -printgcdetails: พิมพ์รายละเอียดทุกครั้งที่ GC
-xx: -printgctimestamps: พิมพ์การประทับเวลาของแต่ละ GC
-xx: -traceclassloading: ติดตามข้อมูลการโหลดของคลาส
-xx: -TraceclassLoadingPreorder: ติดตามข้อมูลการโหลดของคลาสทั้งหมดที่อ้างอิงถึง
-xx: -traceclassresolution: การติดตามพูลคงที่
-xx: -TraceclassunLoading: การติดตามคลาสการขนถ่ายข้อมูล
-xx: -TraceLoaderConstraints: การติดตามข้อมูลที่เกี่ยวข้องเกี่ยวกับข้อ จำกัด ของตัวโหลดคลาส
การฝึกปรับแต่งบริการ JVM
เซิร์ฟเวอร์: 8Cup, 8GMEM
เช่น
java-xmx3550m-xms3550m-xss128k-xx: newratio = 4-xx: survivorratio = 4-xx: maxpermsize = 16m-xx: maxtenuringthreshold = 0
แผนการปรับแต่ง:
-XMX5G: ตั้งค่าหน่วยความจำสูงสุดที่มีอยู่ของ JVM เป็น 5G
-XMS5G: ตั้งค่าหน่วยความจำ JVM เริ่มต้นเป็น 5G ค่านี้สามารถตั้งค่าเช่นเดียวกับ -xmx เพื่อหลีกเลี่ยงการจัดสรรหน่วยความจำ JVM ใหม่ทุกครั้งที่คอลเลกชันขยะเสร็จสมบูรณ์
-XMN2G: ตั้งขนาดของคนรุ่นใหม่เป็น 2G ขนาดหน่วยความจำฮีปทั้งหมด = ขนาดรุ่นเล็ก + ขนาดรุ่นเก่า + ขนาดการสร้างถาวร โดยทั่วไปแล้วรุ่นถาวรมีขนาด 64 เมตรดังนั้นหลังจากเพิ่มคนรุ่นใหม่ขนาดของรุ่นเก่าจะลดลง ค่านี้มีผลกระทบอย่างมากต่อประสิทธิภาพของระบบและ Sun อย่างเป็นทางการแนะนำให้กำหนดค่าเป็น 3/8 ของกองทั้งหมด
-XX:+USEPARNEWGC: ตั้งค่ารุ่นเยาวชนให้เป็นคอลเลกชันคู่ขนาน สามารถใช้พร้อมกันกับคอลเลกชัน CMS JDK5.0 หรือสูงกว่า JVM จะตั้งค่าด้วยตัวเองตามการกำหนดค่าระบบดังนั้นจึงไม่จำเป็นต้องตั้งค่านี้อีกครั้ง
-xx: ParallelGcThreads = 8: จำนวนเธรดเพื่อกำหนดค่าตัวสะสมแบบขนานนั่นคือจำนวนเธรดที่เก็บรวบรวมในเวลาเดียวกัน ค่านี้ได้รับการกำหนดค่าที่ดีที่สุดให้เท่ากับจำนวนโปรเซสเซอร์
-xx: Survivorratio = 6: กำหนดอัตราส่วนขนาดของพื้นที่ Eden และพื้นที่ผู้รอดชีวิตในรุ่นใหม่ จากประสบการณ์อัตราส่วนของโซนผู้รอดชีวิตทั้งสองต่อโซนเอเดนหนึ่งโซนคือ 2: 6 และหนึ่งโซนผู้รอดชีวิตคิดเป็น 1/8 ของคนรุ่นใหม่ทั้งหมด
-xx: MaxtEnuringThreshold = 30: ตั้งค่าอายุสูงสุดของขยะ (จำนวนครั้ง) หากตั้งค่าเป็น 0 วัตถุรุ่นใหม่จะเข้าสู่รุ่นเก่าโดยตรงโดยไม่ต้องผ่านพื้นที่ผู้รอดชีวิต สำหรับการใช้งานเพิ่มเติมในรุ่นเก่าสามารถปรับปรุงประสิทธิภาพได้ หากค่านี้ถูกตั้งค่าเป็นค่าที่ใหญ่กว่าวัตถุรุ่นเยาว์จะคัดลอกหลายครั้งในพื้นที่ผู้รอดชีวิตซึ่งสามารถเพิ่มเวลาการอยู่รอดของวัตถุและคนรุ่นใหม่และเพิ่มความน่าจะเป็นที่จะรีไซเคิลในรุ่นน้อง ตั้งค่าเป็น 30 หมายความว่าวัตถุถูกวางไว้ในรุ่นเก่าถ้ามันเคลื่อนที่ 30 ครั้งในพื้นที่ผู้รอดชีวิตและยังไม่ได้รีไซเคิล
-xx:+USECONCMARKSWEEPGC: ตั้งค่ารุ่นเก่าเป็นคอลเลกชันพร้อมกัน หลังจากการทดสอบและกำหนดค่าพารามิเตอร์นี้พารามิเตอร์ -xx: newRatio = 4 จะไม่ถูกต้อง ดังนั้นจึงเป็นการดีที่สุดที่จะกำหนดขนาดของรุ่นเยาวชนด้วย -xmn ดังนั้นพารามิเตอร์นี้จึงไม่แนะนำ
ข้อมูลอ้างอิง - การสร้างหน่วยความจำกอง JVM
หน่วยความจำฮีปของเครื่องเสมือนแบ่งออกเป็นสามชั่วอายุคน: คนรุ่นใหม่รุ่นเก่าและรุ่นถาวร ในหมู่พวกเขาคนรุ่นต่อเนื่องส่วนใหญ่เก็บข้อมูลคลาส Java ซึ่งมีส่วนเกี่ยวข้องกับวัตถุ Java ที่รวบรวมโดยนักสะสมขยะ ดังนั้นการแบ่งระหว่างคนรุ่นใหม่และคนรุ่นเก่ามีผลกระทบมากขึ้นในการเก็บขยะ
คนรุ่นใหม่
วัตถุที่สร้างขึ้นใหม่ทั้งหมดจะถูกวางไว้เป็นครั้งแรกในรุ่นน้อง เป้าหมายของคนรุ่นใหม่คือการรวบรวมวัตถุที่มีวงจรชีวิตสั้น ๆ โดยเร็วที่สุด รุ่นเยาว์ถูกแบ่งออกเป็นสามพื้นที่ หนึ่งพื้นที่อีเด็นสองพื้นที่ผู้รอดชีวิต (โดยทั่วไป)
วัตถุส่วนใหญ่ถูกสร้างขึ้นในพื้นที่เอเดน เมื่อพื้นที่เอเดนเต็มวัตถุที่รอดชีวิตจะถูกคัดลอกไปยังพื้นที่ผู้รอดชีวิต (หนึ่งในสอง) เมื่อพื้นที่ผู้รอดชีวิตเต็มไปด้วยวัตถุที่รอดชีวิตในพื้นที่นี้จะถูกคัดลอกไปยังพื้นที่ผู้รอดชีวิตอื่น เมื่อพื้นที่ผู้รอดชีวิตคนอื่น ๆ เต็มไปด้วยวัตถุที่คัดลอกมาจากพื้นที่ผู้รอดชีวิตก่อนหน้านี้และยังคงมีชีวิตรอดในเวลานี้จะถูกคัดลอกไปยัง "พื้นที่ที่ดำรงตำแหน่ง"
ควรสังเกตว่าพื้นที่ผู้รอดชีวิตทั้งสองนั้นสมมาตรและไม่มีความสัมพันธ์ในลำดับดังนั้นอาจมีวัตถุคัดลอกมาจากพื้นที่อีเด็นและวัตถุที่คัดลอกมาจากพื้นที่รอดชีวิตอื่น ๆ ในพื้นที่ผู้รอดชีวิตเดียวกันในเวลาเดียวกัน; และเฉพาะวัตถุที่คัดลอกไปยังพื้นที่เก่า (ญาติ) ยิ่งกว่านั้นมีหนึ่งในพื้นที่ผู้รอดชีวิตที่ว่างเปล่า ในกรณีพิเศษตามความต้องการของโปรแกรมพื้นที่ผู้รอดชีวิตสามารถกำหนดค่าได้ในหลาย ๆ (มากกว่าสอง) ซึ่งสามารถเพิ่มเวลาของการดำรงอยู่ของวัตถุในคนรุ่นใหม่และลดความเป็นไปได้ของการถูกวางไว้ในรุ่นเก่า
คนรุ่นเก่า
วัตถุที่ยังคงอยู่รอดหลังจากคอลเลกชันขยะ N (กำหนดค่า) ในรุ่นน้องจะถูกวางไว้ในรุ่นเก่า ดังนั้นจึงถือได้ว่าผู้สูงอายุเก็บวัตถุที่มีวงจรชีวิตที่ยาวนานขึ้น
รุ่นต่อเนื่อง
ใช้ในการจัดเก็บข้อมูลคงที่เช่น Javaclass วิธีการ ฯลฯ การสร้างแบบถาวรไม่มีผลกระทบอย่างมีนัยสำคัญต่อการรวบรวมขยะ แต่แอปพลิเคชันบางอย่างอาจสร้างหรือโทรแบบไดนามิกแบบไดนามิกเช่นไฮเบอร์เนต ฯลฯ ในเวลานี้ ขนาดการสร้างแบบถาวรถูกตั้งค่าโดย -xx: maxpermsize =
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับการเพิ่มประสิทธิภาพเครื่องเสมือน Java (การปรับจูน JVM) ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!