Programming Freaks  | دورات ومقالات برمجيه

Please login or register.

Login with username, password and session length
Advanced search  

News:

Please Read our FAQ

Author Topic: inside jvm -part 5- jvm itself  (Read 690 times)

hackobacko

  • Out of control
  • Global Moderator
  • Just Joined
  • *****
  • Posts: 8
    • View Profile
inside jvm -part 5- jvm itself
« on: September 21, 2009, 06:47:33 AM »

سلام عليكم
 
[under construction] تذكر ال name space info

 :D شايفكم بتضحكوا من قبل ما اتكلم ...... امشى يعنى ؟ !!! بلاش اتكلم ؟  :P طب أنا ماشى .... ماشى ..... ولا بيدى .... هههههههههههههههههههههههههههههه

النهارده الدرس طويل شوية ومحتاج تركيز ... هنتكلم عن ال jvm بجلالة قدرها

السؤال الأول ..... يعنى ايه jvm ?

معناها ال jvm specifications ومعناها ممكن يكون ال actual implementation زى sun jvm وممكن نقصد بيها كما ن ال jvm instance >>> مش انا قلتلك قبل كدة انه كل application مكتوب بالجافا بيشتغل فى separate instance of jvm ?

السؤال التانى إيه هى مدة حياة ال jvm ? وامتى بتخلص شغلها وتنتهى ؟

لما سيادتك فى البرنامج تنادى على
Code: ($2) [Select]
system.exit()

لما البرنامج بتاعك يخلص كل شغله .... بس الجملة مش دقيقة علشان كدة تابع الفقرة الجاية وانت تفهم اكتر

كمان فيه حالة تانية ...... عارفين الفرق بين ال daemon threads وال non Daemon threads ?

ال daemon threads هى اللى بتشتغل عن طريق ال jvm نفسها زى اللى بيحصل لما ال garbage collection بتشتغل ... اللى بيشغلها هو daemon thread يعنى انت ملكش تحكم فيه تقريبا ..... بالمناسبة انت ممكن تعمل بنفسك daemon threads  :D

النوع التانى ال non daemon هو ال انت بتعمله فى حياتك اليومية مع ال java applications زى ال main threads اللى ال main method بتشتغل فيه وزى اى thread تانى انت بتعمله جوه البرنامج بتاعك

المهم طول ما فيه non daemon thread شغال ال jvm مش هتقفل من نفسها
انما لو خلصت شغلها وفيه daemon threads ? هتقفل عادى خالص ومش هيهمها لان ال daemon threads  منها وعليها  :D

ناخد مثال ...... ؟

Code: ($2) [Select]
public class Koko {

public static void main (String args[]) {
Thread t = new Thread(new Runnable(){
public void run(){
while(true)
System.out.println("wooooooow");
}
});

t.start();

for (int i = 0; i < 1000; ++i)
System.out.println("hey");

}
}

شايفين اللى بيحصل ؟ ال main خلصت والبرنامج لسة شغال لانه فيه non daemon thread لسة شغال وده اللى بيحصل فى ال gui applications بمعنى انت بتعمل frame مثلا وال main بتاعتك خلصت وال gui بتفضل شغالة بالرغم من ده لانها شغالة فى non daemon thread

شوف بقة الفرق لو خلينا ال thread t يبقى daemon ...... فى الحالة دى اول ما ال main تخلص وهى هتبقى ال non daemon thread الوحيد عندك ال application هي terminate

Code: ($2) [Select]
public class Koko {

public static void main (String args[]) {
Thread t = new Thread(new Runnable(){
public void run(){
while(true)
System.out.println("wooooooow");
}
});

t.setDaemon(true);
t.start();

for (int i = 0; i < 1000; ++i)
System.out.println("hey");

}
}



قبل ما نبدأ نتكلم عن ال memory area بتاع ال jvm واللى بتقسمها ل runtime data areas علشان تبدأ تتعامل معاها وتحط كل حاجة فى مكانها
هنتكلم عن شوية حاجات يمكن كلنا عارفينها او ممكن مش كلنا عارفينها وممكن انا اتكلمت عنها فى الدروس اللى فاتت وممكن ما اتفهمتش كويس لكن المهم اننا هنرسخ بعض الأشياء فى أذهانكم ونخلى كل شىء clear إن شاء الله

Data types in java



بالمناسبة ال boolean مش primitive لانه الكومبايلر بيحوله اما ل int او ل byte فمثلا ال false يتم تحويله ل 0 integer وال true ل non-zero integer وال operations العادية بتستخدم int فى التعبير عن ال boolean لكن !!!!!!!!!!!!!!!!!!!  ال arrays of booleans بتستخدم byte فى التعبير عن ال boolean لان ال byte طبعا حجمه 8 bytes وفى ال arrays الكبيرة هيبقى استخدام int بيعتبر اهدار لل resources لانه ال int بياخد 32-bits او بيتم استخدام bit-fields لو انت تعرف c هتعرف انا بقصد ايه انا بقصد ايه ولو متعرفش يكفيك انه تعرف انه بيستخدم عدد محدود من ال bits للتعبير عن ال boolean بما يعنى توفير اكتر فى ال memory

طبعا الصورة موضوحة انه ال references انه 3 انواع يا إما ل array يا إما ل class يا اما interface بمعنى interface لكن ل interface type ....لاحظ انى مقدرش اعمل instance من interface أساسا  بكدة المقصود مش  interface لكن ل class بيبقى بي implement ال interface يعنى لما اقول
Code: ($2) [Select]
Fruity orange = new Juice()
حيث ال juice بي implement  Fruity interface وبكدة يبقى ال type بتاع ال orange من نوع Fruity لكن بتشاور على object من نوع Juice

طبعا لو ال reference مش بيشاور على حاجة بياخد null



ال return value هيتم التطرق لها لاحقا وان كنت ممكن تعرف انه address ل instruction داخل ال method نفسها

Word Size in jvm


32 بيت فقط بغض النظر عن ال actual architecture بتاع المكنة بتاعتك (your machine) 
كمان لازم تعرف انه اى java application مش بيعرف حتى ال word size بيبقى اد إيه ولا ده بيهمه فى حاجة يعنى دى حاجة مش تخصه

class loader subsystem

هنعمل review عليه وبالمناسبة العملية دى بتشمل 3 مراحل :

(1) loading

class loader objects are instances of java.lang.ClassLoader

وبما ان كلنا او بعضنا اكيد له معرفة كويسة بالجافا فهو أكيد عارف انه لاى class بيحصله loading او على وجه الدقة خلينا نقول type لاى type حيث ال type ممكن يبقى class او interface فال jvm بتعمله instance من java.lang.Class علشان يمثل ال type ده ... ولو حد مذاكر threads ممكن يعرف انا بقصد ايه ...... مش انت ممكن تعمل locking على ال Class object اللى بي represent ال type  بتاع ال ال object ?

نيجى بقى لمعنى كلمة loading ?

يعنى l, o, a, d, i, n, g :p    زى كلة وطن ما هى و  ط ن .... هههههههههههههههه

loading = finding the type -> recognizing the type - importing data of type

علشان ال class loader يلاقى class/interface فهو لازم يدور فى مسار معين واللى بيحدده هو ال CLASSPATH system variable واللى ممكن تضيف عليه مسارات تانية وهناك اماكن تانية ممكن البحث يتم فيها برده بس ده مش موضوعنا حاليا
وطبعا لو مثلا الكود بتاعك بتاع كلاس معين لو بينادى على method فى class تانى هيتم عمل لود للتانى وليكن انت كنت بتنادى على java.lang.Object هيتم البحث عن Object.class جوة java/lang جوة المسارات ال default للبحث عن ال classes وفى حالتنا دى طالما ال Object جزء من ال standard java API library هيتم البحث عن داخل rt.jar اللى قلتلكم عليها قبل كدة

وطبعا لازم نعرف انه ال class loader ممكن يتعرف على formats تانية غير ال class زى ال jar وزى ملفات ال cab مثلا بتاع مايكروسوفت ..... مش انا قلتلكم انه مايكروسوفت كان عندها implementation لل jvm وطبعا كانت بتعرف على ملفات ال cab اللى دايما تلاقيها فى ويندوز

عملية importing لل class data يعنى تطلع المعلومات عنه الخاصة بيه وتحطها فى مكان معين فى ال memory هنتكلم عنه لاحقا

بعد عملية ال loading تيجى ال linking

(2) linking

 وبتشمل :  verification -> preparation (allocating memory) -> resolution

verification اللى اتكلمنا عنها قبل كدة للتأكد من انه ال class file صاغ سليم  :D

وعملية ال memory allocation بعنى ابدأ اعمل لل type الجديد ده مكان فى ال heap واحط ال variables بتاعته واديها default values بتاع ال data types بتاعتها وطبعا المقصود بال variables ال instance fields مش local variables
والمقصود بال default values of data types لو حضرتك مذاكر كويس هتعرف انه لو عملت field كالتالى

int x; -> يبقى x قيمتها ب صفر ك default ولو عملت int x = 7; يبقى اللى هيحصل فى ال memory فى المرحلة الاولى انه هيتم عمل ال object وفيه متغير x لكن قيمته ب 0 فى المرحلة دى قبل ما تيجى المرحلة الاخيرة بتاع ال initialization للقيمة اللى انت مديها للمتغير اساسا

بعدين تيجى عملية ال resolution وهى عمل resolving لل symbolic references اللى فى ال calss ل actual references يعنى لو فيه symbolic reference ل class تانى بيتم استخدام method منه او field ال class loader اللى عمل load للكلاس الحالى فى ال memory هيروح يعمله load وهيمر بنفي الخطوات اللى احنا بنتكلم عليها الوقتى وبعد ما يلوده فى ال memory هنقدر نعمل resolution for symbolic reference with direct reference for the method/field address in memory


(3) initialization

بعد كدة تيجى عملية ال initialization وهى انى اعمل invoke لل initializers بتاع ال object نفسه علشان اعمل set للقيم اللى المبرمج كاتبها جواه بقى
طبعا ال initalizers زى ال constructor وال instance initializer blocks

لاحظ حضرتك انه كلامى عن ال initalization نه بيحصل انه القيم ال default بيحصلها set بعدين القيم الحقيقية ....... كلامى هنا عن ال instance variables ولا يمت بصلة لل static fields اوكى ؟  :D  ..... الموضوع ده بالذات صعب شوية لكن إن شاء الله يتم توضيحه بعدين


نخش فى الموضوع ؟ !!!!




شايفين الصورة ؟ شايفين إيه اللى بيحصل بعد ال loading ؟ اللى بيحصل انه كل حاجة بتروح لمكانها المخصص لها يعنى ل memory area مخصصة لها

شايفين ال jvm بتقسم ال memory اللى بتاخدها من ال o.s لمناطق ازاى ؟ فاكرنين لما قلتلكم انه المناطق دى ال structure الداخلى بتاعها بيرجع لل vendor ? طيب تعرفو انه ال specifications مرنة لدرجة انه ال implementation بتاع ال jvm والمناطق بتاع ال memory بتاعتها ممكن تنفع على اى system زى ال embeded devices ؟ وزى ال systems اللى متوفر فيها memory كتير او قليل ؟

عارفين انه ال areas دى بتساهم فى كون ال jvm تبقى virtual machine ? علشان يبقى فيه اماكن يتم فيها ال calculations و كدة وفيه محاكيات ال cpu مثلا

عندنا فيه أماكن shared بين كل ال threads زى ال heap وال method area وعندنا اماكن خاصة بكل thread زى ال stack و ال  pc registers فكل thread بياخد stack مستقلة و pc register

فاكرين لما قلتلكم انه اثناء ال loading للكلاس يتم وضع ال data بتاعة ال type فى مكان مخصص .... يعنى المعلومات عن ال type نفسه بتتحط فى ال method area
عارفين ايه هى المعلومات دى اساسا ؟
دى ال class نفسه يعنى ال binary class files بيبقى كل كلاس متقسم لمناطق فيها معلومات معينة عن الكلاس او ال interface من اسمه ونوعه وشوية معلومات تانية  بيتحمل جزء منه  فى ال method area وهى المعلومات دى وكمان ال
 ال method instructions نفسها بتتحمل جوة ال method area والجزء التانى اللى هو  actual object بيتحمل جوة ال heap عارفين ايه هو ال actual object ? هههههههههههههههههههههههههه

فاكرين فى ا ب object oriented لما كنا بنقول انه ال instance variables اسمها features/states يعنى بتدل على صفات ال object وانه ال methods هى ال behaviors 
ال object نفسه جوة ال heap فيه instance variables بس وهى اللى بتميز ال object

طبعا ال instance variables مبيحصلهاش set للقيم اللى انت مديهالها غير فى الاخر خالص لكن فى الاول بيتم عمل allocate للمساحة الاول ويتم عمل ال object بقيم default يعنى object مجهول الملامح الاول ... او حاجة كدة زى stamp بعدين يتم تشكيله

شفتم برامج الجرافيكس ؟ هههههههههههههههههههه  لما بيعمل راجل كدة ممكن يمش على اى حاجة بعدين يبدأ يديله شكل ؟


بسيطة لانها بتخص الكلاس نفسه مش بتخص اى instance خالص  :P وعلى كدة مينفعش احطها فى كل instance ده هيبقى هدر للمساحة الثمينة او ال precious memory


طيب ... برده علشان تشغل مخك معايا وتصحصح كدة ...... لازم تعرف انه ال static fields بتتخزن فين يا كتكوت ؟ !!! بتروح على ال method area يا برنس  :D هههههههههههههههههههههههههههههههههههه  مش قلتلك صحصح معايا  !!!! طيب ليه يا عم الأمور ؟

طيب وليه ال methods اساسا ال instructions بتاعتها تروح ل method area وماتروحش فى ال heap ? علشان توفير المساحة برده ... فهمتم اللعبة ؟ هيبقى عندك نسخة واحدة من ال method فى ال method area وكل object لما تنادى جواه على دالة تقوم الدالة تنتقل من ال method area يعنى نسخة منها طبعا وتروح لل stack وهى مكان ال execution طبعا ويبدأ التعامل معاها  :) ...... واحد خفيف الظل يسألنى امال ازاى هيتم التفريق بين الدوال المختلفة اللى فى ال stack لو فيه كذا object من نفس الكلاس بيحصل لهم invoke لنفس ال method اللى فيهم ......  :(    ..... اقوله بص يا يا ظرييييييييييييييييييييييييف ......... السؤال ده حلو ......... بس من مصلحتك انك تسأل اسئلة زى كدة علشان تتعلم و shake hand يابنى  :D ....... والاجابة سهلة ولو مفهمتهاش الوقتى ممكن بعدين .... بس انا هقولها على اى حال .... وهى انه اى method بتروح ال stack بيروح معاها متغير جواها اسمه this .... وطبعا عارفينه كلنا وهو بيشاور على ال actual object بتاع الدالة دى وبكدة كل دالة تبقى عارفه ال object بتاعها



بالنسبة لل stack

عارفين ال stack ? دى خاصة بال threads يعنى مثلا ال main thread اللى هو اول thread فى البرنامج بتاعك بياخد stack مستقلة وبياخد pc register مستقل
ال stack بيحصل فيها وضع ال method instructions اللى هيتم عمل invoke لها وبيتم وضع فيها ال intermediate calculations ومش بيتم وضع ال intermediate calculations فى ال registers بتاع ال cpu بتاعك ليه ؟

علشان يريحو دماغهم من وجع الدماغ .. ههههههههههههههههه ال registers بتبقى general و specialized وعددها بيختلف من architecture لاخر مثلا من 32-bit architecture ل 64 bit architecture والناس عايزة الجافا تبقى platform independent فالناس عملت java virtual machine علشان كدة يبقى ايه اللى يخليهم يعتمدو على ال cpu architecture ? !!! طبعا مش المفروض يعملو كدة علشان كدة عملو ال stack ممكن تشيل ال intermediate calculations وخلو ال pc register بتاع كل thread يشاور على ال instructions اللى عليها الدور فى التنفيذ .......

Quote

jVM is stack based not register based

ال stack بقة بتتقسم ل frames كل method invocation in the same thread بتاخد frame وكلنا عارفين ال data structure بتاع ال stack هى LIFO "Last In First Out"
يبقى لو عندك method اسمها main بتنادى على doIt اللى بتنادى على finish ف finish تتنفذ لغاية ما تخلص وال execution ي return لل calling method ل finish وهى doIt بعدين لما هى تخلص ال execution يرجع لل calling method اللى هى main بعدين main تكمل لغاية ما تخلص



طبعا مش عايز اقولكم انه ال native methods بت run فى native method stack وانه ال طبعا هيبقى له برده pc register ولكن مش زى ال pc registers بتاع الجافا كود واللى برده بتشاور على ال instruction اللى عليها الدور لكن فى الرسمة اللى جاية واللى بتوضح 3 threads وكل واحد بي invoke كذا method وال current method هى اللى فوق .... ههههههههههههههههههه  لاحظ انه فوق دى هى اللى تحت فى الرسمة .... لو درست كمبيوتر صح هتعرف انه ال stack بت grow لاسفل يعنى بتبدأ فى بداية ال memory وبت grow لاسفل



طبعا ال pc register فى الرسمة السابقة مش بيشاور على حاجة لانه مش مذكور فى الرسمة ال native thread stack فيها methods ايه اساسا ...... معايا ؟

« Last Edit: September 28, 2009, 06:27:57 AM by hackobacko »
Logged