Java VisualVM và Garbage Collector trong JVM

Trong bài viết này tôi sẽ mô tả vấn đề tôi gặp phải trong quá trình phát triển dự án OCR tại công ty.

Mô tả về dự án: Dự án OCR nhóm tôi làm giải quyết vấn đề xử lý ảnh định dạng .tiff. Chúng tôi có một tập ảnh tiff và cần viết một chương trình phần mềm có đầu vào là tập ảnh và đầu ra là tự động trích xuất các vùng dữ liệu đã cấu hình theo từng mẫu ảnh ra một file excel.

Về cơ bản thì nhóm dự án giải quyết được vấn đề là xử lý ảnh và trích xuất dữ liệu từng vùng ra file excel. Nhưng vấn đề thực sự đã đến khi đi đến những bước test cuối cùng trước khi khách hàng nghiệm thu.

Đó là xử lý với một tập dữ liệu ảnh lớn. Khoảng 3 4 nghìn ảnh trong 1 request và server phải xử lý đống ảnh đó.

Lúc đầu tôi đã gặp vấn đề Out of memory khi tôi khởi chạy mặc định ứng dụng. Sau đó tôi đã tìm hiểu và cấu hình Size cho Heap để có thể tránh tràn bộ nhớ bằng tham số -Xmx. Nhưng có vẻ vấn đề được giải quyết phần nào vì dung lượng vùng nhớ đã được tăng và thỉnh thoảng vẫn gặp phải tình trạng Out of memory. Tôi nhận thấy cách tăng vùng này không giải quyết triệt để được vấn đề.

Qua 1 2 hôm nghiên cứu tiếp theo. Tôi đã nghĩ sẽ phải cấu hình bằng một tham số khác. Nhưng tôi lại phải giải quyết một vấn đề khác cho hệ thống đó là xử lý đa luồng cái đống ảnh kia. Thay vì để 1 thread chạy lần lượt xử lý từng ảnh thì tôi chuyển sang dùng số thread bằng với số Core có trong máy tính để xử lý. Điều này giúp tăng hiệu năng đáng kể. Thay vì 1 giây process được 1 ảnh thì giờ 1 giây có thể xử lý 4 ảnh (Máy tính của tôi có 4 core). Sau đó tôi chạy lại 1000 ảnh và xem kết quả bộ nhớ thì thấy không còn gặp vấn đề Out of memory. Tôi hiểu rằng đó không phải là cách thực sự hiểu về Garbage Collector trong JVM mà đó chỉ là cách tôi tối ưu lại cách khởi tạo và dùng bộ nhớ Heap.

Sau đó tôi có tìm hiểu và giám sát hệ thống thông qua công cụ Java VisualVM có sẵn trong JDK và theo dõi.

Có vẻ mọi thứ đã dần lộ diện khi tôi nhìn thấy được bộ nhớ Heap đang được sử dụng và dọn dẹp như thế nào, cũng như việc sử dụng CPU đa luồng trong hệ thống, Thread Pool dùng như nào. Thể hiện nào được khởi tạo nhiều nhất.

Thôi tạm dừng tại đây, trong bài tiếp theo tôi sẽ cùng các bạn tìm hiểu về các tham số hữu ích khi chạy ứng dụng Java và cách cấu hình ứng dụng với Garbage Collector :-D

Comments

Popular posts from this blog

Fixing the DeepSpeed Import Error While Fine-Tuning the Qwen Model

Amazon Linux 2023 - User data configuration for launch templates to connect to the EKS cluster

How to create ISM policy and rotate logs in opensearch