Một cách sử dụng hữu ích của Arthas - Trang Cá Cược

Arthas là một công cụ chẩn đoán Java rất mạnh mẽ được phát triển bởi Alibaba. Công cụ này cung cấp nhiều lệnh tiện lợi để hỗ trợ việc gỡ lỗi và tối ưu hóa ứng dụng Java. Trong bài viết này, tôi muốn chia sẻ một cách dùng mà tôi đã áp dụng gần đây: gắn kết Arthas vào ứng dụng Spring Boot của mình và gọi trực tiếp kết quả tỷ số các phương thức từ đó. Điều này đặc biệt hữu ích khi bạn không có đủ nhật ký (log) hoặc cần kiểm tra giá trị trả về của một hàm mà không thể theo dõi dễ dàng.

Để minh họa rõ ràng hơn, hãy xem xét ví dụ sau:

Chúng ta có một Controller với phương thức query như sau:

1@RequestMapping(value = "/query", method = RequestMethod.GET)
2@ResponseBody
3public String query() {
4    return demoService.queryName("1");
5} [Trang  Cược](/post/1c83746fd5b5dee3.html) 

Trong khi đó, phương thức queryName trong class demoService được định nghĩa như sau:

1public String queryName(String no) {
2    if ("1".equals(no)) {
3        return "no1";
4    } else {
5        return "no2";
6    }
7}

Giả sử bây giờ bạn nghi ngờ rằng vấn đề nằm ở phần thực hiện của phương thức queryName. Để xác nhận điều này, bạn có thể sử dụng Arthas sau khi ứng dụng đã khởi động. Đầu tiên, tìm tiến trình của ứng dụng và gắn kết Arthas vào nó. Sau đó, chạy lệnh sau:

1vmtool --action getInstances --className com.nicksxs.spbdemo.service.DemoServiceImpl --express 'instances[0].queryName("1")'

Lệnh trên sẽ giúp bạn lấy ra một instance của lớp DemoServiceImpl từ bộ nhớ và gọi phương thức queryName với tham số "1". Kết quả trả về sẽ giúp bạn kiểm chứng xem liệu phương thức này hoạt động đúng hay không.

Giới thiệu về lệnh vmtool

Lệnh vmtool là một công cụ mạnh mẽ của Arthas, cho phép bạn tương tác với JVM thông qua giao diện JVMTI. Ví dụ, bạn có thể sử dụng vmtool để truy xuất các đối tượng trong bộ nhớ hoặc thậm chí thực hiện thu gom rác (Garbage Collection) ép buộc.

Một ví dụ đơn giản khác về cách sử dụng vmtool:

1vmtool --action getInstances --className java.lang.String --limit 10

Lệnh này sẽ liệt kê 10 đối tượng String đầu tiên từ bộ nhớ.

Các hành động (action) được hỗ trợ bao gồm:

  • forceGc: Ép buộc thu gom rác.
  • interruptThread: Ngắt một luồng đang chạy.
  • getInstances: Lấy các instance của một lớp từ bộ nhớ.

Trong trường hợp bạn muốn chuyển đổi kết quả thành định dạng JSON, bạn có thể sử dụng câu lệnh sau:

1vmtool --action getInstances --className com.nicksxs.spbdemo.service.DemoServiceImpl --express '@com.alibaba.fastjson.JSON@toJSONString(instances[0].queryName("1"))'

Ở đây, dấu @ được sử dụng để chỉ định các lớp hoặc phương thức tĩnh. Nếu lớp JSON không được tải sẵn bởi classloader mặc định, bạn cần chỉ định classloader cụ thể bằng cách sử dụng lệnh sc để tìm kiếm classloader phù hợp:

1sc -d com.nicksxs.spbdemo.service.DemoServiceImpl [đăng ký 99bet](/post/b05f18bbb6d9f98c.html) 

Sau khi có hash của classloader từ kết quả lệnh sc, bạn có thể cập nhật lệnh vmtool như sau:

1vmtool --action getInstances -c 18b4aac2 --className com.nicksxs.spbdemo.service.DemoServiceImpl --express '@com.alibaba.fastjson.JSON@toJSONString(instances[0].queryName("1"))'

Như vậy, lệnh sẽ hoạt động bình thường và trả về kết quả mong đợi.

Hy vọng bài viết này giúp bạn hiểu rõ hơn về cách sử dụng Arthas để tối ưu hóa quy trình gỡ lỗi ứng dụng Java!