<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های فرامرز افضلی</title>
        <link>https://virgool.io/feed/@faramarzafzali</link>
        <description>توسعه دهنده جاوا</description>
        <language>fa</language>
        <pubDate>2026-06-07 07:58:01</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/245505/avatar/W8dRZ2.png?height=120&amp;width=120</url>
            <title>فرامرز افضلی</title>
            <link>https://virgool.io/@faramarzafzali</link>
        </image>

                    <item>
                <title>String pool in Java</title>
                <link>https://virgool.io/@faramarzafzali/string-pool-in-java-lfmbglnxeh3k</link>
                <description>رشته در جاوا یکی از مفاهیم مهم است. در این بخش، ما قصد داریم به مفهوم String Pool و String Intern بپردازیم.استرینگ-پول چیزی نیست جز یک فضای ذخیره سازی در مموری هیپ. درست مثل تخصیص حافظه به شی. به طور پیش فرض، خالی است. هر زمان که رشته ای ایجاد می کنیم، شی مورد نظر مقداری فضا در مموری هیپ اشغال می کند. ایجاد تعدادی رشته ممکن است هزینه بر باشد و ممکن است عملکرد را هم کاهش دهد.ماشین مجازی جاوا (JVM) مراحلی را در طول مقداردهی اولیه رشته انجام می دهد که باعث افزایش کارایی و کاهش بار حافظه می شود. برای کاهش تعداد اشیاء رشته ایجاد شده در JVM، کلاس String مجموعه ای از رشته ها را نگه می دارد. هنگامی که ما یک رشته ایجاد می کنیم، JVM ابتدا آن را در String Pool بررسی می کند. اگر از قبل در String Pool وجود داشته باشد، تنها نمونه یا همان reference را برمی گرداند در غیر این صورت، یک شی رشته جدید درString Pool ایجاد میشود. حال دقیق تر به قضیه نگاه میکنیمString str1 = &quot;Python&quot;String str2 = &quot;Data Science&quot;String str3 = &quot;Python&quot;s1==s3 //trues2==s3 //falseچه اتفاقی افتاد؟ به تصویر زیر نگاه کنید. ابتدا، ما یک رشته Python ایجاد کردیم و در String Pool جای گرفت. پس از آن، رشته Data Science ایجاد می شود، همچنین در String Pool قرار می گیرد. در نهایت، دوباره رشته Python را ایجاد کردیم. اما در این زمان، JVM رشته را بررسی می‌کند و متوجه می‌شود که رشته Python از قبل وجود دارد. به جای ساختن یک نمونه جدید در String Pool مرجع (reference) آن، یعنی str1 را برمی گرداند.و حالا یک نمونه مثال دیگر با کلید واژه newString str1 = new String (&quot;Java&quot;);String str2 = new String (&quot;C++&quot;);String str3 = new String (&quot;Data Science&quot;);رشته های Java, C++, Data Science ایجاد شدند. رشته های Java, C++ جدید هستند. اما Data Science در String Pool وجود دارد. همانطور که در عکس بالا دیدید تمام رشته های ایجاد شده با کلید واژه new در مموری هیپ جای می گیرند، نه در String Pool.به قطعه کد زیر توجه کنیدpublic static void main(String[] args){ String s1 = &quot;Java&quot;  String s2 = &quot;Java&quot;  String s3 = new String(&quot;Java&quot;);  String s4 = new String(&quot;Java&quot;).intern();  System.out.println((s1 == s2)); // true  System.out.println((s1 == s3)); // false  System.out.println((s1 == s4)); // true System.out.println((s2 == s4));//trueSystem.out.println((s3 == s4)); //falseSystem.out.println((s2 == s3)); //false}در مثال بالا میبینیم هر زمان که رشته ای را با کلید واژه new ایجاد کردیم، یک شی جدیدی در مموری هیپ ایجاد شده است. ما می‌توانیم با استفاده از متد intern کلاس String این ویژگی را متوقف کنیم.نکته پایانیبرای هر رشته str1 و  str2 عبارت  str1.intern() == str2.intern  تنها در صورتی true برمیگرداند که  str1.equals(str2)، مقدار true برگرداند. خب بحث String Pool و String Intern هم در اینجا به پایان رسید.تا سری بعد ✋</description>
                <category>فرامرز افضلی</category>
                <author>فرامرز افضلی</author>
                <pubDate>Thu, 10 Mar 2022 21:39:21 +0330</pubDate>
            </item>
                    <item>
                <title>انواع Casting در جاوا</title>
                <link>https://virgool.io/@faramarzafzali/%D8%A7%D9%86%D9%88%D8%A7%D8%B9-casting-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-puxzo2kl1oxg</link>
                <description>سلام✋همونطور که از عنوان مشخصه میخوایم در مورد انواع Casting در جاوا صحبت کنیم و نکاتی رو در موردشون ببینیم. ما 2 نوع Casting در جاوا داریم یکی صریح (Explicit) و دیگری ضمنی (Implicit) در نوع صریح همونطور که از اسمش پیداست به صورت صریح اعلام میکنیم که میخوایم از یک نوع داده با دامنه بالاتر به یک نوع داده با دامنه پایین تر حرکت کنیم و با علامت () اون رو مینویسیم.Double -&gt; FLoat -&gt; Long -&gt; Int -&gt; Char -&gt; Short -&gt; Bytepublic static void main(String[] args) {
    double myDouble = 9.78d;
    int myInt = (int) myDouble; // Manual casting: double to int
    System.out.println(myDouble);   // Outputs 9.78
    System.out.println(myInt);      // Outputs 9
  }همونطور که در بالا میبینید، یک متغیر از نوع double تعریف شده و ما صراحتا گفتیم که میخوایم به int تبدیلش کنیم.و اما نوع ضمنی چیه؟در Casting ضمنی میتونیم بگیم برعکس نوع صریح عمل میکنیم و  از یک نوع داده با دامنه پایین تر به یک نوع داده با دامنه بالاتر تر حرکت کنیم. Byte -&gt; Short -&gt; Char -&gt; Int -&gt; Long -&gt; Float -&gt; Doublepublic static void main(String[] args) {
    int myInt = 9;
    double myDouble = myInt; // Automatic casting: int to double
    System.out.println(myInt);      // Outputs 9
    System.out.println(myDouble);   // Outputs 9.0
  }همونطور که در بالا میبینید این کار به صورت خودکار انجام و در نتیجه یک int به double تبدیل شده.برخی نکاتشاید بعضی وقت ها بخوایم یک نوع داده primitive رو به شی متناظر اون که بهش (Wrapper object) یا (Reference variables) میگن، تبدیل کنیم. این کار توسط متد ()valueOf انجام میشه. یه نمونه با هم ببینیم.public static void main(String args[]){  
	//Converting int primitive into Integer object  
	int num=100;  
	Integer obj=Integer.valueOf(num);  
	System.out.println(num+ &amp;quot &amp;quot+ obj);  
   }Output: 100 100همونطور که می بینید هر دو نوع داده primitive و Wrapper object دارای مقادیر یکسانی هستن. حالا برعکس این قضیه هم ممکنه پیش بیاد که بخوایم نهایتا به یک داده primitive  برسیم. اون وقت چیکار میکنیم؟ دوتا راه وجود داره یکی اینکه به صورت خیلی ساده بیایم Explicit casting انجام بدیم یا اینکه از بعضی متدها استفاده کنیم.به عنوان مثال اگر مطمئن هستیم که شی مورد نظر یک عدد صحیح است، به این صورت عمل میکنیم.int x = (Integer)yourObject;راه بعدی استفاده از برخی متدهاست. در جاوا Integer، Long، BigInteger و ... همگی از کلاسNumber ارثبری می کنن که متدی به نام ()intValue داره. public static void main(String args[]){  
	//Creating Wrapper class object 
	Integer obj = new Integer(100);  
	//Converting the wrapper object to primitive
	int num = obj.intValue();
	System.out.println(num+ &amp;quot &amp;quot+ obj);  
   }Output: 100 100البته از متد ()parseInt هم میشه استفاده کرد، در صورتی که ورودی رو به صورت رشته بهش پاس بدیم. /**
 * Parses the specified string as a signed decimal integer value. The ASCII
 * character \u002d (&#039;-&#039;) is recognized as the minus sign.
 *
 * @param string
 *            the string representation of an integer value.
 * @return the primitive integer value represented by {@code string}.
 * @throws NumberFormatException
 *             if {@code string} cannot be parsed as an integer value.
 */
public static int parseInt(String string) throws NumberFormatException {
    return parseInt(string, 10);
}خب امیدوارم این مطالب براتون مفید بوده باشه. اگر نکته ای، سوالی یا پیشنهادی بود، حتما کامنت بذارید و نظرتون رو برام بنویسید. فعلا بدرود ?</description>
                <category>فرامرز افضلی</category>
                <author>فرامرز افضلی</author>
                <pubDate>Tue, 01 Mar 2022 13:23:37 +0330</pubDate>
            </item>
                    <item>
                <title>قسمت سه و نیم Java Zone- ادامه مبحث Garbage Collection</title>
                <link>https://virgool.io/javacup/%D9%82%D8%B3%D9%85%D8%AA-%D8%B3%D9%87-%D9%88-%D9%86%DB%8C%D9%85-java-zone-%D8%A7%D8%AF%D8%A7%D9%85%D9%87-%D9%85%D8%A8%D8%AD%D8%AB-garbage-collection-ja7suieomvxo</link>
                <description>سلامی دوباره??همونطور که در قسمت قبل گفته بودم، قراره یه سری کانفیگ های مربوط به مموری رو بهتر بشناسیم.تنظیم GC چیست؟تنظیم فرآیند GC، تنظیم پارامترهای راه اندازی برنامه مبتنی بر JVM برای رسیدن به نتایج مطلوبه. نه بیشتر و نه کمتر. می تونه به سادگی تنظیم اندازه مموری هیپ با پارامترهای -Xmxو -Xms باشه یا می تونه مثل تنظیم پارامترهای پیشرفته برای کنترل مناطق مختلف مموری هیپ باشه. همه چیز به شرایط و نیازهای شما بستگی داره.چرا تنظیمات مهم هستند؟چیزی که خطرناکه، توقف کامل رشته های برنامه برای مدت زمان طولانی مثلا چند ثانیه ها یا در موارد شدید حتی چند دقیقه است. این می تونه منجر به این بشه که کاربران شما اصلاً نتونن به درستی از برنامه شما استفاده کنن. سیستم های توزیع شده شما می تونن به دلیل عدم پاسخگویی به موقع سقوط کنن. برای جلوگیری از این اتفاق، باید اطمینان حاصل کنیم که gc برای برنامه های JVM ما کار می کند و به خوبی پیکربندی شده و در حد توان وظیفه خود را انجام می دن.چجوری میشه گفت که gc کار اش رو خوب انجام میده یا نه؟ می تونیم از ابزارهای زیادی مثل  Sematext Cloud استفاده کنیم. این برنامه به شما اطلاعات مربوط به استفاده از حافظه JVM ، کار gc و البته عملکرد کلی برنامه شما را می دهد. به عنوان مثال، نگاهی به نمودار زیر بیندازید:در این نمودار چیزی به نام &quot;دندان کوسه&quot; می بینید. معمولاً نشانه سالم بودن روال کار JVM است. بزرگترین قسمت حافظه که نسل قدیمی است، پر و سپس توسط gc پاک میشه. اگر بخواهیم این موضوع را با زمان فرآیند gc مرتبط کنیم، کل تصویر رو می بینیم. با دانستن همه این موارد، می تونیم قضاوت کنیم که آیا از نحوه کار جمع آوری زباله راضی هستیم یا تنظیم نیاز است.همچنین یک نکته دیگه وجود داره که باید به فکر تنظیم عملکرد gc باشید. اصطلاحاً ممکن است تنظیمات پیش فرض gc جاوا برای برنامه شما مناسب نباشه. یعنی ممکنه بخواهید به جای سخت افزار بیشتر به دنبال نحوه مدیریت حافظه خود باشین. گاهی اوقات تنظیم می تونه هزینه های عملیاتی را کاهش بده.شروع تنظیم GCهنگام تنظیم مموری هیپ برنامه، چه نکاتی رو باید در نظر بگیریم؟ سیستم هایی مانند Apache Solr یا Elasticsearch وجود دارن که به شدت به I / O وابسته هستن. در چنین مواردی، باید حداکثر حافظه خود را برای سیستم عامل بگذارید، مخصوصاً اگر داده های شما بزرگ باشن. اگر برنامه شما داده های زیادی رو پردازش می کنن یا تجزیه زیادی انجام می دن، ممکنه به مموری هیپ بیشتری احتیاج داشته باشه. به هر حال، باید به یاد داشته باشید که تا 32 گیگابایت اندازه مموری هیپ میتوانید بهره مند بشید.بنابراین چگونه اندازه heap را تنظیم کنیم؟با تنظیم حداقل و حداکثر اندازه آن. حداقل اندازه با استفاده از پارامتر Xms - و حداکثر اندازه با استفاده از پارامتر Xmx- تنظیم می شود. به عنوان مثال ، برای تنظیم اندازه heapبرای برنامه ما به اندازه 2 گیگابایت Xms2g -Xmx2g - را به پارامترهای راه اندازی برنامه خود اضافه می کنیم. همچنین می تونیم با استفاده از ویژگی Xmn- درست مانند Xms- و Xmx- اندازه فضای مموری هیپ young generation را کنترل کنیم. این به ما اجازه می دهد در صورت لزوم به طور صریح اندازه فضای انباشته  young generation را تعریف کنیم.خب بحث  Garbage Collection هم در اینجا به پایان رسید. حتما اگه سوالی یا نظری داشتین کامنت کنین. خوب و خوش باشید.☘️تا سری بعد ??...</description>
                <category>فرامرز افضلی</category>
                <author>فرامرز افضلی</author>
                <pubDate>Thu, 21 Jan 2021 13:09:00 +0330</pubDate>
            </item>
                    <item>
                <title>قسمت سوم Java Zone- فرآیند Garbage Collection</title>
                <link>https://virgool.io/javacup/%D9%82%D8%B3%D9%85%D8%AA-%D8%B3%D9%88%D9%85-java-zone-%D9%81%D8%B1%D8%A2%DB%8C%D9%86%D8%AF-garbage-collection-v9rlxt7zskok</link>
                <description>سلامی دوبارهدر این قسمت قراره مبحث GC رو مورد بررسی قرار بدیم.تعریف: به پروسه ی مدیریت حافظه اتومات برنامه های جاوایی gc میگن.همونطور که میدونین، برنامه های جاوا بعد کامپایل به بایت کد تبدیل میشن که می تونن روی ماشین مجازی جاوا یا به اختصار JVM  اجرا بشن. وقتی برنامه های جاوا روی JVM اجرا می شن، آبجکت ها در مموری هیپ (که در قسمت قبلی توضیح دادم)  ایجاد می شن که بخشی از حافظه اختصاص یافته به برنامه است. در نهایت، به برخی از آبجکت ها نیازی نخواهید داشت. garbage collector این آبجکت های بلا استفاده رو پیدا و اون هارو را پاک می کنه تا حافظه آزاد بشه.نحوه کار garbage collectionاین فرآیند یک پروسه ی اتومات است. برنامه نویس نیازی به مشخص کردن آبجکت ها برای پاک کردن نداره. اجرای عملیات gc در JVM موجوده و هر JVM می تونه مجموعه ای از آبجکت ها رو هر طور که بخواد نگهداری کنه. تنها شرط این است که با JVM های مرسوم مطابقت داشته باشه. اگرچه تعداد زیادی JVM وجود داره، اما HotSpot رایج ترین نوع به حساب میاد.در حالی که HotSpot دارای چندین gc است که برای موارد مختلف استفاده، بهینه شده اما gc های آن از همان روند اساسی پیروی می کنه.مراحل اصلی gc در مرحله اول، آبجکت هایی که بدون ارجاع مونده رو شناسایی و علامت گذاری می کنه. در مرحله دوم، آبجکت های شناسایی شده حذف می شوند. در صورت نیاز، حافظه پس از پاک کردن آبجکت ها می تونه فشرده بشه، تا آبجکت های باقی مونده در مموری هیپ در یک فضای پیوسته، کنار هم قرار بگیرن. این فرآیند متراکم سازی، تخصیص مموری برای آبجکت های جدید رو آسان تر میکنه.استراتژی شناسایی آبجکت هاهمه ی gc های موجود در HotSpot با این استراتژی که آبجکت ها رو بر اساس طول عمرشون دسته بندی میکنه، کار میکنه. دلیل اش اینه که اکثر آبجکت عمر کوتاهی دارن و به زودی پس از ایجاد شدن، برای پروسه gc آماده می شن.جایگاه یکم: Young Generationآبجکت تازه ایجاد شده از در اینجا قرار میگیره. این جایگاه به دو قسمت، Eden و باقی مانده تقسیم میشن.بخش Eden : زمانی که ما یک آبجکت ایجاد می کنیم، JVM جهت تخصیص حافظه از فضای Eden استفاده میکنه.بخش باقی مانده: در اینجا هم آبجکت هایی که از فرآیند پاکسازی عبور کردن قرار میگیرن.جایگاه دوم: Old Generationآبجکت هایی که به حداکثر آستانه تنش برسند، به &quot;فضای تنور&quot; یا &quot;فضای نسل قدیمی&quot; منتقل می شن.جایگاه سوم: Permanent Generationکلاس ها و متدها در این قسمت ذخیره میشن و کلاس هایی که مورد استفاده نیستند در این مرحله حذف میشن. خب بریم سراغ چهار روش مرسوم HotSpot برای عملیات gcنوع Serial:تمام رخدادهای gc بصورت سریالی در یک ترد و عملیات متراکم سازی پس از اجرای gc، هر بار انجام می شه.نوع Parallel:برای عملیات gc که زیاد سنگین نباشه از چند ترد استفاده میشه و یک ترد برای عملیات gc سنگین تر و متراکم سازی بخش Old Generation در نظر گرفته میشه.نوع CMS (Concurrent Mark Sweep)همانند الگوریتم نوع Parallel از چند ترد برای عملیاتی که سنگین نباشند، استفاده میشه. اما فرقی که با حالت قبلی داره اینه که تمام عملیات gc رو همزمان با فرآیندهای برنامه اجرا میکنه تا احتمال وقوع رخداد stop the world رو به شدت کاهش بده. در ضمن در این حالت خبری از متراکم سازی نیست.تمام عملیات جزئی  gc رویدادهای &quot;Stop the World&quot; هستن. یعنی تمام تردهای برنامه تا زمان کامل شدن عملیات متوقف می شن.نوع G1 (Garbage First):جدیدترین نوع از عملیات gc در این حالت قرار داره. کارها مثل مدل CMS موازی و همزمان انجام میشه اما با این تفاوت که راندمان و بهینه سازی های بهتری نسبت به مدل قبلی داره و کاملا متفاوت عمل میکنه.مزیت های gc در جاوا:خب همونطور که گفتم این پروسه یک روال اتومات در جاوا است و مثل بقیه زبان ها (C/C++) نیست که بصورت دستی مدیریت حافظه رو انجام بدیم. اینم بدونید که برای بسیاری از برنامه های ساده، gc چیزی نیست که برنامه نویس بخواد آگاهانه در نظر بگیره. با این حال، برای برنامه نویسانی که می خوان مهارت های جاوا رو ارتقا بدن، درک نحوه کار gc و روش های تنظیم اونها مهمه.یه نکته مهم هم اینه کهعلاوه بر مکانیسم های اساسی gc، غیر قطعی بودن آن هم مهم است و هیچ راهی برای پیش بینی زمان عملیات در زمان اجرا وجود نداره. برای اجرای gc هم میتوان به استفاده از  System.gc  یا Runtime.gc  اشاره کرد، اما هیچ تضمینی برای عملکرد واقعی اون نیست.امیدوارم از این بخش خوشتون اومده باشه. البته یه قسمت 3 و نیم هم برای ادامه یه سری نکات کوچیک در نظر گرفتم?تا قسمت 3 و نیم ??</description>
                <category>فرامرز افضلی</category>
                <author>فرامرز افضلی</author>
                <pubDate>Sat, 17 Oct 2020 11:36:46 +0330</pubDate>
            </item>
                    <item>
                <title>قسمت دوم Java Zone (ماشین مجازی جاوا)</title>
                <link>https://virgool.io/javacup/%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-java-zone-%D9%85%D8%A7%D8%B4%DB%8C%D9%86-%D9%85%D8%AC%D8%A7%D8%B2%DB%8C-%D8%AC%D8%A7%D9%88%D8%A7-nu5jwqa74rtx</link>
                <description> ساختار JVMخب همونطور که در قسمت قبلی گفتم، امروز قراره JVM رو بررسی کنیم.ماشین مجازی جاوا دو وظیفه اصلی داره:اجرای برنامه های جاوایی روی هر محیطی که JVM وجود داشته باشه. مدیریت و بهینه سازی حافظه برنامه.&quot;خوبه بدونید متد main ای که نقطه آغاز برنامه های جاوایی است، توسط همین JVM صدا زده میشه و بقیه ماجرا...&quot;سوال! ماشین مجازی جاوا رو چه کسانی توسعه دادن؟رسمی ترین پیاده سازی JVM توسط پروژه متن-باز OpenJDK که نتیجه زحمات شرکت Sun Microsystems در سال 2006 بود، صورت گرفته.خب بریم سراغ ساختار JVM قسمت Class Loaderبارگذاری فایل کلاس ها به عهده این بخشه. این قسمت مسئول اجرای 3 عملیات است: بارگذاری اتصال مقداردهیبارگذاری: اینجا Class Loader فایل های class. رو میخونه و داده های باینری مربوطه رو در method area ذخیره میکنه. بعد از بارگذاری فایل های class.، ماشین مجازی شروع به ساختن آبجکتی از نوعی کلاس برای مموری هیپ میکنه. توجه داشته باشین که این آبجکت از نوع کلاسی هست که در java.lang package  تعریف شده. برنامه نویس از این کلاس میتونه برای گرفتن اطلاعات مربوط به کلاس استفاده بکنه. اطلاعاتی مثل نام کلاس، نام کلاس والد، نام متدها و متغیرها و غیره.به عنوان مثال برای گرفتن چنین اطلاعاتی اینطوری عمل میکنیم. https://gist.github.com/faramarzaf/b0d913ab80d8348badcf538267c296c6 اتصال: محل انجام عملیات بررسی و آماده سازی.بررسی: در این مرحله درستی فرمت فایل های class. بررسی و چک میشه که توسط کامپایلر معتبر تولید شده یا نه. اگر اعتبار سنجی با شکست مواجه بشه به اکسپشن java.lang.VerifyError برمیخوریم.آماده سازی: JVM اقدام به اختصاص دادن حافظه برای متغیرهای کلاس و مقدار دهی پیشفرض به متغیرها میکنه.مقدار دهی: در این مرحله، تمام متغیرهای استاتیک با مقادیری که در کدهای ما وجود داره، مقدار دهی میشن. درضمن ترتیب این عملیات در کلاس از بالا به پایین و در بحث وراثت از والد به فرزندان هست.انواع Class loaderبه طور کلی 3 نوع class loader وجود دارهنوع Bootstrap: هر ماشین مجازی جاوایی باید این نوع از class loader رو داشته باشه. کار اش بارگذاری کلاس های java API موجود در مسیر JAVA_HOME/jre/lib هست که این مسیر به bootstrap path معروفه و با زبان های C  و C++ پیاده سازی شدن.نوع Extension: به نوعی فرزند نوع Bootstrap به حساب میاد. مسئول بارگذاری کلاس های موجود در مسیر JAVA_HOME/jre/lib/ext هست و در جاوا توسط کلاس sun.misc.Launcher$ExtClassLoade پیاده سازی شده.نوع System/Application: این نوع هم فرزند نوع Extension هست و مسئول بارگذاری کلاس ها در مسیر برنامه اصلی هست و در جاوا توسط کلاس sun.misc.Launcher$AppClassLoader پیاده سازی شده. https://gist.github.com/faramarzaf/a565890abe12a5121902d2ad5a31a4da کلاس String توسط bootstrap بارگذاری شده و چون از نوع آبجکت جاوا نیست، مقدار null برمیگردونهدر اینجا کلاس Test توسط نوع Application بارگذاری شده.توجه داشته باشین که JVM از اصل Delegation-Hierarchy برای بارگذاری کلاس ها پیروی میکنه. به این صورت که System class loader ها درخواست رو به extension classها و extension class ها همین درخواست رو به boot-strap class loader محول میکنن. اگر کلاس در مسیر boot-strap پیدا شد، کلاس بارگذاری میشه. در نهایت اگر system class loader ها در بارگذاری کلاس ها با شکست مواجه بشن، به اکسپشن java.lang.ClassNotFoundException برمیخوریم. خب بریم به قسمت دوم یعنی حافظه JVMقسمت Method area: در این قسمت همه اطلاعات در سطح کلاس مثل اسم کلاس، اسم والد کلاس (از لحاظ سلسه مراتب اولین کلاس والد از پایین)، متدها و اطلاعات متغیرهای استاتیک وغیراستاتیک و ... ذخیره شدن. در ضمن به ازای هر JVM یک (Method area) وجود داره و در سرتاسر JVM یک منبع مشترکه.قسمت Heap area: تمام اطلاعات مربوط به آبجکت ها در حافظه هیپ ذخیره میشن و مثل Method area به ازای هر JVM یک حافظه هیپ وجود داره.قسمت Stack area: برای هر ترد (thread)، JVM یک Stack  از نوع اجرا در لحظه (run-time) میسازه که در همینجا ذخیره میشه. در ضمن تمام متغیرهای در سطح متدها هم اینجا ذخیره میشن. بعد از اتمام حیات ترد این استک توسط JVM از بین میره.قسمت PC Registers: محل ذخیره سازی آدرس دستور اجرای ترد کنونی هست. مشخصه که هر ترد PC Registers متفاوتی داره.قسمت Native method stacks: برای هر ترد یک native stack جداگانه ساخته میشه. اینجا محل نگهداری کدهای نیتیو بسته به نوع کتابخانه نیتیو است که به زبانی به غیر از جاوا نوشته شده.میرسیم به بخش اجرایی JVM  در این قسمت نوبت میرسه به اجرای فایل های class. یا همون بایت کد هامون. خط به خط بایت کد ها اینجا خونده میشن و بسته به دستورات داخل اش، اجرا رو شروع میکنن که تو این قسمت با 3 بخش مهم مواجهیم.قسمت تفسیر: خط به خط بایت کدها تفسیر میشن و سپس اجرا میشن. البته ضعفی که این قسمت داره اینه که در مواجهه با کدهای تکراری، هربار عمل تفسیر اجرا میشه و این خوب نیست.قسمت Just-In-Time Compiler: توضیحات این بخش رو توی سری قبلی نوشتم ولی بدونید که اینجا JIT باعث افزایش راندمان عمل تفسیر میشه.قسمت Garbage Collector: تمام آبجکت هایی که بدون ارجاع موندن رو از حافظه پاک میکنه.آخرین بخش Java Native Interface (JNI)واسطی است که با کدهای کتابخونه های نیتیو در ارتباطه و کتابخونه هایی که برای اجرای برنامه لازم هستن رو مهیا میکنه (که با C, C++ نوشته شدن) و به عنوان مثال JVM رو وادار میکنه در بخش هایی که ممکنه به سخت افزار نیاز یا تعاملی با سیستم عامل داشته باشه، از این کتابخونه ها استفاده بکنه.خب امیدوارم این بخش هم براتون مفید بوده باشه.خوب و خوش باشید ??</description>
                <category>فرامرز افضلی</category>
                <author>فرامرز افضلی</author>
                <pubDate>Mon, 17 Aug 2020 15:44:18 +0430</pubDate>
            </item>
                    <item>
                <title>نگاهی عمیق به مباحث جاوا با Java Zone</title>
                <link>https://virgool.io/javacup/%D9%86%DA%AF%D8%A7%D9%87%DB%8C-%D8%B9%D9%85%DB%8C%D9%82-%D8%A8%D9%87-%D9%85%D8%A8%D8%A7%D8%AD%D8%AB-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A8%D8%A7-java-zone-fvyy3osckxo2</link>
                <description>قسمت اول Java Zoneسلام. قبل از شروع، فنجون قهوه اتون رو کنارتون بذارید تا بگم قراره توی این سری ها در مورد چی گپ بزنیم.سری Java Zone قراره تا حدی ما رو از دانش ابتدایی و عمومی نسبت به جاوا فراتر ببره و تو این مسیر با کلی نکته های ریز و نسبتا عمیق آشنا بکنه. سعی میکنم با اشاره به بخش های مختلف این سری هارو به جاهای باریک بکشونم و در آخر راضی باشیم دورهم:))))پس بهتره برای ارتباط برقرار کردن بیشتر با این سری، نسبتا با جاوا آشنا باشی. خب بریم.طوری که جاوا کار میکنهسورس کد: کدی که مینویسیکامپایلر: وظیفه اش اینه که چک میکنه خطایی رخ نداده باشه. (املایی و منطقی)اگه همه چی روبه راه بود، کامپایلر سورس رو به جاوا-بایت کد تبدیل میکنه. ماشین مجازی جاوا (JVM): در آخر بایت کد هارو میخونه و اجراشون میکنه.بایت کد دقیقا چیه؟بایت کد که به عنوان &quot; Portable code&quot; یا &quot;P-code&quot; هم شناخته میشه، یک کد میانی شبیه به کد ماشینه. برعکس کد منبع که برای انسان قابل خوندنه، بایت کد ها کدهای عددی فشرده، ثابت‌ها و ارجاعی (معمولا آدرس‌های عددی) هستن. استفاده ازشون به  JVM اجازه میده عملکرد بهتری توی خوندن و اجرا داشته باشه.اگه بخواین خود بایت کد رو تصور کنین چه شکلیه، این تیکه رو ببیین.بعضی از دستوراتش اینجوریهiaload: بازیابی int از آرایهistore: ذخیرهi2b: تبدیل int به بایتaload_0: بازیابیمیتونید از اینجا و اینجا بیشتر باهاش آشنا بشین.کامپایلر جاواوظیفه تبدیل سورس کد به بایت کد رو داره. javac یکی از کامپایلرهای جاواست که این عمل رو انجام میده. البته به جز این، Jikes هم بود که با C++ نوشته شده و فکر کنم دیگه توسعه اش متوقف شده. یکی از رایج ترین حالت های خروجی کامپایلر جاوا، کلاس-فایل ها هستن که توسط JVM اجرا میشن.  JVM کلاس-فایل ها رو لود میکنه سپس بایت کدهارو به کد ماشین تبدیل میکنه. البته اینم اضافه کنم که بعضی از زبان ها بجای کامپایل، توسط مفسرها تفسیر میشن.فرق کامپایلر با مفسر چیه؟هم کامپایلر و هم مفسر به کار ترجمه کد منبع مشغوله تا در نهایت به کد ماشین تبدیل بشه و این کار رو یا از طریق ترجمه در یک مرحله (کامپایلر) یا با تفسیر و اجرای خط به خط کد (مفسر) انجام میده.مخلوطی از کامپایلر و مفسر (JIT) در ابتدا JIT مثل یک مفسر عمل میکنه و کد رو در زمان فراخوانی اجرا میکنه. اگرم کدی پیدا کنه که بارها و بارها فراخوانی شده، مانند کامپایلر عمل می‌کنه. JIT همیشه کد تحت اجرا رو در نظر داره. کدهایی که مشکوک به تکرار هستن رو علامت گذاری میکنه و اونهارو بجای تفسیر، کامپایل میکنه. JIT اساساً مثل مفسر عمل می‌کنه؛ مگر این که متوجه بشه در موردی یک دسته از کارها دارن تکراری انجام میشن. در این حالت JIT رفتارش میشه مثل کامپایلر و کدهای با فراخوانی مکرر رو از طریق کامپایل مستقیم، بهینه‌سازی میکنه.در ادامه می‌پردازیم به اینکه عدم بهینه‌سازی هوشمند از سوی JIT چطوری میتونه منجر به بهینه‌سازی ضعیف بشه.فرض کن یک مورد تکراری برای JIT  پیش اومده. مشخصه که JIT اون رو به عنوان کد تکراری علامت‌گذاری کرده و تصمیم گرفته کامپایل اش کنه. اما اهمیت روشی که JIT برای کامپایل کردن انتخاب می‌کنه به اندازه کامپایل کردن اون مهمه.JIT میتونه انواع متفاوتی از کامپایل رو اجرا کنه که برخی از اون‌ها سریع و برخی دیگر پیچیده‎ ترهستن.مگه چند نوع کامپایل داریم؟؟بریم ببینیم چند نوع داریم.کامپایل مبنا: یک کامپایل سریع اصولا بهینه‌سازی عملکردی پایین‌تری داره و شامل کامپایل کردن کد و سپس ذخیره ‌سازی نتیجه کامپایل بدون صرف زمان زیاد هست. این شکل از بهینه‌سازی سریع به نام بهینه‌ سازی مبنا Baseline Optimization معروفه.کامپایل بهینه: JIT میتونه نوع عمیق‌تر و طولانی‌تری از بهینه‌سازی عملکرد که به نام کامپایل بهینه هست رو استفاده کنه. این نوع کامپایل شامل صرف زمان زیاد در ابتدا و سرمایه‌گذاری برای بهینه‌سازی یک بخش از کد هست که کارآمدترین حالت ممکن رو برای کد به وجود میاره.کامپایل مبنا رو میشه به نوعی متضاد کامپایل بهینه دونستنتیجتا کامپایل مبنا تا حدودی شبیه به ویرایش یک مقاله از نظر املا و دستور زبانه. در این حالت ما بهبودهای عمیقی روی مقاله ایجاد نمی‌کنیم؛ بلکه چند بهبود جزئی اجرا می‌کنیم. کامپایل بهینه به نوعی مثل ویرایش محتوایی، مفهومی و خوانایی یک مقاله است. طبیعتا در کامپایل بهینه هم کار بیشتری انجام و هم زمان بیشتری سپری میشه؛ اما در نهایت نتیجه بهتری داره.خب فکنم تا همینجا برای این سری کافی باشه تو سری بعدی قراره بریم سراغ JVM.طبق معمول هر پایانی اگه سوالی، پیشنهادی یا مورد خاصی بود حتما کامنت کنید.تا سری بعد ??</description>
                <category>فرامرز افضلی</category>
                <author>فرامرز افضلی</author>
                <pubDate>Mon, 10 Aug 2020 12:36:50 +0430</pubDate>
            </item>
            </channel>
</rss>