Sơ bộ về kiến trúc của Java

980
18-01-2018
Sơ bộ về kiến trúc của Java

Theo như Bizfly Cloud chia sẻ Java cái tên dường như đã quá quen thuộc với chung ta. Java đã xuất hiện ở khắp mọi nơi từ những ứng dụng nhỏ cho tới những ứng dụng lớn. Các sản phẩm của các hãng lớn như Oracle, IBM.. sử dụng rất nhiều ngôn ngữ java. Hay như trong trường sinh viên thường được học lập trình hướng đối tượng (OOP) sử dụng java. 

Java có thể được cài đặt trên cả linux và window, vì vậy như viết một ứng dụng bằng Java thì ứng dụng đó có thể chạy được trên cả hai hệ điều hành là Linux và Window.

Việc cài đặt và chạy các ứng dụng java khác là dễ dàng. Bạn chỉ cần cài đặt java trên trang chủ của oracle và chạy ứng dụng thôi.

Có thể thấy java có rất nhiều ứng dụng. Thế nhưng, không phải ai cũng hiểu hết về bên dưới Java được chạy như thế nào. Thỉnh thoảng bạn lại thấy log có lỗi Out of memory Permgen hay ứng dụng đang chạy thì bị đơ một lúc rồi lại chạy bình thường. Bài viết dưới đây sẽ giúp bạn hiểu rõ hơn về Java và tùy chỉnh các tham số sao cho phù hợp với ứng dụng.

Khi nói đến một ngôn ngữ lập trình thường bạn sẽ hỏi nó là biên dịch hay thông dịch. Java sử dụng cả biên dịch và thông dịch. Tại sao lại vậy nhỉ?

Khi bạn viết xong 1 file helloworld.java bạn gõ lệnh javac thì bạn sẽ có 1 file .class, file .class này là dạng bytecode. Quá trình bạn chuyển từ file .java sang file .class là quá trình biên dịch. Để file .class có thể chạy được cần có một runtime environment đó là Java Virtual Machine (JVM). JVM sẽ thông dịch các đoạn bytecode (file .class) và tạo ra machine code có thể chạy được trên các hệ điều hành.

Lý do khiến Java có thể chạy được trên cả Window và Linux đó là vì nó java có JVM có thể chạy được trên cả window và linux. Giả sử có một loại hệ điều hành khác nữa thì sao. Đơn giản là viết JVM khác chạy được trên OS đó.

Một chút so sánh Java với .Net, .Net có một byte code là Common Intermediate Language (CIL). Sao nghe nó giống với file bytecode của java vậy nhỉ? Nghe có vẻ khá giống.

Ảnh 1.

Ảnh 2.

JVM load toàn bộ class của bạn lên RAM bao gồm class của bạn và class thư viện bạn sử dụng để khởi tạo ứng dụng. Sau đó, bytecode verifier sẽ kiểm tra lại các bytecode của bạn có hợp lệ không. Tiếp theo, JVM sẽ thông dịch bytecode sang mã máy và chạy.

Java sẽ thông dịch bytecode, vậy thì mỗi thao tác thực hiện được lặp đi lặp lại như các class common hay util thường xuyên được sử dụng sẽ phải thông dịch mỗi khi chạy. Thế thì ứng dụng chạy chậm lắm. Tại sao lại không biên dịch các class đó sau đó dùng lại. Thế là Just In Time Compiler (JIT Compiler) ra đời. JIT Compiler nó sẽ biên dịch các bytecode đã được thực thi trong JVM và cache lại. Mỗi khi gọi đến các lệnh đã được thực thi trước đó thì sẽ gọi vào cache trong JIT Compiler. Quá trình này tiết kiệm tài nguyên và thời gian thực thi các lệnh.

Trong quá trình JVM chạy, các object được sinh ra liên tục và thực thi nhiệm vụ. Sau một khoảng thời gian sẽ phải được kill đi nếu không thì JVM không còn chỗ chứa. Đây là quá trình Garbage Collector hay nôm na gọi là "dọn rác".

Trước khi có "rác" thì phải có quá trình sử dụng mới phát sinh ra "rác". Vậy thì JVM sử dụng bộ nhớ như thế nào mà phát sinh ra "rác".

Ảnh 3.

- Young Generation là nơi chứa các object khi mới được đưa vào trong JVM.

- Old Generation là nơi chứa các object được sử dụng lại nhiều lần.

- PermGen là nơi chưa các meta-data của các class sử dụng để load class và một số chức năng khác như là load StringPool.

Khi các object đi vào trong, JVM đầu tiên object sẽ được đưa vào eden. Các object này được load liên tục sẽ dẫn đến việc hết không gian sử dụng. Quá trình thực hiện GC sẽ xảy ra để đưa các object vẫn còn được sử dụng hoặc được tham chiếu vào trong vùng S0 hoặc S1 (S là Survivor). Các object còn sống sót qua vòng gửi xe sẽ phải trải qua một số vòng nữa ở S0 và S1 trước khi được vào trong bể bơi là Old Generation (Old Memory).

Khi đã ở trong vùng bể bơi Old Memory thì chỉ có ra khi mà bể đầy thôi. Khi mà đầy bể thì các object đã không còn sử dụng hoặc có tham chiếu đến ít hơn sẽ bị loại ra khỏi bể.

Trong trường hợp bể bơi Old Memory quá bé thì sẽ dẫn đến việc phải chờ lâu để cho các object ra khỏi bể bơi. Điều này dẫn đến out of memory.

Nhiều object với class mà JVM xử lý vậy meta lưu hết ở Permgen , permgen mà ít quá thì cũng sẽ bị out of memory permgen.

Hay bị out of memory vậy nhỉ?

Qua hình có thể thấy JVM heap và Permgen là 2 cấu hình khác nhau.Vì vậy khi chạy ứng dụng Java cần tùy chỉnh 2 tham số là JVM heap và Permgen sao cho hợp lý.

Chỉnh ra sao, thế nào là hợp lý tất cả sẽ có ở phần sau nhé.

Theo Bizfly Cloud chia sẻ

>> Xem thêm: Có phải chatbot sẽ nuốt cả thế giới?

TAGS: java
SHARE