Java Test 1
ساختار برنامه جاوا به این صورت هستش که ما باید یک class داشته باشیم و کلاس ما باید یک متد public static void به نام main داشته باشه که حتما یک آرایه از string ها توی ورودی بگیره.
دقت کنید که ما برای تعریف آرایه میتونیم [] رو هم بعد از نوع آرایه بزاریم هم بعد از نام آرایه. فقط توی جاوا مرسوم هستش که بعد از نام میزارن و گذاشتنش بعد از نوع برمیگرده به سی پلاس پلاس.
String args[]; // Java face
String[] args; // C++ face
وقتی ما یک برنامه رو اجرا میکنیم زمانی که به پایان تابع main برسه اون برنامه تموم میشه و اون JVMی که براش ساخته شده بوده هم از بین میره و کلا هیچ چیزی ازش توی ram باقی نمیمونه.
اگه بخوایم thread اصلی برنامه به پایان نرسه و تا بخوایم یه سری چیزا رو بررسی کنیم میتونیم با join کردن thread جاری این کار رو بکنیم. فقط دقت کنید که این دستور ممکنه خطا پرت کنه.
Thread.currentThread().join();
اگه بخوایم برنامه رو یکم سرک توی برنامه بکشیم لازمه که PID برنامه رو داشته باشیم برای این کار میتونیم از دستور jps استفاده کنیم که لیست برنامه فعال جاوا رو با شناسه اونها به ما میده.
خوب حالا اگه بخوایم به برنامه در حال اجرا وصل بشیم و دادههای JVM رو ببینیم باید از jmap استفاده کنیم.
با دستور jmap -histo PID میتونیم اطلاعات heap برنامه رو ببینیم.
حالا تا اینجا چرا همه این کارا رو کردم؟ میخوام memory leak درست کنم!
چرا میخوام memory leak درست کنم؟ چون همون قدر که پیدا کردن و درست کردنشون سخته ایجاد کردنش هم سخته!
- یک استریمر باز کنیم (فرقی نمیکنه روی فایل یا شبکه یا هر جایی) و اون رو نبندیم
BufferedReader br = new BufferedReader(new FileReader(inputFile));
- یک کانکشن باز کنیم و اون رو نبندیم
Connection conn = ConnectionFactory.getConnection();
- متد intern رو برای یک string خیلی بزرگ صدا بزنیم
- کار این متد: ما یک استخر از رشتهها string pool داریم که اول برنامه خالی هستش و بعد هر چی ما رشته درست میکنیم ریخته میشه توی این استخر تا از تولید رشتههای تکراری جلوگیری بشه و ram کمتری مصرف بشه. حالا این تابع رشته مورد نظر رو با آیتم های توی استخر با صدا زدن متد equals مقایسه میکنه و اگه مشابه پیدا نکنه رشته رو میندازه توی استخر و رفرنسش رو بر میگردونه!
- ذخیره یک رفرنس توی جاهایی که برای GC در دسترس نیست مثل native method
- تنظیمات اشتباه روی JVM مثل گزینه noclassgc روی IBM
- و در انتها پاتون رو بزارین توی threadها هر کار نسنجیده ای memory leak درست میکنه.