2010-02-19 40 views
11

EDIT: SIGSEGV có thể tái sản xuất này xảy ra trên máy Linux có nhiều hơn một proc và hơn 2GB mem, vì vậy Java được đặt mặc định ở chế độ máy chủ. Điều thú vị là nếu tôi buộc "-client" không có sự cố nữa ... (Tôi vẫn không chắc chắn phải làm gì với SIGSEGV tái sản xuất của tôi nhưng nó thú vị dù sao).Máy ảo Java: SIGSEGV có thể tái tạo trên cả 1.6.0_17 và 1.6.0_18, cách báo cáo?

lưu ý đầu tiên rằng đây là một chút liên quan nhưng không giống với những điều sau đây vì trong trường hợp của chúng tôi nó chỉ là một SIGSEGV điều đó xảy ra, và chúng tôi chắc chắn có thể kích hoạt nó:

JVM OutOfMemory error "death spiral" (not memory leak)

Nó liên quan bởi vì nó xảy ra khi chúng ta cho ăn ứng dụng của chúng tôi với một "dữ liệu dữ liệu": dữ liệu đến từ các tệp văn bản và sau đó được rút gọn số (có, số tài chính bị bẻ khóa trong Java).

Tôi có thể kích hoạt một JVM thành SIGSEGV bằng cách sử dụng mã Java hợp lệ.

LƯU Ý: Tôi luôn có thể sụp đổ cả JVM 1.6.0_17 adn JVM 1.6.0_18 và câu hỏi này không phải là về làm thế nào để workaround vấn đề này (ví dụ chơi với VM thông số thể khắc phục vấn đề nhưng tôi không phải sau đó, tôi muốn biết phải làm gì với SIGSEGV luôn tái tạo này).

Tôi đã giải quyết vấn đề bằng cách sử dụng Java 1.5 khi khởi chạy ứng dụng của chúng tôi (trong khi vẫn sử dụng Java 1.6 để chạy IntelliJ IDEA, v.v. trên cùng một máy, cùng một lúc), nhưng câu hỏi của tôi là báo cáo hay không, và nếu nó cần, làm thế nào để báo cáo nó biết rằng bản thân nhật ký chứa thông tin độc quyền (toàn bộ hs_err _..._ log).

phần cứng lỗi có thể được loại trừ khả năng cho:

  • này đang xảy ra trên một máy trạm thường xuyên đạt đến tháng thời gian hoạt động (tôi chỉ khởi động lại nó khi bản vá lỗi bảo mật quan trọng ảnh hưởng đến tôi tỉa xuống và cứng Debian Linux được ban hành , mà thực sự không xảy ra thường xuyên) và trên các ứng dụng không bao giờ sụp đổ (làm cho nó rất không chắc rằng đó là một vấn đề phần cứng trên máy đó [hơn bên dưới])

  • cùng một ứng dụng hoạt động hoàn hảo trên cùng một máy trong JVM 1.5 dưới cùng một tải (đây là cách tôi đang thử nghiệm các ứng dụng: Tôi chỉ đơn giản là khởi động nó dưới một máy ảo 1.5)

  • cùng một ứng dụng hoạt động hoàn toàn tốt trên nhiều máy khách hàng trăm dưới cùng tải (khổng lồ) (không bao giờ bị rơi một lần trên Windows + JVM 1.5 hoặc 1.6 và không bao giờ bị rơi một lần trên OS X + JVM 1.5 hoặc 1.6 [sự cố có nghĩa là cuộc gọi điện thoại tức thì từ khách hàng])

  • ứng dụng khác trên cùng một máy đó và cùng 1.6.0_17 hoặc 1.6.0_18 JVM không bao giờ gặp sự cố (ví dụ: tôi có hai phiên bản IntelliJ IDEA chạy với hai người dùng khác nhau trên cùng một máy đó và họ không gặp lỗi)

  • máy được kiểm tra với memtest "thường xuyên" (trước khi cài đặt mới hệ điều hành, mà cuối cùng đã xảy ra khi tôi cài đặt Debian Lenny, cách đây không lâu)

đây là tái sản xuất theo yêu cầu SIGSEGV:

... $uname -a 
Linux saturn 2.6.26-2-686 #1 SMP Wed Nov 4 20:45:37 UTC 2009 i686 GNU/Linux 
... $ export /home/wizard/jdk1.6.0_17/bin:$PATH 
... $ java -version 
java version "1.6.0_17" 
Java(TM) SE Runtime Environment (build 1.6.0_17-b04) 
Java HotSpot(TM) Server VM (build 14.3-b01, mixed mode) 

Khởi chạy ứng dụng, thức ăn nó một "hàng tấn dữ liệu ", đợi vài giây ...

Sau đó, không thay đổi, cho 1.6.0_17:

# 
# A fatal error has been detected by the Java Runtime Environment: 
# 
# SIGSEGV (0xb) at pc=0xb76d0080, pid=30793, tid=2514328464 
# 
# JRE version: 6.0_17-b04 
# Java VM: Java HotSpot(TM) Server VM (14.3-b01 mixed mode linux-x86) 
# Problematic frame: 
# V [libjvm.so+0x4bc080] 
# 
# An error report file with more information is saved as: 
# /home/wizard/hs_err_pid30793.log 
# 
# If you would like to submit a bug report, please visit: 
# http://java.sun.com/webapps/bugreport/crash.jsp 

(lưu ý dòng '[libjvm.so + 0x4bc080]' là phù hợp cho 1.6.0_17 ở mọi SIGSEGV)

hoặc 1,6 .0_18:

# 
# A fatal error has been detected by the Java Runtime Environment: 
# 
# SIGSEGV (0xb) at pc=0xb77468f0, pid=722, tid=2514516880 
# 
# JRE version: 6.0_18-b07 
# Java VM: Java HotSpot(TM) Server VM (16.0-b13 mixed mode linux-x86) 
# Problematic frame: 
# V [libjvm.so+0x4d88f0] 
# 
# An error report file with more information is saved as: 
# /home/wizard/hs_err_pid722.log 
# 
# If you would like to submit a bug report, please visit: 
# http://java.sun.com/webapps/bugreport/crash.jsp 
# 
Aborted 

(lưu ý dòng "[libjvm.so + 0x4d88f0]" là phù hợp cho 1.6.0_18 ở mọi SIGSEGV)

các prob lem là tệp nhật ký chứa thông tin độc quyền không thể chia sẻ được.

Sao chép "trường hợp thử nghiệm nhỏ" tái tạo sự cố không thực tế: vấn đề tương tự như vấn đề được liên kết ở trên, điều này chỉ xảy ra khi một "dữ liệu" được cấp cho ứng dụng. Lưu ý rằng chính xác cùng một ứng dụng, trên chính xác cùng một phần cứng, với chính xác cùng một JVM nhưng một phiên bản khác của Linux (tôi đã có Debian Etch trước đó) KHÔNG kích hoạt SIGSEGV đó một lần.

Nhưng điều này không có nghĩa là JVM không có lỗi: nó vẫn có thể là sự cố JVM.

Tôi có nên báo cáo điều này và cách thực hiện không? (lưu ý rằng viết một "testible tiny case case" là ảo tưởng và nhật ký chứa thông tin độc quyền không nên bị rò rỉ). Tôi có nên chỉnh sửa nhật ký và gửi nó không?

Quy trình báo cáo SIGSEGV có thể sao chép như thế nào khi nhật ký của bạn chứa thông tin độc quyền và khi một trường hợp thử nghiệm tái tạo vấn đề không thực sự có thể thực hiện được?

Có ai trong số các bạn đã mở thành công một lỗi như vậy và sau đó xem nó được giải quyết trong bản phát hành Java tiếp theo không?

Bạn có nghĩ rằng "cộng đồng Java" tốt để báo cáo vấn đề như vậy hoặc tôi không nên bận tâm vì điều đó không quan trọng?

+0

Điều này vẫn áp dụng với phiên bản Java mới nhất? Cũng nên xem xét sử dụng IBM Java hoặc JRocket. –

+0

@ Thorbjørn Ravn Andersen: Tôi sẽ kiểm tra sau tối nay và báo cáo tại đây – SyntaxT3rr0r

+0

@ Thorbjørn Ravn Andersen: Chỉ cần tải xuống phiên bản JRE: 6.0_25-b06. Chính xác sự cố tương tự: -/ – SyntaxT3rr0r

Trả lời

6

tôi đã nâng cấp vấn đề tương tự như JDK 1.6_18 và nó dường như đã giải quyết bằng cách sử dụng tùy chọn sau:

-server 
-Xms256m 
-Xmx748m 
-XX:MaxPermSize=128m 

-verbose:gc 
-XX:+PrintGCTimeStamps 
-Xloggc:/tmp/gc.log 
-XX:+PrintHeapAtGC 
-XX:+PrintGCDetails 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath="/tmp" 

-XX:+UseParallelGC 
-XX:-UseGCOverheadLimit 

# Following options just to remote monitoring with jconsole, useful to see JVM behaviour at runtime 
-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=12345 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 
-Djava.rmi.server.hostname=MyHost 

tôi vẫn không kiểm tra lại (đó là một môi trường sản xuất), nhưng tôi nghĩ rằng lỗi là do hai lý do:

1) Thiết lập sai về heap và/hoặc không gian vĩnh viễn (Tôi nghĩ JDK 1.6 cần nhiều không gian hơn trong heap và vĩnh cửu hơn phiên bản JVM trước) gây ra một OutOfMemoryError, nhưng

2) trong sai ai đó thiết lập ban đầu đã viết

-XX:+HeapDumpOnOutOfMemoryError="/tmp" 

và không

-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath="/tmp" 

như vậy có lẽ JVM đã không thể viết heapdump và chúng tôi đã nhận SIGSEGV chỉ (phiên bản trước đã viết đống đống trong thư mục làm việc).

Kiểm tra -server -XX:+UseParallelGC -XX:-UseGCOverheadLimit tùy chọn. Tôi nghĩ rằng chơi với các thông số VM không phải là một cách giải quyết, nhưng cách tiếp cận đúng cũng vì thu gom rác (và không chỉ) thay đổi giữa 1,5 và 1,6.

+0

@glenti: +1, tuyệt, câu trả lời đầu tiên của bạn về SO là một trong những câu hỏi của tôi :) Đã thử tất cả mọi thứ bạn đề xuất nhưng nó vẫn bị treo. Không có dấu hiệu của một OutOfMemoryError, tôi đã thử với một JLabel tùy chỉnh hiển thị việc sử dụng bộ nhớ. Rõ ràng là không có vấn đề PermGen nào cả. – SyntaxT3rr0r

+0

@glenti: bài viết của bạn khiến tôi suy nghĩ ... Tôi đang sử dụng một máy Linux có nhiều hơn một proc và hơn 2GB mem, vì vậy Java là mặc định cho chế độ máy chủ. Điều thú vị là nếu tôi buộc "-client" không có sự cố nữa ... (Tôi vẫn không chắc chắn phải làm gì với SIGSEGV có thể tái sản xuất của tôi nhưng nó vẫn thú vị) – SyntaxT3rr0r

5

Sự cố là tệp nhật ký chứa thông tin độc quyền mà không thể chia sẻ thông tin độc quyền . Tái tạo một "tí hon trường hợp thử nghiệm" mà tạo lại lỗi là không thực tế hoặc

Nếu bạn không thể cung cấp Sun với một trường hợp thử nghiệm tái sản xuất, họ thậm chí sẽ không nhìn vào nó. Cơ hội là tốt mà họ sẽ bỏ qua nó ngay cả khi bạn cung cấp một trường hợp thử nghiệm có thể sử dụng. Quá trình nộp lỗi tại Sun rời đi rất nhiều để được mong muốn.

Tôi có nên báo cáo điều này và cách thực hiện không?

Nếu bạn không thể đưa ra trường hợp kiểm tra có thể lặp lại, đừng bận tâm. Nếu họ không thể tái tạo vấn đề, bạn mong đợi họ làm gì?

Lưu ý rằng cùng một ứng dụng chính xác, vào chính xác cùng một phần cứng, với chính xác cùng một JVM nhưng phiên bản khác của Linux (tôi đã Debian Etch trước đây) đã không kích hoạt mà SIGSEGV một lần.

Ứng dụng có hoạt động trên một hộp khác có cùng phần cứng và cùng phiên bản Linux không?

+0

Tôi chắc chắn rằng hỗ trợ mua sẽ giúp bạn có thêm nhiều sự chú ý. Bao nhiêu, tùy thuộc vào mức độ bạn mua. –

+0

@Kevin: ah chết tiệt ... Tôi có thể dd hd của tôi để một số khác và do đó thử với chính xác cùng một hạt nhân Linux/cấu hình và JVMs để xem nếu SIGSEGV cũng tái sản xuất nhưng những gì bạn đang viết có khá depressing. Một trường hợp thử nghiệm sẽ có nghĩa là hàng trăm MB dữ liệu để gửi. Oh tốt, nếu nó có thể tái sản xuất trên bất kỳ phần cứng có lẽ tôi nên chỉ cần gửi đĩa cứng hoặc thực hiện một đĩa CD khởi động có thể tái sản xuất vấn đề :) (Tôi là một nửa nghiêm trọng) Điều gì về OpenJDK? Mọi thứ sẽ khác đi nếu tôi có thể tái tạo lại điều này một cách đáng tin cậy theo OpenJDK 7? – SyntaxT3rr0r

+0

@WizardOfOdds: bạn nói có thông tin sở hữu trong tệp nhật ký. Bạn có thể viết một trình phân tích cú pháp hoặc một cái gì đó để "cấm" dữ liệu này, và sau đó gửi logfile của bạn đến Sun? –

0

Câu hỏi đầu tiên bạn nên tự hỏi mình là:

  • Tôi có sử dụng một bản phân phối Linux hỗ trợ chính thức?

Nếu không, hãy chuyển sang chế độ.

Nếu có, hãy báo cáo cho Sun!

+0

@Throbjorn: chính thức được hỗ trợ bởi ai? Bởi Sun bạn có nghĩa là gì? Tôi đang sử dụng bản phân phối Linux ổn định nhất từng được thực hiện, rất nhiều người ghét vì nó luôn luôn chậm chạp bao gồm những tiếng sáo và còi mới nhất và những người khác như tôi yêu vì nó vững chắc vững chắc: Debian :) – SyntaxT3rr0r

+2

Được hỗ trợ bởi thực thể đã tạo ra JVM bạn đang sử dụng. Sun không nói rằng Java của họ sẽ chạy trên bất kỳ bản phân phối Linux nào tồn tại, nhưng họ nói rằng họ "hỗ trợ" các bản phân phối được liệt kê trên http://java.sun.com/javase/6/webnotes/install/system-configurations. html (nơi "hỗ trợ" có nghĩa là thậm chí xem xét việc nghe báo cáo lỗi). Debian không có ở đó, nhưng Ubuntu là. Sử dụng thay vào đó. –

+0

@Throbjorn: Ồ, tôi hiểu ý của bạn (cảm ơn vì liên kết) ... Điều đó nói rằng Ubuntu thực sự dựa trên Debian :) Debian là bản phân phối được kính trọng nhất bởi sysadmins và quyền hạn rất nhiều trong thế giới thực [TM ] máy chủ, tôi không chuyển sang bất kỳ bản phân phối Linux nào khác;) Điều đó nói rằng vấn đề không phải là SIGSEGV (vì tôi đã có cách giải quyết) nhưng phải làm gì với nó ... :) – SyntaxT3rr0r

1

Nếu nó giúp, liên kết trình lỗi trong báo cáo tai nạn của bạn có từ chối trách nhiệm này:

Bên cạnh đó, Sun Microsystems tôn trọng mong muốn của bạn cho sự riêng tư. Dữ liệu cá nhân được thu thập từ chương trình này sẽ không được bán, cung cấp hoặc chia sẻ với các tổ chức bên ngoài Mặt trời. Chúng tôi sẽ sử dụng dữ liệu này để liên lạc với bạn để làm rõ các vấn đề liên quan đến báo cáo bạn đã gửi và/hoặc trạng thái của báo cáo đó. Các vấn đề mà bạn báo cáo có thể được cung cấp cho các khách hàng khác của JDC hoặc Sun, tuy nhiên dữ liệu cá nhân của bạn sẽ được giữ bí mật. Nếu bạn không hài lòng với các điều kiện trên, vui lòng không nhấn nút Gửi. Nếu bạn có bất kỳ câu hỏi nào, vui lòng tham khảo Privacy Policy của chúng tôi.

Cá nhân, tôi sẽ báo cáo nếu có thể bàn giao đoạn mã được đề cập với nhật ký, nếu dữ liệu không quá nhạy cảm (có thể dữ liệu có thể bị che hoặc bị làm mờ trong nhật ký?).

Bạn không thể thực sự đánh giá liệu lỗi này có "quan trọng" hay không đối với người khác trừ khi bạn có thể biết điều gì thực sự gây ra nó. Báo cáo nó có thể là bước đầu tiên trong các kỹ sư của Sun tìm ra nguyên nhân của một cái gì đó nghiêm trọng.

+0

@matt b: yup, was suy nghĩ về việc xóa tên tệp trong nhật ký hs_err _....Tôi sẽ xem nếu một phiên bản Proguarded cũng gây ra vụ tai nạn và sau đó tôi thậm chí có thể gửi dữ liệu .jar + obfuscated cho phép tái sản xuất vấn đề. Vẫn gãi đầu về chuyện này. – SyntaxT3rr0r

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