2012-06-11 26 views
8

Tôi đã đọc rất nhiều Q & Một ở đây về các công cụ có sẵn để tìm hiểu không sử dụng lọ, chẳng hạn như:Tác động của việc có tập tin JAR không sử dụng trong CLASSPATH

  1. loosejar
  2. Classpath Helper

Câu hỏi của tôi ở đây là, có bất kỳ tác động nào (chẳng hạn như tải các lớp vào bộ nhớ, hiệu năng, v.v.) của việc sử dụng các JAR không sử dụng trong đường dẫn lớp vào thời gian biên dịch hay thời gian chạy không? Câu hỏi áp dụng cho cả hai hoạt động như một chương trình độc lập và máy chủ web (Apache Tomcat), mặc dù ban đầu tôi chỉ nghĩ về các chương trình độc lập.

LƯU Ý: Tôi đang chạy JDK 6u32 (64 bit).

Trả lời

8

Có bất kỳ tác động nào (chẳng hạn như tải lớp học vào bộ nhớ, hiệu suất, v.v.) có các JAR không sử dụng trong đường dẫn lớp vào thời gian biên dịch hay thời gian chạy không?

Sẽ có tác động nhỏ. Khi trình nạp lớp (hoặc tương đương của trình biên dịch) bắt đầu, nó phải đọc chỉ mục của mỗi tệp JAR để tìm ra các lớp nào nằm trong mỗi JAR. Nếu bạn có các JAR không cần thiết trên đường dẫn lớp, trình nạp lớp có nhiều việc phải làm và sẽ (ít nhất là tạm thời) sử dụng nhiều bộ nhớ hơn để lưu vào bộ nhớ cache các chỉ mục.

Điều này áp dụng cho tất cả các loại ứng dụng Java.

Câu hỏi mà bạn không hỏi là liệu tác động có ý nghĩa hay không. Câu trả lời là "thường không" ... nhưng càng nhiều "công cụ vô dụng" bạn có trên classpath thì tác động càng lớn.

+0

Vì vậy, * tác động nhỏ * có thể áp dụng ở cả thời gian biên dịch và thời gian chạy? – Gnanam

+0

Có ... trong cả hai trường hợp. Và thường không đáng lo ngại về cả hai trường hợp. –

0

Có, nó có tác động - vì JVM tìm kiếm các lớp cần thiết trong các JAR của CLASSPATH. Nó cũng có ý nghĩa để giữ các JAR kín, để báo cho JVM không tìm kiếm các lớp liên quan trong các JAR khác.

P.S .: javac cũng là một chương trình java, cho bản ghi.

+0

Tuy nhiên, bộ nhớ đệm của chỉ mục tệp JAR có nghĩa là chi phí tìm kiếm ở các địa điểm bổ sung là tối thiểu. –

3

Vấn đề chính không phải là hiệu suất vì chi phí tương đối nhỏ và chỉ khi tải các lớp mới. Vấn đề chính là bảo trì. Ví dụ, khi một thư viện cần phải được nâng cấp, bạn có thể lãng phí rất nhiều thời gian thử nghiệm các ứng dụng vẫn hoạt động ok với phiên bản mới chỉ để tìm thư viện đã không được sử dụng. (Giả sử bạn có một thư viện mới cần phiên bản mới hơn của thư viện bạn đã "sử dụng")

+0

Tôi không thể hiểu rõ điểm này - 'khi một thư viện cần được nâng cấp, bạn có thể lãng phí rất nhiều thời gian thử nghiệm ứng dụng vẫn hoạt động ok với phiên bản mới chỉ để tìm thư viện không được sử dụng'. Bạn có thể làm rõ về điều này? – Gnanam

+1

Giả sử bạn có phiên bản log4j 1.1, nhưng bạn muốn sử dụng thư viện X cần log4j 1.2 vì một số lý do. Bạn không thể chỉ cần thả trong phiên bản 1.2 cho đến khi bạn xác định nó không phá vỡ ứng dụng của bạn. Vì vậy, bạn kiểm tra lại ứng dụng của mình bằng cách sử dụng 1.2 để xem nó có hoạt động hay không và lãng phí rất nhiều thời gian bởi vì bạn thậm chí không sử dụng log4j. Nếu bạn chỉ có các thư viện bạn đang thực sự sử dụng thì đây không phải là vấn đề. –

Các vấn đề liên quan