2009-05-25 25 views
27

Tôi đang cố gắng chạy lệnh jstack trên ứng dụng java của mình. Ứng dụng khá lớn, chạy bên trong jboss AS chiếm khoảng 4GB bộ nhớ. Hệ điều hành là phiên bản Windows Server 2003 Standard. Mỗi lần tôi gặp lỗi "Không đủ bộ nhớ để xử lý lệnh này". Có đủ ram, 16GB và không gian đĩa. Vì vậy, bất kỳ ý tưởng?Jstack và không đủ bộ nhớ để xử lý lệnh này

+3

Dường như có thông báo lỗi cửa sổ. –

+0

Tôi có nó trên một chiếc Tomcat lấy 280 mb. – ripper234

+0

Đồng thời xem câu hỏi này - http://stackoverflow.com/questions/222108/getting-the-java-thread-id-and-stack-trace-of-run-away-java-thread Nó không ' t giúp như jconsole không thấy ứng dụng. – ripper234

Trả lời

43

Tôi chạy vào trong này thời gian gần đây trên Win2008r2 và nghĩ rằng tôi muốn chia sẻ giải pháp của tôi kể từ khi nó mất một thời gian để tìm ra. Rob's comment about psexec -s là những gì đã làm cho tôi.

Dường như trên Vista và sau đó jstack không hoạt động đối với các dịch vụ do ngữ cảnh của người dùng. Nó không liên quan gì đến trí nhớ. Tôi nghi ngờ đây là cùng một lý do mọi người đã nhìn thấy vấn đề này vào năm 2003 thông qua máy tính để bàn từ xa, trừ khi bạn sử dụng chuyển đổi/admin hoặc/console trên mstsc. Tính đến Vista, sự an toàn thắt chặt có lẽ là điều đã phá vỡ nó.

Bắt đầu ứng dụng của tôi từ cửa sổ cmd hoạt động tốt, nhưng điều đó không giúp tôi gỡ lỗi cài đặt chuẩn của chúng tôi. Kích hoạt cổng gỡ rối java (cho VisualVM, Eclipse hoặc hầu hết bất kỳ trình gỡ rối Java nào) yêu cầu khởi động lại ứng dụng, vì vậy bạn sẽ mất trạng thái mà bạn đang cố gắng nắm bắt nếu bạn chưa bật gỡ lỗi. Bắt đầu dịch vụ theo thông tin đăng nhập của người dùng của tôi không hoạt động - tôi hơi ngạc nhiên về điều đó. Nhưng psexec -s chạy jstack từ ngữ cảnh hệ thống, nó hoạt động như một sự quyến rũ. Oh, và bạn sẽ cần chạy psexec từ một dấu nhắc cmd nâng cao, nếu UAC đang bật.

+0

Điều này làm việc rất tốt cho tôi. –

+1

ditto. cảm ơn vì đã cứu ngày của tôi –

+0

Điều này hoạt động tốt với Win 2003. Cảm ơn bạn rất nhiều – dAm2K

3

Chúng tôi đã gặp sự cố khi chạy JStack trên máy tính Windows thậm chí với một ứng dụng khiêm tốn (1GB). Chúng tôi đã thực hiện phân tích đống và đống bằng Netbeans. Điều này dường như đối phó với việc phân tích các tệp kết xuất tốt hơn rất nhiều. YMMV.

Cung cấp cho Netbeans một bản dùng thử - rất tốt. Lưu ý rằng VisualVM là một trình rút gọn NB profiler và đi kèm với 6u7.

7

Trong quá khứ tôi đã thấy điều này khi JVM đang chạy như một dịch vụ Windows trên Windows 2003.

Đầu tiên, hãy kiểm tra xem nếu điều này là một issue with the TMP directory.

Thứ hai, jstack (hoặc các tiện ích khác như jconsole) sẽ không kết nối với quy trình cục bộ trừ khi nó đang chạy trong cùng một phiên. Nếu dịch vụ đang chạy như một người dùng cụ thể, bạn có thể kết nối bằng cách đăng nhập vào cùng một phiên. Nếu bạn đang sử dụng Remote Desktop, bạn có thể kết nối bằng cách sử dụng "mstsc/admin" (thường là/console) và thử chạy lại jstack. Chắc chắn kiểm tra để đảm bảo thư mục TMP được đặt đúng nếu điều này không khắc phục được sự cố.

Nếu dịch vụ đang chạy dưới dạng LocalSystem, quy trình trên có thể sẽ không giúp được gì nhiều. Tôi không biết nếu có một cách để đăng nhập vào cùng một phiên làm LocalSystem.

Một số giải pháp thay thế khác có thể là thiết lập quy trình giám sát từ xa và sử dụng jvisualvm (từ chính máy chủ hoặc máy khác) để kết nối qua cổng và thực hiện kết xuất chuỗi.

+16

Giải pháp nếu nó chạy như Hệ thống cục bộ: Kết nối bằng cách sử dụng "mstsc/admin" bằng tài khoản đăng nhập (không chắc chắn quyền chính xác cần có, của tôi nằm trong nhóm Quản trị viên) và sử dụng công cụ Sysinternals psexec như sau: psexec -s "% JAVA_HOME% \ bin \ jstack.exe" PID> stack.txt Trong đó PID là ID tiến trình của quy trình của bạn. Bạn cũng có thể phải thay thế đường dẫn thực tế cho JDK của bạn tùy thuộc vào môi trường cụ thể của bạn. –

0

Đây là thông báo lỗi từ O/S cơ bản. Không có nhiều bạn có thể làm trong mã của bạn để đối phó với điều này khác hơn là bắt ngoại lệ được ném. Boo cho Windows bị hạn chế.

http://technet.microsoft.com/en-us/library/cc978735.aspx

2

psexec -s jstack PID >> c:\jstack.log hoạt động hoàn hảo trên cùng một máy. Lần đầu tiên phải mất một thời gian nhưng một lần nữa tôi thực hiện với các chuyển hướng đến tùy chọn tập tin, nó hoàn thành với trong vài giây.

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