2015-12-23 21 views
5

Khi lược tả ứng dụng của tôi, tôi gặp phải một hành vi kỳ lạ - luồng DestroyJavaVM đang chạy - 100% thời gian.Thread DestroyJavaVM LUÔN LUÔN chạy

enter image description here Sau khi làm một ít nghiên cứu về đề tài này, trên đó có hầu như không có thông tin giá trị trực tuyến, tất cả tôi hiểu là chủ đề này được coi unload the JVM upon exit.

Nếu trường hợp đó xảy ra, tại sao luồng này ở trạng thái RUNNING 100% thời gian ngay từ giây phút đầu tiên tôi khởi động ứng dụng của mình? Nó không tiêu thụ tài nguyên có giá trị và do đó có thể gây ra một OutOfMemoryError (như tôi đôi khi nhận được)?

Có bất kỳ tham chiếu chính thức nào về chuỗi này thực sự thực hiện hay không và điều gì kích hoạt khởi tạo của nó?

Cảm ơn

+0

Có nhiều khả năng các chủ đề khác đang gây ra 'OOME'. Tôi sẽ không bắt đầu với nghi phạm ít rõ ràng nhất. Bạn đã lược tả các luồng ứng dụng của mình để sử dụng bộ nhớ chưa? Đó sẽ là cách tiếp cận thẳng về phía trước để gỡ lỗi 'OOME 'bí ẩn của bạn. – Kayaman

+0

10x cho câu trả lời. Tất nhiên tôi đã sử dụng các biện pháp khác để tìm lý do tại sao tôi nhận được OOME (trong đó, BTW là lỗi "Giới hạn vượt quá giới hạn GC", được gây ra bởi mức sử dụng CPU cao), nhưng không có kết quả. Đây là loại cuối cùng của tôi. Chủ đề này rất đáng ngờ và tôi muốn biết doanh nghiệp nào đã chạy 100% thời gian. – KidCrippler

Trả lời

31

Điều này xảy ra vì hầu hết các ứng dụng đều chạy trong chuỗi.

Tất cả POJO ứng dụng bắt đầu bằng cách gọi phương thức main. Trong trường hợp đơn giản nhất, phương thức này sẽ thực hiện tất cả công việc, tạo đối tượng, phương thức gọi, v.v. Sau khi hoàn thành main, JVM được yêu cầu tắt bằng cách sử dụng luồng DestroyJavaVM chờ tất cả các chuỗi không phải daemon hoàn thành trước khi thực hiện công việc . Điều này là để đảm bảo rằng bất kỳ chủ đề bạn tạo chạy để hoàn thành trước khi JVM bị rách.

Ứng dụng có GUI, tuy nhiên, thường chạy dưới dạng một số chuỗi. Một cho xem các sự kiện hệ thống như sự kiện bàn phím hoặc chuột. Một cho việc duy trì các cửa sổ và hiển thị vv. Phương pháp main của loại ứng dụng này có thể sẽ chỉ khởi động tất cả các chuỗi bắt buộc và thoát. Nó vẫn tạo ra các chủ đề DestroyJavaVM nhưng bây giờ tất cả những gì hiện là chờ đợi cho tất cả các chủ đề của bạn tạo ra để kết thúc trước khi rách xuống VM.

Kết quả là, bất kỳ ứng dụng nào tạo chuỗi và chỉ dựa vào chức năng của chúng, allways sẽ có một chuỗi DestroyJavaVM đang chờ kết thúc. Vì tất cả nó đang làm là join ing tất cả các luồng đang chạy, nó không tiêu tốn bất kỳ tài nguyên nào.

+0

10x cho câu trả lời. Ứng dụng của tôi không có bất kỳ GUI nào. Tôi đang instantiating rất nhiều chủ đề, mặc dù, và chắc chắn dựa vào chức năng của họ. Nó có liên quan gì đến chủ đề DestroyJavaVM không? Điều gì thực sự kích hoạt khởi tạo của nó? Nếu tôi hiểu chính xác bạn, bạn nói rằng mặc dù chuỗi được hiển thị là CHẠY, nó thực sự ĐANG CHỜ? – KidCrippler

+3

@KidCrippler - Nó được tạo và bắt đầu sau khi thoát khỏi 'chính'. Xem [Thread.join()] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Thread.java#Thread.join%28long % 29) vì sao nó ở trạng thái 'Đang chạy' - nó sử dụng' wait (0) 'trong một vòng lặp chặt chẽ. – OldCurmudgeon

+0

Đó chỉ là câu trả lời tuyệt vời. Cảm ơn bạn đã viết nó. Tôi vừa đến đây một cách ngẫu nhiên, không tìm kiếm giải pháp nào, nhưng câu trả lời của bạn đã lôi kéo tôi lên bầu. :) –

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