- vừa được xem lúc

Bạn có thực sự hiểu JVM chạy thế nào?

0 0 132

Người đăng: Nguyễn Mạnh Hùng

Theo Viblo Asia

Xin chào a/e đã đang và sẽ thành dev Java như em, chắc 99% mọi người đều biết jvm là máy ảo, java là ngôn ngữ biên dịch,… nhưng an hem có thực sự hiểu cơ chế hoạt động của java và jvm? Tại sao java lại ngốn ram hơn C++ (ví nó JVM) Tại sao java lại chạy chậm chậm hơn C,C++ (ví nó JVM) Thế vì sao chạy máy ảo (JVM) lại bị như vậy thì ít người có thể lý giải cụ thể cho mọi người biết. Rồi “úi dồi java ra 17 rồi, nhưng tao vẫn code java 5-8 có thấy khác gì đâu ngoài vài cái syntax…” Oki vậy cũng đi giải đáp các cấu hỏi trên nhé.

java-programming-programming-language-computer-wallpaper-preview.jpg

Bài viết này nằm trong chuỗi bài tìm hiểu spring boot native – GraalVM

Java hoạt động như nào?

Bạn có một đoạn mã Java, trước tiền trình biên dịch sẽ đưa về bytecode với javac. và rồi bạn đưa đống bytecode này lên bất kỳ hệ điều hành nào cài được JVM là nó sẽ chạy ngon lành cho bạn. khá đơn giản và dễ hiểu đúng? Vậy JVM sẽ làm gì với đống bytecode này?

Khi ứng dụng của bạn chạy, JVM sẽ đi đến từng bytecode của bạn và thông dịch và chuyển đổi nó thành mã máy và gửi nó CPU. code của bạn được thực thi

Đây là luồng cơ bản JVM hoạt động, Nhưng thanh niên thông dịch khá là "ngáo" khi biên dịch lãi cả những đoạn mã đã từng biên dịch , việc làm vậy sẽ dẫn đến lãng tài nguyên và hiệu năng => HVM cho chúng ta 2 thằng xịn xò hơn biến dịch viên C1 và C2

C1 compiler

C1 hoạt động dựa trên cơ chế đếm số đoạn code được thực hiện. Khi con số này đạt qua 1 ngưỡng nhất định C1 sẽ lưu đoạn mã này vào Cache. Vì vậy lần gọi tiếp theo sẽ không tôn tài nghiên đến thông dịch lần nữa. Lệnh sẽ được đưa trực tiếp đến CPU

C2 compiler

Sau khi đoạn mã được đưa vào Cache ở C1. Các kỹ sư của Oracle tiếp tục tạo ra trình biên dịch C2 với mong muốn tối ưu hóa nhưng đoạn mã phức tạp nhằm cài thiện hiệu năng của Java. “nhưng có vẻ dạo từ java 11 trở đi, C2 không còn được update quá nhiều để giúp tối ưu và chuyển sang mã máy nhanh hơn nữa thì phải ☹”.

Bạn tưởng vậy đã ngon? không đâu ạ việc C1 C2 chạy cùng lúc với ứng dụng, liên tục phải đếm đếm, tối ưu và đưa vào cache cũng làm hệ thống chậm đi 😦

AOT(aHead Of Time) và JIT(Just in time)

Không biết dịch 2 thằng này như nào nữa ☹ Đại ý AOT : làm trước, JIT : làm trong lúc ứng dụng chạy 😄

Oki. như ở trên đã nói C1 và C2 thực thi trong quá trình ứng dụng của bạn đang chạy. JVM sẽ cung cấp tài nguyên (Thread) dựa theo số đoạn mã cần được biên dịch qua C1C2 và Ram cho việc lưu trữ Cache dán tiếp gốn tài nguyên và làm chậm hệ thống lại. Việc này được gọi là JIT vì nó làm trong quá trình ứng dụng chạy.

Và tất nhiên chúng ta tòi thêm 1 thằng là AOT để khắc phục JIT. Java 9+ đã cho phép chung ta tùy chỉnh mã AOT giúp bạn biên dịch trước khi chạy ứng dụng (cái này mình sẽ bài cụ thể sau- nếu bài này nhiều sự quan tầm và … mình k bị sếp dị dealine =)))

Tổng kết

Việc liên tục phải thông dịch cả các mã đã từng thông dịch thành thành mã máy sẽ làm tốn tài nguyên và làm chậm của hệ thống. Với sự xuất hiện của C1 và C2 giúp cài thiện và giảm bớt số lần thông dịch. Nhưng việc counter số method chạy nhiều lần tiếp theo C2 Compile lần 2 nhắm tối ưu cần cấp Thread sau đó lưu vào Cache (Ram) cũng làm cho hệ thống tốn nhiều tài nguyên hơn. Oracle đang tiền tục cho ra các version JDK nhắm tối ưu hơn. Với việc thêm AOT ở Java9 đã giảm đáng kể thời gian compiler trong ứng Vậy lên cứ update java version mạnh lên nhé ae, đừng code ở java 5,8 nữa 😄

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tại sao Rails lại dùng cả Webpack lẫn Sprocket?

Khi Rails 6 được ra mắt, có thể bạn đã từng tự hỏi. WTF, sao Webpack đã được add vào rồi, mà Sprocket vẫn tồn tại thế kia . Chẳng phải Webpack và Sprocket được dùng để giải quyết chung một công việc hay sao. Hoặc cả đây:.

0 0 47

- vừa được xem lúc

Tìm hiểu chung về LLVM

Không hề khó khăn khi nhận thấy rằng các ngôn ngữ lập trình được tạo ra cũng như cải tiến với tốc độ ngày một cao. Rust của Mozilla, Swift của Apple hay Kotlin của Jetbrain và nhiều ngôn ngữ khác cung cấp cho các nhà phát triển một loạt các lựa chọn mới về tốc độ, độ an toàn, sự tiện lợi, tính di độ

0 0 20

- vừa được xem lúc

Sự khác nhau giữa trình biên dịch và trình thông dịch

Trình biên dịch là trình dịch chuyển đổi từ ngôn ngữ nguồn (các ngôn ngữ lập trình bậc cao) thành ngôn ngữ đối tượng (ví dự như ngôn ngữ máy). Ngược lại với trình biên dịch, trình thông dịch là một ch

0 0 34

- vừa được xem lúc

002: JVM Compiler với C1 Compiler và C2 Compiler

Bài viết nằm trong series Java memory management & performance. Một ví dụ dễ hiểu như sau, ta có một văn bản bằng tiếng Anh, và muốn nó được dịch sang ngôn ngữ tiếng Nhật để được thực thi.

0 0 38

- vừa được xem lúc

003: JVM Code cache và Ahead of Time Compiler

Bài viết nằm trong series Java memory management & performance. Bài viết hôm nay sẽ tìm hiểu kĩ hơn về JVM Code cache, tuning JVM Code cache size và AoT Compiler.

0 0 25

- vừa được xem lúc

Về gcc và g++

Về gcc và g++. Nếu thử man gcc và man g++ trên terminal, bạn đều thấy đều trỏ về 1 page với tiêu đề:. . gcc - GNU project C and C++ compiler.

0 0 19