คำถามติดแท็ก jvm

Java Virtual Machine (JVM) เปิดใช้งานชุดของโปรแกรมซอฟต์แวร์คอมพิวเตอร์และโครงสร้างข้อมูลเพื่อใช้โมเดลเครื่องเสมือนสำหรับการทำงานของโปรแกรมคอมพิวเตอร์และสคริปต์อื่น ๆ ใช้แท็กนี้สำหรับคำถามที่เกี่ยวข้องกับเครื่องมือที่จัดทำโดย JVM หรือวิธีการทำงานในสถานการณ์เฉพาะ


8
วิธีการคงที่และตัวแปรคงที่เก็บไว้ใน Java อยู่ที่ไหน
ตัวอย่างเช่น: class A { static int i=0; static int j; static void method() { // static k=0; can't use static for local variables only final is permitted // static int L; } } ตัวแปรเหล่านี้จะถูกเก็บไว้ที่ใดใน Java ในฮีปหรือในหน่วยความจำสแต็ก มีการจัดเก็บอย่างไร?
116 java  jvm 

6
ทำไม Java วนซ้ำ 4 พันล้านจึงใช้เวลาเพียง 2 ms?
ฉันใช้รหัส Java ต่อไปนี้บนแล็ปท็อปที่ใช้ 2.7 GHz Intel Core i7 ฉันตั้งใจจะให้มันวัดระยะเวลาที่จะจบลูปด้วยการวนซ้ำ 2 ^ 32 ซึ่งฉันคาดว่าจะประมาณ 1.48 วินาที (4 / 2.7 = 1.48) แต่จริงๆแล้วมันใช้เวลาเพียง 2 มิลลิวินาทีแทนที่จะเป็น 1.48 วินาที ฉันสงสัยว่านี่เป็นผลมาจากการเพิ่มประสิทธิภาพ JVM ใด ๆ ที่อยู่ข้างใต้หรือไม่? public static void main(String[] args) { long start = System.nanoTime(); for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++){ } …
113 java  for-loop  jvm 

7
ทำไมวิธีนี้ถึงพิมพ์ 4?
ฉันสงสัยว่าจะเกิดอะไรขึ้นเมื่อคุณพยายามจับ StackOverflowError และใช้วิธีการต่อไปนี้: class RandomNumberGenerator { static int cnt = 0; public static void main(String[] args) { try { main(args); } catch (StackOverflowError ignore) { System.out.println(cnt++); } } } ตอนนี้คำถามของฉัน: ทำไมวิธีนี้จึงพิมพ์ '4' ฉันคิดว่าอาจเป็นเพราะSystem.out.println()ต้องการ 3 ส่วนในกองการโทร แต่ฉันไม่รู้ว่าหมายเลข 3 มาจากไหน เมื่อคุณดูซอร์สโค้ด (และ bytecode) ของSystem.out.println()โดยปกติจะนำไปสู่การเรียกใช้เมธอดมากกว่า 3 (ดังนั้น 3 เซ็กเมนต์บน call stack จึงไม่เพียงพอ) หากเป็นเพราะการปรับให้เหมาะสม …
111 java  jvm  stack-overflow 

5
ทำไม JVM แคช JIT คอมไพล์โค้ดไม่ได้
การใช้งาน JVM ที่เป็นที่ยอมรับจาก Sun ใช้การเพิ่มประสิทธิภาพที่ค่อนข้างซับซ้อนบางอย่างกับ bytecode เพื่อให้ได้ความเร็วในการดำเนินการที่ใกล้เคียงกับเนทีฟหลังจากที่โค้ดถูกเรียกใช้ไปสองสามครั้ง คำถามคือเหตุใดโค้ดที่คอมไพล์นี้จึงไม่ถูกแคชลงในดิสก์เพื่อใช้ระหว่างการใช้ฟังก์ชัน / คลาสเดียวกันในภายหลัง ตามที่กล่าวมาทุกครั้งที่เรียกใช้งานโปรแกรมคอมไพเลอร์ JIT จะเริ่มทำงานใหม่แทนที่จะใช้โค้ดเวอร์ชันที่คอมไพล์ไว้ล่วงหน้า การเพิ่มคุณสมบัตินี้จะไม่เพิ่มการเพิ่มที่สำคัญให้กับเวลารันเริ่มต้นของโปรแกรมเมื่อมีการตีความ bytecode เป็นหลักหรือไม่?
107 java  caching  jvm  compilation  jit 

17
ขนาดฮีพ Java สูงสุดของ JVM 32 บิตบนระบบปฏิบัติการ 64 บิต
คำถามไม่ได้เกี่ยวกับขนาดฮีปสูงสุดบนระบบปฏิบัติการ 32 บิตเนื่องจากระบบปฏิบัติการ 32 บิตมีขนาดหน่วยความจำสูงสุดที่แอดเดรสได้ 4GB และขนาดฮีปสูงสุดของ JVM นั้นขึ้นอยู่กับจำนวนหน่วยความจำว่างที่ต่อเนื่องกันสามารถจองได้ ฉันสนใจที่จะทราบขนาดฮีปสูงสุด (ทั้งในทางทฤษฎีและในทางปฏิบัติ) สำหรับ JVM 32 บิตที่ทำงานในระบบปฏิบัติการ 64 บิต โดยทั่วไปฉันกำลังมองหาที่คำตอบคล้ายกับตัวเลขในคำถามที่เกี่ยวข้องในดังนั้น เหตุใดจึงใช้ JVM 32 บิตแทน 64 บิตเหตุผลนั้นไม่ใช่ทางเทคนิค แต่เป็นการบริหาร / ระบบราชการ - อาจสายเกินไปที่จะติดตั้ง JVM 64 บิตในสภาพแวดล้อมการใช้งานจริง
107 java  jvm 

1
CATALINA_OPTS กับ JAVA_OPTS - ความแตกต่างคืออะไร?
ฉันพยายามค้นหาความแตกต่างระหว่างตัวแปร Apache Tomcat - CATALINA_OPTSและJAVA_OPTSในSOและประหลาดใจที่เห็นว่ายังไม่มีคำถาม / คำตอบที่โพสต์ไว้ที่นี่ เลยคิดจะแบ่งปันที่นี่ (พร้อมคำตอบ) หลังจากพบความแตกต่าง ตรวจสอบคำตอบ / ความแตกต่างด้านล่าง หมายเหตุ:ในขณะที่โพสต์นี้เรากำลังเรียกใช้ Apache Tomcat v6.0.10 ด้วย JDK 6u32 บน CentOS5 64-bit arch
106 java  tomcat  jvm  tomcat6 

6
พูลค่าคงที่ของสตริงของ Java อยู่ที่ไหนฮีปหรือสแต็ก
ฉันรู้แนวคิดของพูลค่าคงที่และพูลค่าคงที่สตริงที่ JVM ใช้เพื่อจัดการกับตัวอักษร String แต่ฉันไม่รู้ว่า JVM ใช้หน่วยความจำประเภทใดเพื่อเก็บค่าคงที่ของสตริง กองหรือกอง? เนื่องจากเป็นลิเทอรัลที่ไม่เกี่ยวข้องกับอินสแตนซ์ใด ๆ ฉันจึงถือว่ามันจะถูกเก็บไว้ในสแต็ก แต่ถ้ามันไม่ได้อ้างถึงโดยอินสแตนซ์ใด ๆ GC จะต้องรวบรวมลิเทอรัล (แก้ไขฉันถ้าฉันผิด) ดังนั้นจะจัดการอย่างไรหากเก็บไว้ในสแต็ก
104 java  string  jvm 

5
JVM ป้องกันการเพิ่มประสิทธิภาพการโทรหางหรือไม่
ฉันเห็นคำพูดนี้ในคำถาม: ภาษาที่ใช้งานได้ดีในการสร้างบริการเว็บคืออะไร? โดยเฉพาะอย่างยิ่ง Scala ไม่รองรับการกำจัดหางโทรยกเว้นในฟังก์ชันเรียกซ้ำในตัวเองซึ่ง จำกัด ประเภทขององค์ประกอบที่คุณสามารถทำได้ (นี่เป็นข้อ จำกัด พื้นฐานของ JVM) นี่คือเรื่องจริง? ถ้าเป็นเช่นนั้น JVM ที่สร้างข้อ จำกัด พื้นฐานนี้คืออะไร?

3
เหตุใด JVM stack-based และ Dalvik VM register-based?
ฉันสงสัยว่าเหตุใด Sun จึงตัดสินใจสร้าง JVM stack-based และ Google ตัดสินใจที่จะสร้าง DalvikVM register ฉันคิดว่า JVM ไม่สามารถสันนิษฐานได้จริงๆว่ามีการลงทะเบียนจำนวนหนึ่งบนแพลตฟอร์มเป้าหมายเนื่องจากควรเป็นแพลตฟอร์มที่ไม่ขึ้นกับ ดังนั้นจึงเลื่อนการจัดสรรการลงทะเบียน ฯลฯ ไปยังคอมไพเลอร์ JIT (ช่วยแก้ให้ด้วยนะถ้าฉันผิด.) พวกแอนดรอยด์ก็เลยคิดว่า "เฮ้มันไม่มีประสิทธิภาพไปขอ register ตาม vm ทันที ... "? แต่เดี๋ยวก่อนมีอุปกรณ์ Android ที่แตกต่างกันจำนวนการลงทะเบียนที่ Dalvik กำหนดเป้าหมาย? Dalvik opcodes ฮาร์ดโค้ดสำหรับการลงทะเบียนจำนวนหนึ่งหรือไม่ อุปกรณ์ Android ปัจจุบันทั้งหมดในตลาดมีจำนวนการลงทะเบียนเท่ากันหรือไม่? หรือมีการจัดสรรรีจิสเตอร์ซ้ำระหว่างการโหลด dex หรือไม่ ทั้งหมดนี้เข้ากันได้อย่างไร?

2
พิมพ์ธง JVM ทั้งหมด
พบ JVM Flag ที่น่าสนใจ: java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version มันพิมพ์ตัวเลือกต่างๆมากมายหลายร้อยแบบฉันไม่เคยได้ยินมาก่อน นอกจากนี้ยังพิมพ์ค่าเริ่มต้นซึ่งช่วยในการวินิจฉัยพฤติกรรมของ JVM ได้ดีขึ้น ธงที่น่าสนใจอีกประการหนึ่งคือ: -XX:+UnlockExperimentalVMOptions มีใครรู้เอกสารที่อธิบายแต่ละคนบ้างไหม

9
จะล็อคคลาส Java ที่คอมไพล์แล้วเพื่อป้องกันการถอดรหัสได้อย่างไร?
ฉันจะล็อกคลาส Java ที่คอมไพล์แล้วเพื่อป้องกันการถอดรหัสได้อย่างไร ฉันรู้ว่านี่จะต้องเป็นหัวข้อที่พูดคุยกันอย่างดีบนอินเทอร์เน็ต แต่ฉันไม่สามารถหาข้อสรุปใด ๆ ได้หลังจากอ้างอิงถึง หลายคนแนะนำ obfuscator แต่พวกเขาแค่เปลี่ยนชื่อคลาสวิธีการและฟิลด์ด้วยลำดับอักขระที่ยากต่อการจดจำ แต่แล้วค่าคงที่ที่ละเอียดอ่อนล่ะ? ตัวอย่างเช่นคุณได้พัฒนาองค์ประกอบการเข้ารหัสและการถอดรหัสโดยใช้เทคนิคการเข้ารหัสตามรหัสผ่าน ในกรณีนี้คน Java ทั่วไปสามารถใช้JADเพื่อถอดรหัสไฟล์คลาสและดึงค่ารหัสผ่าน (กำหนดเป็นค่าคงที่) รวมทั้งเกลือได้อย่างง่ายดายและในทางกลับกันสามารถถอดรหัสข้อมูลโดยการเขียนโปรแกรมอิสระขนาดเล็ก! หรือควรสร้างส่วนประกอบที่ละเอียดอ่อนดังกล่าวในโค้ดเนทีฟ (เช่น VC ++) และเรียกใช้ผ่านJNI ?
98 java  jvm  decompiling 

5
ดีบักแอ็พพลิเคชัน java โดยไม่เริ่ม JVM ด้วยอาร์กิวเมนต์ดีบัก
โดยปกติในการแนบดีบักเกอร์กับ jvm ที่รันอยู่คุณจะต้องเริ่ม jvm ด้วยอาร์กิวเมนต์ดังต่อไปนี้: > java -Xdebug -Xrunjdwp:transport=dt_socket,address=1000,server=y,suspend=n ตอนนี้ถ้าฉันต้องการดีบักกระบวนการที่ไม่ได้เริ่มในโหมดดีบักฉันจะทำอย่างไร? สถานการณ์นี้เกิดขึ้นเมื่อระบบการผลิต (เช่นเริ่มต้นโดยไม่มีอาร์กิวเมนต์ดีบัก) แสดงข้อผิดพลาด 'สุ่ม' (ฉันใช้คำว่าหลวม ๆ ) ดังนั้นฉันจึงไม่สามารถรีสตาร์ท jvm ด้วยอาร์กิวเมนต์ที่เหมาะสมได้เพราะไม่มีใครรู้วิธีสร้างจุดบกพร่องอีกครั้ง เป็นไปไม่ได้ที่จะแนบ JVM ในสถานการณ์นี้หรือไม่? เพียงเพื่อชี้แจงว่าเป็นไปไม่ได้ที่จะใช้เครื่องมือเช่น jdb เพื่อแนบกับ JVM ที่รันอยู่แล้วเว้นแต่จะเริ่มต้นในโหมดดีบัก จากหน้า JVM man อีกวิธีในการใช้ jdb คือการเชื่อมต่อกับ Java VM ที่กำลังทำงานอยู่ VM ที่จะดีบักด้วย jdb ต้องเริ่มต้นด้วยตัวเลือกต่อไปนี้:

9
ความเข้ากันได้ของ Java 32 บิตเทียบกับ 64 บิต
โค้ด Java ที่สร้างและคอมไพล์เทียบกับ JDK 32 บิตเป็นโค้ดไบต์ 32 บิตทำงานใน JVM 64 บิตหรือไม่ หรือ JVM 64 บิตต้องการรหัส 64 บิตไบต์? เพื่อให้รายละเอียดเพิ่มเติมเล็กน้อยฉันมีโค้ดที่ทำงานในสภาพแวดล้อม Solaris ที่ใช้ JVM 32 บิต แต่ตอนนี้ฉันได้รับปัญหาหลังจากอัปเกรด JDK และ Weblogic Server เป็น 64 บิต

5
ฉันจะให้อาร์กิวเมนต์ JVM แก่ VisualVM ได้อย่างไร
ฉันใช้ VisualVM จาก JDK 1.6.0_26 เพื่อสร้างโปรไฟล์เว็บแอป Java ที่ทำงานภายใต้ Tomcat แต่ VisualVM มักบอกฉันว่ามีหน่วยความจำไม่เพียงพอที่จะถ่ายภาพรวมและใช้สวิตช์ -Xmx เพื่อเพิ่มหน่วยความจำให้กับ Netbeans . ปัญหาคือฉันใช้ VisualVM นอก Netbeans ดังนั้นฉันจะให้อาร์กิวเมนต์ JVM กับ jvisualvm.exe ได้อย่างไร
97 java  windows  jvm  visualvm 

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