2009-12-09 11 views
19

Tôi đã nhận thấy gần đây rằng có một số thư viện java (JDK, joda time, iText) biên dịch mà không có một số/tất cả thông tin gỡ lỗi. Thông tin biến cục bộ bị thiếu hoặc cả thông tin biến số cục bộ và số dòng bị thiếu.Tại sao một số thư viện java được biên dịch mà không cần thông tin gỡ lỗi

Có lý do nào cho việc này không? Tôi nhận ra nó làm cho mã biên dịch lớn hơn nhưng tôi không tin đó là một sự cân nhắc lớn đặc biệt. Hoặc là nó chỉ xây dựng với các tùy chọn biên dịch mặc định?

Cảm ơn.

+0

Thường xuyên hơn không, bạn sẽ có thể tải xuống phiên bản chưa được tối ưu hóa/"có thể gỡ lỗi" của lib hoặc bạn có thể chỉ cần cắn viên đạn và kéo xuống src chính mình – Ian

Trả lời

34

Các tùy chọn biên dịch mặc định không bao gồm thông tin gỡ lỗi, bạn phải thông báo cụ thể trình biên dịch để bao gồm nó. Có một số lý do khiến hầu hết mọi người bỏ qua nó:

  • Một số thư viện được sử dụng trong các hệ thống nhúng (như điện thoại di động). Cho đến gần đây, mỗi bit được tính. Ngày nay, hầu hết các điện thoại di động đi kèm với nhiều bộ nhớ hơn tất cả các máy tính trong năm 1985 đã cùng nhau;)
  • Khi được biên dịch với gỡ lỗi hoạt động, mã chạy chậm hơn 5%. Không nhiều nhưng một lần nữa, trong một số trường hợp mỗi chu kỳ đếm.
  • Nhà phát triển cao cấp của ngày hôm nay được sinh ra vào thời điểm 64KB RAM rất lớn. Hôm qua, tôi đã thêm một ổ đĩa 2TB khác vào máy chủ của tôi trong hầm. Đó là 7 đơn đặt hàng của cường độ trong 25 năm. Con người cần thêm thời gian để điều chỉnh.

[EDIT] Như John đã chỉ ra, Java bytecode không được tối ưu hóa (nhiều) nữa hôm nay. Vì vậy, đầu ra của các tệp lớp sẽ giống nhau cho cả hai trường hợp (chỉ tệp lớp có thông tin gỡ lỗi sẽ lớn hơn). Mã được tối ưu hóa trong JIT khi chạy, cho phép thời gian chạy tối ưu hóa mã cho CPU, bộ nhớ (số lượng và bố cục), v.v.

Hình phạt 5% được đề cập là khi bạn chạy mã và thêm dòng lệnh tùy chọn để cho phép trình gỡ lỗi từ xa đính kèm vào quy trình. Nếu bạn không bật gỡ lỗi từ xa, không có hình phạt (ngoại trừ việc tải lớp nhưng điều đó chỉ xảy ra một lần).

+0

Thêm vào đó, khi bạn biên dịch bằng gỡ lỗi được bật, bạn cũng biên dịch mà không cần tối ưu hóa mã (nếu không thì dòng số sẽ không có ý nghĩa), vì vậy bạn sẽ mất lợi ích hiệu suất của các phương thức/thuộc tính tĩnh/cuối cùng/riêng lẻ – Ian

+2

@iAn: Trong Java, biên dịch với tối ưu hóa là nói chung là vô nghĩa anyway - IIRC họ đã hoặc là loại bỏ các tùy chọn hoặc làm cho nó một no-op. Bạn không bị mất hiệu suất, bởi vì việc tối ưu hóa được thực hiện bởi JIT để thay thế. –

+7

Có, hôm nay, mã Java được tối ưu hóa khi chạy. Tỷ lệ 5% tốc độ thực sự là khi * chạy * mã với các tùy chọn để đính kèm trình gỡ lỗi từ xa. –

0

Có thể là kích thước của quá trình cài đặt. Thông tin gỡ lỗi thêm chi phí vào các tệp jar mà Sun có thể không thích.

Gần đây tôi phải điều tra một vấn đề Java Web Start - không có thông tin gỡ lỗi - vì vậy việc thêm truy tìm đầy đủ vào bảng điều khiển java và tải xuống mã nguồn đã giúp một số, nhưng mã này khá lộn xộn. xây dựng.

JDK nên được biên dịch bằng thông tin gỡ lỗi ĐẦY ĐỦ ở khắp mọi nơi!

+0

FYI có một lọ DEBUG của JDK6u18 chứa thông tin gỡ lỗi. Đó là khoảng 20mb lớn hơn so với thay thế. Xem tại đây: http://download.java.net/jdk6/ –