masterprogrammer
شنبه 05 شهریور 1390, 03:20 صبح
مقاله زیر ترجمه مقاله Java Performance - Memory and Runtime Analysis نوشته Lars Vogel
قابل دسترسی در http://www.vogella.de/articles/JavaP....html#overview (http://www.vogella.de/articles/JavaPerformance/article.html#overview) با اندکی تلخیص میباشد.
استفاده از این مقاله تنها با ذکر منبع (www.Daneshju.ir (http://www.daneshju.ir/)) امکانپذیر است.
--------------------------------------------------------
مدیریت حافظه در جاوا (قسمت اول)
1 ) فاکتورهای سنجش عملکرد :
عوامل مهم تاثیرگذار بر کارایی یک برنامه نوشته شده به زبان جاوا را میتوان به دو دسته تقسیم کرد :
1) حافظه اختصاص یافته به برنامه (حافظه مصرفی برنامه)
2) زمان اجرای برنامه
در برنامه هایی که در تعامل با یکدیگر در حال انجام هستند زمان اجرای برنامه اهمیت بسیاری پیدا میکند. یک پردازنده به طور میانگین توانایی اجرایی یک میلیارد دستور را در هر ثانیه دارا میباشد.
این مقاله مباحث همزمانی و چندنخی (Multithreading) را دربرنمیگرد. برای مطالعه بیشتر در این زمینه ها میتوانید به اینجا (http://www.vogella.de/articles/JavaC...y/article.html (http://www.vogella.de/articles/JavaConcurrency/article.html)) مراجعه کنید.
2 ) حافظه
جاوا، حافظه خود را در دو دسته مدیریت میکند: heap و stack . در ابتدا به مرور حافظه به طور عام در کامپیوتر میپردازیم و سپس heap و stack را بررسی خواهیم کرد.
2.1 ) حافظهی محلی (Native Memory)
حافظه محلی، حافظه ایست که در دسترس پردازنده قرار دارد، توسط سیستم عامل کنترل میشود. پردازنده، دستورالعمل ها را اجرا کرده و نتیجه آنها را در ثبات ها ذخیره میکند. این ثبات ها حافظه های سریعی هستند که نتایج محاسبه شده توسط پردازنده را درخود نگاه میدارند. پردانده ها همچنین میتوانند از طریق خطوط باس (bus) به حافظه های معمولی هم دسترسی داشته باشند. میزان حافظه ای که پردازنده توانایی دسترسی به آن را دارد به اندازه خطوط آدرس پردازنده برای دسترسی به حافظه های فیزیکی بستگی دارد. یک خط آدرس 16 بیتی امکان دسترسی به 16^2 محل حافظه را برای پردازنده فراهم میکند. همچنین خط آدرس 32 بیتی 32^2 محل حافظه را در دسترسی پردازنده قرار میدهد.اگر هر محل حافظه، هشت بیتی باشد پردازنده با 16 بیت خط آدرس به حجم 64 کیلوبایتی از حافظه و با خط آدرس 32 بیتی به حجم 4 گیگی از حافظه دسترسی دارد.
یک سیستم عامل معمولا برای تطبیق حافظه های فیزیکی با حافظه های قابل رویت برای پردازنده از حافظه مجازی (virtual memory) استفاده میکند. سیستم های 32 بیتی کنونی، از گسترش آدرس فیزیکی (Physical Address Extension) استفاده میکنند که به آنها اجازه میدهد با خط آدرس 36 بیتی به 64 گیگابایت حافظه دسترسی داشته باشند و با استفاده از حافظه مجازی به پردازنده ها امکان استفاده از 4 گیگابایت حافظه را میدهند. در این سیستم ها حتی با وجود PAE، پردازنده امکان دسترسی به بیش از 4 گیگابایت حافظه را ندارد.
2.2 ) حافظه در جاوا
جاوا، حافظه در حال استفاده را مدیریت میکند. به این صورت که هنگامیکه یک شیء (Object) جدید در برنامه ساخته می شود فضایی در heap به آن اختصاص داده میشود و به محض اینکه هیچ اشاره گری در برنامه به این شیء وجود نداشت garbagr collector ِ جاوا آن را از حافظه پاک میکند. بنابراین امکان استفاده مجدد از از این حافظه برای برنامه فراهم می شود.
2.3 ) heap در جاوا
ماشین مجازی جاوا (Java Virtual Machine (JVM)) همه اشیائی که در برنامه ساخته میشود را در heap ذخیره میکند برای مثال شیء هایی که با عملگر “new” ایجاد میشوند. Java garbage collector ، هیپ را به فضاهای مختلفی تقسیم میکند بنابراین سریع تر میتواند اشیائی را که باید از حافظه پاک شوند بیابد. متغیرهای هر شئ نیز در داخل آن شئ نگه داری میشود.
2.4 ) stack در جاوا
Stack جاییست که فراخوانی توابع و متغیرهای محلی در آن ذخیره میشوند. فریم تابعی که در برنامه درحال اجراست، همیشه در بالای استک قرار میگیرد. هر فریم استک شامل متغیرهای محلی یک تابع و شرایط آن تابع (از قبیل محل آن در برنامه) هستند. Threadها استک مخصوص خود را دارا هستند.
3. Garbage Collector
ماشین مجازی جاوا به طور خودکار قسمت های بدون استفاده حافظه را مجددا جمع آوری کرده و در اختیار برنامه قرار میدهد. برای مشاهده آغاز به کار garbage collector فرمان "-verbose:gc" را به jvm خود اضافه کنید.
4 ) تنظیمات حافظه برای JVM
JVM با مقدار ثابت حافظه اختصاص داده شده به آن شروع به کار میکند. به محض تمام شدن این مقدار حافظه شما با پیغام خطای زیر مواجه میشود :
java.lang.OutOfMemoryError
JVM ار مقدار حافظه پیش فرض اختصاص داده شده به آن استفاده میکند اما بوسیله تنظیمات زیر میتوان میزان حافظه در اختیار JVM را تغییر داد.
(
-Xms1024m
) ==> حداقل حافظه در دسترس برای jvm را 1024 مگابایت قرار میدهد.
(
-Xmx1800m
) ==> حداکثر حافظه در دسترس برای jvm را 1800 مگابایت قرار میدهد. برنامه های جاوا نمیتوانند از حافظه بیش از مقدار این پارامتر برای heap استفاده کنند.
توجه :
با افزایش مقدار این پارامتر میتوانید از رخ دادن پیغام خطای زیر جلوگیری کنید :
Exception in thread java.lang.OutOfMemoryError: Java heap space
توجه کنید شما نمیتوانید حافظه ای بیشتر از حافظه فیزیکی در دسترس، برای این پارامتر تعیین کنید.
اگر شما برنامه جاوا را در command line اجرا میکنید :
java -Xmx1024m YourProgram
در Eclipse می توانید از VM argumentsدر تنظیمات منوی Run استفاده کنید:
74433
5.حافظه مصرفی و زمان اجرا
به طور کلی یک عمل، وسیع (extensive) شمرده میشود اگر زمان اجرای بالایی داشته باشد یا میزان حافظه مصرفی آن زیاد باشد.
5.1 ) حافظه مصرفی
مجموع حافظه مصرفی/حافظه خالی یک برنامه را می¬توان به متد java.lang.Runtime.getRuntime() استخراج کرد.
برای دسترسی به میزان حافظه در زمان اجرا متدهای مختلفی وجود دارد که در مثال زیر نشان داده شده اند.
package test; import java.util.ArrayList; import java.util.List; public class PerformanceTest { private static final long MEGABYTE = 1024L * 1024L; public static long bytesToMegabytes(long bytes) { return bytes / MEGABYTE; } public static void main(String[] args) { // I assume you will know how to create a object Person yourself... List<Person> list = new ArrayList<Person>(); for (int i = 0; i <= 100000; i++) { list.add(new Person("Jim", "Knopf")); } // Get the Java runtime Runtime runtime = Runtime.getRuntime(); // Run the garbage collector runtime.gc(); // Calculate the used memory long memory = runtime.totalMemory() - runtime.freeMemory(); System.out.println("Used memory is bytes: " + memory); System.out.println("Used memory is megabytes: " + bytesToMegabytes(memory)); } }
5.2) زمان اجرای یک برنامه نوشته شده به زبان جاوا
برای بدست آوردن زمان آغاز و پایان برنامه از متد System.currentTimeMillis() استفاده میکنیم.
package de.vogella.performance.test; class TimeTest1 { public static void main(String[] args) { long startTime = System.currentTimeMillis(); long total = 0; for (int i = 0; i < 10000000; i++) { total += i; } long stopTime = System.currentTimeMillis(); long elapsedTime = stopTime - startTime; System.out.println(elapsedTime); } }
ادامه دارد ...
قابل دسترسی در http://www.vogella.de/articles/JavaP....html#overview (http://www.vogella.de/articles/JavaPerformance/article.html#overview) با اندکی تلخیص میباشد.
استفاده از این مقاله تنها با ذکر منبع (www.Daneshju.ir (http://www.daneshju.ir/)) امکانپذیر است.
--------------------------------------------------------
مدیریت حافظه در جاوا (قسمت اول)
1 ) فاکتورهای سنجش عملکرد :
عوامل مهم تاثیرگذار بر کارایی یک برنامه نوشته شده به زبان جاوا را میتوان به دو دسته تقسیم کرد :
1) حافظه اختصاص یافته به برنامه (حافظه مصرفی برنامه)
2) زمان اجرای برنامه
در برنامه هایی که در تعامل با یکدیگر در حال انجام هستند زمان اجرای برنامه اهمیت بسیاری پیدا میکند. یک پردازنده به طور میانگین توانایی اجرایی یک میلیارد دستور را در هر ثانیه دارا میباشد.
این مقاله مباحث همزمانی و چندنخی (Multithreading) را دربرنمیگرد. برای مطالعه بیشتر در این زمینه ها میتوانید به اینجا (http://www.vogella.de/articles/JavaC...y/article.html (http://www.vogella.de/articles/JavaConcurrency/article.html)) مراجعه کنید.
2 ) حافظه
جاوا، حافظه خود را در دو دسته مدیریت میکند: heap و stack . در ابتدا به مرور حافظه به طور عام در کامپیوتر میپردازیم و سپس heap و stack را بررسی خواهیم کرد.
2.1 ) حافظهی محلی (Native Memory)
حافظه محلی، حافظه ایست که در دسترس پردازنده قرار دارد، توسط سیستم عامل کنترل میشود. پردازنده، دستورالعمل ها را اجرا کرده و نتیجه آنها را در ثبات ها ذخیره میکند. این ثبات ها حافظه های سریعی هستند که نتایج محاسبه شده توسط پردازنده را درخود نگاه میدارند. پردانده ها همچنین میتوانند از طریق خطوط باس (bus) به حافظه های معمولی هم دسترسی داشته باشند. میزان حافظه ای که پردازنده توانایی دسترسی به آن را دارد به اندازه خطوط آدرس پردازنده برای دسترسی به حافظه های فیزیکی بستگی دارد. یک خط آدرس 16 بیتی امکان دسترسی به 16^2 محل حافظه را برای پردازنده فراهم میکند. همچنین خط آدرس 32 بیتی 32^2 محل حافظه را در دسترسی پردازنده قرار میدهد.اگر هر محل حافظه، هشت بیتی باشد پردازنده با 16 بیت خط آدرس به حجم 64 کیلوبایتی از حافظه و با خط آدرس 32 بیتی به حجم 4 گیگی از حافظه دسترسی دارد.
یک سیستم عامل معمولا برای تطبیق حافظه های فیزیکی با حافظه های قابل رویت برای پردازنده از حافظه مجازی (virtual memory) استفاده میکند. سیستم های 32 بیتی کنونی، از گسترش آدرس فیزیکی (Physical Address Extension) استفاده میکنند که به آنها اجازه میدهد با خط آدرس 36 بیتی به 64 گیگابایت حافظه دسترسی داشته باشند و با استفاده از حافظه مجازی به پردازنده ها امکان استفاده از 4 گیگابایت حافظه را میدهند. در این سیستم ها حتی با وجود PAE، پردازنده امکان دسترسی به بیش از 4 گیگابایت حافظه را ندارد.
2.2 ) حافظه در جاوا
جاوا، حافظه در حال استفاده را مدیریت میکند. به این صورت که هنگامیکه یک شیء (Object) جدید در برنامه ساخته می شود فضایی در heap به آن اختصاص داده میشود و به محض اینکه هیچ اشاره گری در برنامه به این شیء وجود نداشت garbagr collector ِ جاوا آن را از حافظه پاک میکند. بنابراین امکان استفاده مجدد از از این حافظه برای برنامه فراهم می شود.
2.3 ) heap در جاوا
ماشین مجازی جاوا (Java Virtual Machine (JVM)) همه اشیائی که در برنامه ساخته میشود را در heap ذخیره میکند برای مثال شیء هایی که با عملگر “new” ایجاد میشوند. Java garbage collector ، هیپ را به فضاهای مختلفی تقسیم میکند بنابراین سریع تر میتواند اشیائی را که باید از حافظه پاک شوند بیابد. متغیرهای هر شئ نیز در داخل آن شئ نگه داری میشود.
2.4 ) stack در جاوا
Stack جاییست که فراخوانی توابع و متغیرهای محلی در آن ذخیره میشوند. فریم تابعی که در برنامه درحال اجراست، همیشه در بالای استک قرار میگیرد. هر فریم استک شامل متغیرهای محلی یک تابع و شرایط آن تابع (از قبیل محل آن در برنامه) هستند. Threadها استک مخصوص خود را دارا هستند.
3. Garbage Collector
ماشین مجازی جاوا به طور خودکار قسمت های بدون استفاده حافظه را مجددا جمع آوری کرده و در اختیار برنامه قرار میدهد. برای مشاهده آغاز به کار garbage collector فرمان "-verbose:gc" را به jvm خود اضافه کنید.
4 ) تنظیمات حافظه برای JVM
JVM با مقدار ثابت حافظه اختصاص داده شده به آن شروع به کار میکند. به محض تمام شدن این مقدار حافظه شما با پیغام خطای زیر مواجه میشود :
java.lang.OutOfMemoryError
JVM ار مقدار حافظه پیش فرض اختصاص داده شده به آن استفاده میکند اما بوسیله تنظیمات زیر میتوان میزان حافظه در اختیار JVM را تغییر داد.
(
-Xms1024m
) ==> حداقل حافظه در دسترس برای jvm را 1024 مگابایت قرار میدهد.
(
-Xmx1800m
) ==> حداکثر حافظه در دسترس برای jvm را 1800 مگابایت قرار میدهد. برنامه های جاوا نمیتوانند از حافظه بیش از مقدار این پارامتر برای heap استفاده کنند.
توجه :
با افزایش مقدار این پارامتر میتوانید از رخ دادن پیغام خطای زیر جلوگیری کنید :
Exception in thread java.lang.OutOfMemoryError: Java heap space
توجه کنید شما نمیتوانید حافظه ای بیشتر از حافظه فیزیکی در دسترس، برای این پارامتر تعیین کنید.
اگر شما برنامه جاوا را در command line اجرا میکنید :
java -Xmx1024m YourProgram
در Eclipse می توانید از VM argumentsدر تنظیمات منوی Run استفاده کنید:
74433
5.حافظه مصرفی و زمان اجرا
به طور کلی یک عمل، وسیع (extensive) شمرده میشود اگر زمان اجرای بالایی داشته باشد یا میزان حافظه مصرفی آن زیاد باشد.
5.1 ) حافظه مصرفی
مجموع حافظه مصرفی/حافظه خالی یک برنامه را می¬توان به متد java.lang.Runtime.getRuntime() استخراج کرد.
برای دسترسی به میزان حافظه در زمان اجرا متدهای مختلفی وجود دارد که در مثال زیر نشان داده شده اند.
package test; import java.util.ArrayList; import java.util.List; public class PerformanceTest { private static final long MEGABYTE = 1024L * 1024L; public static long bytesToMegabytes(long bytes) { return bytes / MEGABYTE; } public static void main(String[] args) { // I assume you will know how to create a object Person yourself... List<Person> list = new ArrayList<Person>(); for (int i = 0; i <= 100000; i++) { list.add(new Person("Jim", "Knopf")); } // Get the Java runtime Runtime runtime = Runtime.getRuntime(); // Run the garbage collector runtime.gc(); // Calculate the used memory long memory = runtime.totalMemory() - runtime.freeMemory(); System.out.println("Used memory is bytes: " + memory); System.out.println("Used memory is megabytes: " + bytesToMegabytes(memory)); } }
5.2) زمان اجرای یک برنامه نوشته شده به زبان جاوا
برای بدست آوردن زمان آغاز و پایان برنامه از متد System.currentTimeMillis() استفاده میکنیم.
package de.vogella.performance.test; class TimeTest1 { public static void main(String[] args) { long startTime = System.currentTimeMillis(); long total = 0; for (int i = 0; i < 10000000; i++) { total += i; } long stopTime = System.currentTimeMillis(); long elapsedTime = stopTime - startTime; System.out.println(elapsedTime); } }
ادامه دارد ...