עם השנים נוספו לג'אווה כלים סטנדרטיים שמאפשרים חיבור למכונה וירטואלית חיה, ובחינה של מה שקורה שם ככלי למציאת בעיות בזמן הריצה של תוכניות.
- jps : מראה תהליכי ג'אווה
- jstack : מציג את רשימת הת'רדים בתהליך ג'אווה, ומה כל אחד מהם עושה.
- jmap: מאפשר שמירה לקובץ של תמונת הזכרון (heap dump) של תהליך ג'אווה. אפשר לבחון את הקובץ עם jhat או עם VisualVM.
- jhat : מאפשר ניתוח קבצי heap dump שנוצרו בעזרת jmap.
- jconsole : ממשק פשוט שמאפשר בחינה של שימוש הזכרון, שימוש בזמן מעבד ועוד.
- visualvm: כלי חזק יותר מjconsole, שהחל מעדכון 18 של JDK 1.6.0 מגיע עם הJDK. ויז'ואל VM מאפשר גם ניתוח ביצועים פשוט (cpu and memory profiling).
כל הכלים האלו תומכים גם בגישה למכונה מרוחקת בצורה זו או אחרת, הבעיה היא שכמעט בלתי אפשרי להתחבר איתם למכונה שמוגנת בפיירוואל כי הם עובדים עם פורטים אקראיים.
אם עם כלי שורת הפקודה עוד אפשר להסתדר על שרת מרוחק (קל יותר להריץ jps ישירות על השרת מאשר לנסות לעשות את זה מרחוק), עם הכלים הגראפיים הסיפור כבר אחר.
VisualVM
אז איך בכל זאת אפשר להתחבר לתהליך ג'אווה מרוחק עם VisualVM?
התהליך קצת מורכב, ולכן אני אתעד אותו כאן:
על המחשב המרוחק:
1. צרו קובץ permissions.txt שיכיל את זה:
[code]
grant {
permission java.security.AllPermission;
};
[/code]
2. הריצו את jstatd (שמאפשר לתהליכים מרוחקים לקבל רשימה של מכונות ג'אווה שרצות על המכונה ולהתחבר אליהן) :
[code]
jstatd -J-Djava.security.policy=permissions.txt
[/code]
3. הריצו את התוכנית שלהם עם הפרמטר הבא:
[code]
java -Dcom.sun.management.jmxremote MainClass
[/code]
על המחשב המקומי:
1. צרו תעלות SSH לשרת כך:
[code]
ssh -D9696 -L1101:localhost:1099 your_server
[/code]
שימו לב שיש פה שתי 'תעלות':
- תעלת TCP מ1101 אל 1099 בשרת המרוחק. זו תעלה שמאפשרת להתחבר אל הjstatd ישירות.
- פרוקסי SOCKS5 שמאזין על פורט 9696
2. הפעילו את visualvm עם הפרמטרים הבאים :
[code]
visualvm -J-Dnetbeans.system_socks_proxy=localhost:9696 -J-Djava.net.useSystemProxies=true
[/code]
שאומרים לו להשתמש בפרוקסי SOCKS5 שהקמנו.
3. מתוך VisualVM, הוסיפו לחיבור המקומי חיבור לjstatd בפורט 1101.
זהו. הרבה יותר מסובך ממה שהייתי רוצה, אם מישהו מכיר דרך יותר פשוטה אני אשמח לשמוע.
יש עוד כמה דרכים:
1) להגדיר JMXconnector חדש עם URL שיגדיר גם את הפורט האקראי ראה http://blogs.sun.com/jmxetc/entry/connecting_through_firewall_using_jmx
2) יש ספריות JMX שמוסיפות HttpConnector ואז אפשר לעבוד בפורט 8080 או אחר
3) יש משהו שנקרא JManage אתה מרים Jetty שמתחבר לאפליקציה שלך בJMX באותו מחשב ואתה יכול להתחבר עליו ב http זה בעיקר לפעולות על Beans ולא במקום הVisualVm כתחליף ל Jconsole
זה מה שאני מכיר
איל
תודה אייל.
נתקלתי בעבר בפתרון של הJMXConnector שקובע את הפורט, אבל די שנאתי אותו. אני חושב שבשורה התחתונה הוא לא יותר פשוט מהתהליך שתארתי.