جاوا و تکنولوژی های آن

java programming language

در این وبلاگ به بررسی نکات موجود در جاوا و تکنولوژی های آن می پردازیم

طبقه بندی موضوعی

۲ مطلب با کلمه‌ی کلیدی «jvm» ثبت شده است

Auto Boxing : امکان تخصیص اتوماتیک مقادیر primitive به نوع متناظر Reference آن بدون new کردن از آن Object

َAuto Unboxing : امکان تخصیص اتوماتیک مقادیر Reference به نوع متناظر primitive بدون تبدیل کردن 


Up Cast : یا Widening به عمل ارجاع کردن یک کلاس فرزند به کلاس پدر (در درخت توارث از سمت فرزند به سمت پدر بالا میرویم ) که ایمن است چون تمای متد های فرزند در پدر موجود است و موقع call کردن مشکلی وجود ندارد

Down Cast : یا Narrowing به عمل ارجاع کردن یک کلاس پدر به کلاس فرزند (در درخت توارث از سمت پدر به سمت فرزند پایین میرویم ) که همیشه این کار به علت داشتن method  و field های احتمالی بیشتر در کلاس فرزند ، ایمن نیست چون همه متد های فرزند در پدرش ممکن وجود نداشته باشد و موقع call کردن آن متد پیاده سازی ندارد و آن متد و فیلد های فرزند از دسترس خارج خواهند شد چون در Object پدر وجود ندارند که Bind شوند ولی آن فیلد و متد ها در حافظه رم وجود خواهند داشت و اگر زمانی دوباره به Object فرزند cast شوند دوباره قابل استفاده خواهد شد


Mutable : کلاس هایی که field هایشان قابل تغییر هستند Mutable میگویند

Immutable : کلاس هایی که field هایشان تا زمانی که از بین بروند قابل تغییر نیست  Immutable میگویند به عبارتی متدی برای تغییر field ها وجود ندارد


component : به کلاس های تشکیل دهنده برنامه گفته میشود

java bean : به کلاس (component) های جاوا که یکسری قواعد مشخص و استاندارد در طراحی آن بکار گرفته شده باشد java bean میگویند

prototype : به ظاهر تعریف متد prototype میگویند


override : مخصوص متد است و رفتار و پیاده سازی به ارث برده را میتوان عوض کرد همین عمل در مورد فیلد ها hide گفته میشود 

overload : متدهایی با یک نام و آرگومان های متفاوت برای شرایط مختلف قابل استفاده است


abstract : پیاده سازی ندارد

concrete :  پیاده سازی شده است 


super class : به کلاس پدر در جاوا super class میگویند

sub class : به کلاس فرزند در جاوا sub class میگویند


Reference Object :  به Object پدر هم گفته میشود

Actual Object : به Object فرزند هم گفته میشود


Instance یا Object : در فضای heap یک بخشی به ازای کلاس ساخته شده باشد یک Instance یا Object داریم

Instance Variable : فیلد های کلاس که به ازای هر بار new شدن از کلاس یکی ساخته می شود و static نیستند

Class Variable : فیلد های کلاس که به ازای هر بار new شدن کلاس متغییر آن وجود دارد و static است

Final Method : متدی که قابلیت Override ندارد

Final Class : کلاس که دیگر قابل ارث بری نیست و نوع خاص تری ندارد مثلا کلاس singleton باید final باشد چون ممکن است در کلاس فرزند متد getInstance توسط فرزند override شود

Final Variable :  متغییری که مقدار آن قابل تغییر نباشد

ِDynamic Binding : در polymorphism وقتی ما متدی و یک Actual Object به Reference Object نسبت داده باشیم و مشخص نباشد که کد اجرا کننده آن متد کدام یک از متد های سلسله مراتب وراثت است (یعنی متغییر ما Object از نوع reference باشد و برای new شدن از یکی از Actual Object ها استفاده کرده باشیم و حاوی متد هایی باشد با modifier های public ,default , protected که static نباشد ، با توجه به سلسله مراتب Override شدن در وراثت صورت گرفته جاوا بصورت داینامیک)، اتصال متد مناسب در runtime به متد reference را dynamic binding میگویند

Static Binding : وقتی ما متدی داریم با modifier های final , static , private (بخاطر اینکه این سه override نمیشوند )و costractor در compile time آن متد مشخص است که به ازای فراخوانی آن چه کدی باید اجرا شود

به علت static binding بودن متد های private , final , static و costractor میتوان این نتیجه را گرفت که سرعت اجرا بالاتری نسبت به بقیه متد ها دارند و فقط اینا میتوانند inline شوند

inlining : در جاوا اگر مشخص باشد که به ازای متد کدام کد قرار است اجرا شود optimizer جاوا آن کد را inline میکند به جای فراخوانی آن متد 


Overloading Resolution : به تشخیص زبان به استفاده از یکی از متد های Overload شده با توجه به آرگومان های ارسالی Overloading Resolution میگویند


Dynamic Loading : در جاوا با استفاده از Reflection میتوان یک Object جدید تنها با دانستن اسمش آنرا ایجاد کرد :

 String str = (String) Class.forName("java.lang.String").newInstance();


Class Object : اطلاعات کلاس ما در حافظه در شی ای به نام Class Object ذخیره میشود تا قبل از جاوا 8 ، Class Object ها در بخشی از حافظه به نام (Permanent Generation (PermGen به معنای بخشی از حافظه که قرار است به صورت پایدار باقی بمانند ذخیره میشدند که این مشکل را بوجود می آوردند که اگر پروژه ما خیلی بزرگ بود ممکن بود این فضا پر شود و اجرای برنامه با خطا OutOfMemeoryError مواجه بشود این بیشتر برای پروژه هایی که مجبور بودند کتابخانه های زیادی از استفاده کنند دیده میشد البته راه کارهایی براش وجود داشت مثلا حجم حافظه PermGen را افزایش دهیم : java -XX:MaxPermSize=512m MyClass مشابه کاری که با سویچ های Xms- و Xmx- روی Heap انجام میشد

  ولی از جاوا 8 به بالاتر Class Object ها در بخشی از حافظه به نام MetaSpace نگهداری میشود و PermGen حذف شده و دیگر مشکلاتش را هم نداریم . MetaSpace تا جایی که حافظه جا داشته باشد اجازه استفاده را میدهد


Young : بخشی از حافظه Heap است که اشیاء جدید را نگهداری میکند

Tenured : بخشی از حافظه Heap است که اشیاء کهنه را نگهداری میکند


finalize : متدی است که در ابجکت Object موجود است و GC هنگامی که هیچ رفرنسی به آن ابجکت نباشد قبل از گاربیج کردن این متد را فراخوانی میکند و ما مثلا میتوانیم با override کردن این متد عملیاتی را انجام دهیم که به ندرت کاربرد دارد


atomic : عملیات اتمیک به عملیاتی گفته میشود که از ابتدا تا انتهای آن یکباره و بدون دخالت ترد دیگری یا انجام میشود و یا انجام نمیشود










JNI : وقتی بخواهیم یک کد native را فراخوانی کنیم از jni استفاده میکنیم با jni این امکان وجود دارد که یک متدی را با native modifier  تعریف کنیم و کد native مثلا c را از طریق آن اجرا کنیم ، سایر کلاس ها و متد ها آن کلاس را بصورت یک کد جاوا میبینند 


JNDI : یک API است که به برنامه های جاوا اجازه پیدا کردن یک Object از طریق آنها را میدهند .


HotSpot : این بخش به کمک JIT بصورت داینامیک کد های بایت کد جاوا را به کد ماشین تبدیل میکند و همواره کد های ماشین را برای performance برای اجرا های بعدی چک میکند و در صورت امکان از بهترین کد ماشین برای اجرا های بهتر بعدی استفاده میکن


JIT : قسمتی از HotSpot است که وقتی کد های جاوا به بایت کد ای کلاس تبدیل میشوند هنوز به زبان ماشین تبدیل نشده اند JIT در مقصد و جایی که قرار است کد ما اجرا شود بایت کد ها را به زبان ماشین ترجمه میکند