.\" Copyright (c) 1994, 2024, Oracle and/or its affiliates. All rights reserved. .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. .\" .\" This code is free software; you can redistribute it and/or modify it .\" under the terms of the GNU General Public License version 2 only, as .\" published by the Free Software Foundation. .\" .\" This code is distributed in the hope that it will be useful, but WITHOUT .\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or .\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License .\" version 2 for more details (a copy is included in the LICENSE file that .\" accompanied this code). .\" .\" You should have received a copy of the GNU General Public License version .\" 2 along with this work; if not, write to the Free Software Foundation, .\" Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. .\" .\" Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA .\" or visit www.oracle.com if you need additional information or have any .\" questions. .\" .\"t .\" Automatically generated by Pandoc 2.3.1 .\" .TH "JAVA" "1" "2021" "JDK 17" "JDK Commands" .hy .SH "نام (NAME)" .PP java \- راه‌انداز و مفسر اجرای برنامه‌های جاوا (نسخه ۱۷) .SH "خلاصه دستور (SYNOPSIS)" .PP برای راه‌اندازی یک فایل کلاس: .PP \f[CB]java\f[R] [\f[I]گزینه‌ها\f[R]] \f[I]mainclass\f[R] [\f[I]آرگومان‌ها\f[R] ...] .PP برای راه‌اندازی کلاس اصلی در یک فایل JAR: .PP \f[CB]java\f[R] [\f[I]گزینه‌ها\f[R]] \f[CB]\-jar\f[R] \f[I]jarfile\f[R] [\f[I]آرگومان‌ها\f[R] ...] .PP برای راه‌اندازی کلاس اصلی در یک ماژول: .PP \f[CB]java\f[R] [\f[I]گزینه‌ها\f[R]] \f[CB]\-m\f[R] \f[I]module\f[R][\f[CB]/\f[R]\f[I]mainclass\f[R]] [\f[I]آرگومان‌ها\f[R] ...] .PP یا .PP \f[CB]java\f[R] [\f[I]گزینه‌ها\f[R]] \f[CB]\-\-module\f[R] \f[I]module\f[R][\f[CB]/\f[R]\f[I]mainclass\f[R]] [\f[I]آرگومان‌ها\f[R] ...] .PP برای راه‌اندازی برنامه سورس‌کد تک‌فایلی: .PP \f[CB]java\f[R] [\f[I]گزینه‌ها\f[R]] \f[I]source\-file\f[R] [\f[I]آرگومان‌ها\f[R] \&...] .TP .B \f[I]options\f[R] اختیاری: گزینه‌های خط فرمان را که با فاصله از هم جدا شده‌اند مشخص می‌کند. برای مشاهده شرح گزینه‌های موجود به بخش \f[B]مرور کلی گزینه‌های جاوا (OVERVIEW OF JAVA OPTIONS)\f[R] مراجعه کنید. .RS .RE .TP .B \f[I]mainclass\f[R] نام کلاسی که باید اجرا شود را مشخص می‌کند. ورودی‌های خط فرمان بعد از \f[CB]classname\f[R] به عنوان آرگومان‌های متد اصلی (\f[CB]main\f[R]) در نظر گرفته می‌شوند. .RS .RE .TP .B \f[CB]\-jar\f[R] \f[I]jarfile\f[R] برنامه‌ای را که درون یک فایل JAR بسته‌بندی شده است اجرا می‌کند. آرگومان \f[I]jarfile\f[R] نام یک فایل JAR همراه با مانیفست است که حاوی خطی به فرم \f[CB]Main\-Class:\f[R]\f[I]classname\f[R] می‌باشد؛ کلاسی که متد \f[CB]public\ static\ void\ main(String[]\ args)\f[R] را به عنوان نقطه شروع برنامه شما تعریف می‌کند. هنگام استفاده از \f[CB]\-jar\f[R]، فایل JAR مشخص‌شده منبع تمامی کلاس‌های کاربر خواهد بود و سایر تنظیمات مسیر کلاس (class path) نادیده گرفته می‌شوند. اگر از فایل‌های JAR استفاده می‌کنید، دستور \f[B]jar\f[R] را ببینید. .RS .RE .TP .B \f[CB]\-m\f[R] یا \f[CB]\-\-module\f[R] \f[I]module\f[R][\f[CB]/\f[R]\f[I]mainclass\f[R]] کلاس اصلی را در ماژول مشخص‌شده با \f[I]mainclass\f[R] (در صورت تعیین) یا مقدار پیش‌فرض تعریف‌شده در \f[I]module\f[R] اجرا می‌کند. به عبارت دیگر، \f[I]mainclass\f[R] را می‌توان در صورتی که توسط ماژول مشخص نشده باشد استفاده کرد، یا برای بازنویسی مقداری که ماژول مشخص کرده به کار برد. .RS .PP بخش \f[B]گزینه‌های استاندارد جاوا (Standard Options for Java)\f[R] را ببینید. .RE .TP .B \f[I]source\-file\f[R] فقط برای راه‌اندازی برنامه‌های سورس‌کد تک‌فایلی استفاده می‌شود. فایل سورس حاوی کلاس اصلی را هنگام استفاده از حالت سورس‌فایل مشخص می‌کند. بخش \f[B]استفاده از حالت فایل سورس برای اجرای برنامه‌های سورس‌کد تک‌فایلی (USING SOURCE\-FILE MODE TO LAUNCH SINGLE\-FILE SOURCE\-CODE PROGRAMS)\f[R] را ببینید. .RS .RE .TP .B \f[I]args\f[R] ... اختیاری: آرگومان‌های پس از \f[I]mainclass\f[R]، \f[I]source\-file\f[R]، \f[CB]\-jar\f[R] \f[I]jarfile\f[R] و \f[CB]\-m\f[R] یا \f[CB]\-\-module\f[R] \f[I]module\f[R]\f[CB]/\f[R]\f[I]mainclass\f[R] به عنوان آرگومان به کلاس اصلی فرستاده می‌شوند. .RS .RE .SH "توضیحات (DESCRIPTION)" .PP دستور \f[CB]java\f[R] یک برنامه کاربردی جاوا را اجرا می‌کند. این کار را با راه‌اندازی ماشین مجازی جاوا (JVM)، بارگذاری کلاس مشخص‌شده و فراخوانی متد \f[CB]main()\f[R] آن کلاس انجام می‌دهد. این متد باید به صورت \f[CB]public\f[R] و \f[CB]static\f[R] تعریف شده باشد، نباید هیچ مقداری برگرداند و باید یک آرایه \f[CB]String\f[R] را به عنوان پارامتر بپذیرد. اعلان متد دارای فرم زیر است: .RS .PP \f[CB]public\ static\ void\ main(String[]\ args)\f[R] .RE .PP در حالت سورس‌فایل، دستور \f[CB]java\f[R] می‌تواند کلاسی را که درون یک فایل سورس اعلان شده است راه‌اندازی کند. برای مشاهده توضیحات استفاده از این حالت، به بخش \f[B]استفاده از حالت فایل سورس برای اجرای برنامه‌های سورس‌کد تک‌فایلی (USING SOURCE\-FILE MODE TO LAUNCH SINGLE\-FILE SOURCE\-CODE PROGRAMS)\f[R] مراجعه کنید. .RS .PP \f[B]نکته:\f[R] می‌توانید از متغیر محیطی \f[CB]JDK_JAVA_OPTIONS\f[R] برای افزودن محتوای آن به ابتدای خط فرمان واقعی دستور \f[CB]java\f[R] استفاده کنید. بخش \f[B]استفاده از متغیر محیطی JDK_JAVA_OPTIONS (USING THE JDK_JAVA_OPTIONS LAUNCHER ENVIRONMENT VARIABLE)\f[R] را ببینید. .RE .PP به‌طور پیش‌فرض، اولین آرگومانی که گزینه دستور \f[CB]java\f[R] نباشد، نام کامل (fully qualified) کلاسی است که باید فراخوانی شود. اگر \f[CB]\-jar\f[R] مشخص شده باشد، آرگومان آن نام فایل JAR حاوی کلاس‌ها و فایل‌های منبع (resources) برنامه است. کلاس آغازین باید توسط هدر مانیفست \f[CB]Main\-Class\f[R] در فایل مانیفست آن مشخص شده باشد. .PP آرگومان‌های پس از نام فایل کلاس یا نام فایل JAR به متد \f[CB]main()\f[R] ارسال می‌شوند. .SS \f[CB]javaw\f[R] .PP \f[B]ویندوز:\f[R] دستور \f[CB]javaw\f[R] مشابه دستور \f[CB]java\f[R] است، با این تفاوت که در \f[CB]javaw\f[R] هیچ پنجره کنسولی باز نمی‌شود. زمانی که نمی‌خواهید پنجره خط فرمان (Command Prompt) ظاهر شود از \f[CB]javaw\f[R] استفاده کنید. با این حال، اگر اجرای برنامه ناموفق باشد، راه‌انداز \f[CB]javaw\f[R] یک پنجره پیام خطا (Dialog box) نمایش می‌دهد. .SH "استفاده از حالت فایل سورس برای اجرای برنامه‌های سورس‌کد تک‌فایلی (USING SOURCE\-FILE MODE TO LAUNCH SINGLE\-FILE SOURCE\-CODE PROGRAMS)" .PP برای راه‌اندازی کلاسی که در یک فایل سورس تعریف شده است، راه‌انداز \f[CB]java\f[R] را در حالت سورس‌فایل اجرا کنید. ورود به حالت سورس‌فایل توسط دو مورد در خط فرمان \f[CB]java\f[R] تعیین می‌شود: .IP \[bu] 2 اولین مورد در خط فرمان که گزینه یا بخشی از یک گزینه نباشد. به عبارت دیگر، موردی در خط فرمان که در حالت عادی نام کلاس اصلی خواهد بود. .IP \[bu] 2 گزینه \f[CB]\-\-source\f[R] \f[I]version\f[R] در صورت وجود. .PP اگر شناسه کلاس به یک فایل موجود با پسوند \f[CB]\&.java\f[R] اشاره کند، یا اگر گزینه \f[CB]\-\-source\f[R] مشخص شده باشد، حالت سورس‌فایل انتخاب می‌شود. سپس فایل سورس کامپایل و اجرا می‌گردد. گزینه \f[CB]\-\-source\f[R] می‌تواند برای مشخص کردن نسخه سورس (\f[I]version\f[R] یا \f[I]N\f[R]) سورس‌کد استفاده شود. این گزینه مشخص می‌کند چه رابط برنامه‌نویسی (API) قابل استفاده است. وقتی \f[CB]\-\-source\f[R] \f[I]N\f[R] را تنظیم می‌کنید، تنها می‌توانید از رابط عمومی برنامه‌نویسی که در نسخه \f[I]N\f[R] از JDK تعریف شده استفاده کنید. .RS .PP \f[B]نکته:\f[R] مقادیر معتبر برای \f[I]N\f[R] در هر نسخه تغییر می‌کنند؛ مقادیر جدید اضافه شده و مقادیر قدیمی حذف می‌شوند. اگر از مقداری برای \f[I]N\f[R] استفاده کنید که دیگر پشتیبانی نمی‌شود، پیام خطا دریافت خواهید کرد. مقادیر پشتیبانی‌شده برای \f[I]N\f[R] عبارتند از نسخه فعلی Java SE (\f[CB]17\f[R]) و تعداد محدودی از نسخه‌های قبلی، که جزئیات آن در راهنمای خط فرمان \f[CB]javac\f[R] زیر گزینه‌های \f[CB]\-\-source\f[R] و \f[CB]\-\-release\f[R] آمده است. .RE .PP اگر فایل پسوند \f[CB]\&.java\f[R] نداشته باشد، باید از گزینه \f[CB]\-\-source\f[R] استفاده شود تا به دستور \f[CB]java\f[R] بگوید از حالت سورس‌فایل استفاده کند. گزینه \f[CB]\-\-source\f[R] برای مواردی استفاده می‌شود که فایل سورس یک «اسکریپت» اجرایی است و نام فایل سورس از قراردادهای نام‌گذاری عادی فایل‌های سورس جاوا پیروی نمی‌کند. .PP در حالت سورس‌فایل، اثر کار به گونه‌ای است که گویی فایل سورس در حافظه کامپایل شده و اولین کلاس یافت‌شده در فایل سورس اجرا می‌شود. هر آرگومانی که بعد از نام فایل سورس در خط فرمان اولیه قرار گیرد، در زمان اجرا به کلاس کامپایل‌شده ارسال می‌شود. .PP به عنوان مثال، اگر فایلی با نام \f[CB]HelloWorld.java\f[R] حاوی کلاسی با نام \f[CB]hello.World\f[R] باشد، دستور حالت سورس‌فایل برای راه‌اندازی این کلاس به صورت زیر خواهد بود: .RS .PP \f[CB]java\ HelloWorld.java\f[R] .RE .PP این مثال نشان می‌دهد که کلاس می‌تواند درون یک پکیج نام‌گذاری‌شده باشد و نیازی نیست حتماً در پکیج بدون نام (unnamed package) قرار گیرد. این استفاده از حالت سورس‌فایل به‌طور غیررسمی معادل اجرای دو دستور زیر است که در آن‌ها \f[CB]hello.World\f[R] نام کلاس درون پکیج است: .IP .nf \f[CB] javac\ \-d\ \ HelloWorld.java java\ \-cp\ \ hello.World \f[R] .fi .PP \f[B]در حالت سورس‌فایل، گزینه‌های اضافی خط فرمان به صورت زیر پردازش می‌شوند:\f[R] .IP \[bu] 2 راه‌انداز گزینه‌های مشخص‌شده قبل از فایل سورس را بررسی می‌کند تا گزینه‌های مرتبط با کامپایل فایل سورس را بیابد. .RS 2 .PP این موارد شامل: \f[CB]\-\-class\-path\f[R]، \f[CB]\-\-module\-path\f[R]، \f[CB]\-\-add\-exports\f[R]، \f[CB]\-\-add\-modules\f[R]، \f[CB]\-\-limit\-modules\f[R]، \f[CB]\-\-patch\-module\f[R]، \f[CB]\-\-upgrade\-module\-path\f[R] و هرگونه شکل تغییریافته از این گزینه‌ها است. همچنین شامل گزینه جدید \f[CB]\-\-enable\-preview\f[R] می‌شود که در JEP 12 شرح داده شده است. .RE .IP \[bu] 2 هیچ تمهیدی برای ارسال گزینه‌های اضافی مانند \f[CB]\-processor\f[R] یا \f[CB]\-Werror\f[R] به کامپایلر در نظر گرفته نشده است. .IP \[bu] 2 فایل‌های آرگومان خط فرمان (\f[CB]\@\f[R]\-files) را می‌توان به شیوه استاندارد استفاده کرد. لیست‌های طولانی از آرگومان‌ها برای ماشین مجازی یا برنامه در حال فراخوانی را می‌توان در فایل‌هایی قرار داد و با پیشوند \f[CB]\@\f[R] در خط فرمان مشخص کرد. .PP \f[B]در حالت سورس‌فایل، کامپایل به صورت زیر پیش می‌رود:\f[R] .IP \[bu] 2 هر گزینه خط فرمان که به محیط کامپایل مربوط باشد اعمال می‌شود. .IP \[bu] 2 هیچ فایل سورس دیگری جستجو و کامپایل نمی‌شود، گویی مسیر سورس روی یک مقدار خالی تنظیم شده است. .IP \[bu] 2 پردازش حاشیه‌نویسی‌ها (Annotation processing) غیرفعال است، گویی \f[CB]\-proc:none\f[R] فعال است. .IP \[bu] 2 اگر نسخه‌ای از طریق گزینه \f[CB]\-\-source\f[R] مشخص شده باشد، مقدار آن به عنوان آرگومان یک گزینه ضمنی \f[CB]\-\-release\f[R] برای کامپایل استفاده می‌شود. این کار هم نسخه سورس مورد قبول کامپایلر و هم رابط‌های برنامه‌نویسی سیستمی قابل استفاده توسط کد فایل سورس را تنظیم می‌کند. .IP \[bu] 2 فایل سورس در بستر یک ماژول بدون نام (unnamed module) کامپایل می‌شود. .IP \[bu] 2 فایل سورس باید شامل یک یا چند کلاس سطح بالا (top\-level) باشد، که اولین کلاس به عنوان کلاس اجرایی در نظر گرفته می‌شود. .IP \[bu] 2 کامپایلر محدودیت اختیاری تعریف‌شده در انتهای بخش 7.6 مشخصات زبان جاوا (JLS) مبنی بر اینکه یک نوع در یک بسته نام‌دار باید در فایلی با نام آن نوع به‌علاوه پسوند \f[CB]\&.java\f[R] قرار داشته باشد را اعمال نمی‌کند. .IP \[bu] 2 اگر فایل سورس حاوی خطا باشد، پیام‌های خطای مناسب در خروجی خطای استاندارد نوشته شده و راه‌انداز با یک کد خروج غیرصفر خارج می‌شود. .PP \f[B]در حالت سورس‌فایل، اجرا به صورت زیر پیش می‌رود:\f[R] .IP \[bu] 2 کلاسی که باید اجرا شود اولین کلاس سطح بالای یافت‌شده در فایل سورس است. این کلاس باید حاوی اعلان متد استاندارد \f[CB]public\ static\ void\ main(String[])\f[R] باشد. .IP \[bu] 2 کلاس‌های کامپایل‌شده توسط یک کلاس‌لودر اختصاصی بارگذاری می‌شوند که کار را به کلاس‌لودر برنامه محول می‌کند. این بدان معناست که کلاس‌های موجود در مسیر کلاس برنامه نمی‌توانند به هیچ‌یک از کلاس‌های اعلان‌شده در فایل سورس ارجاع دهند. .IP \[bu] 2 کلاس‌های کامپایل‌شده در بستر یک ماژول بدون نام اجرا می‌شوند، گویی \f[CB]\-\-add\-modules=ALL\-DEFAULT\f[R] فعال است. این مورد علاوه بر هر گزینه \f[CB]\-\-add\-module\f[R] دیگری است که ممکن است در خط فرمان مشخص شده باشد. .IP \[bu] 2 هر آرگومانی که بعد از نام فایل در خط فرمان قرار گیرد به متد اصلی استاندارد ارسال می‌شود. .IP \[bu] 2 اگر کلاسی در مسیر کلاس برنامه وجود داشته باشد که نام آن با نام کلاسی که باید اجرا شود یکسان باشد، یک خطا رخ خواهد داد. .PP برای جزئیات کامل، \f[B]JEP 330: Launch Single\-File Source\-Code Programs\f[R] به آدرس را ببینید. .SH "استفاده از متغیر محیطی JDK_JAVA_OPTIONS (USING THE JDK_JAVA_OPTIONS LAUNCHER ENVIRONMENT VARIABLE)" .PP متغیر محیطی \f[CB]JDK_JAVA_OPTIONS\f[R] محتوای خود را به ابتدای گزینه‌های دریافت‌شده از خط فرمان اضافه می‌کند. محتوای متغیر محیطی \f[CB]JDK_JAVA_OPTIONS\f[R] فهرستی از آرگومان‌هاست که با نویسه‌های فاصله خالی (مطابق با تابع \f[CB]isspace()\f[R]) از هم جدا شده‌اند. این موارد به ابتدای آرگومان‌های خط فرمان ارسالی به راه‌انداز \f[CB]java\f[R] افزوده می‌شوند. نیازمندی کدگذاری برای این متغیر محیطی همانند خط فرمان \f[CB]java\f[R] در سیستم است. با محتوای متغیر محیطی \f[CB]JDK_JAVA_OPTIONS\f[R] دقیقاً همانند مقادیر مشخص‌شده در خط فرمان رفتار می‌شود. .PP می‌توان از نقل‌قول تکی (\f[CB]\[aq]\f[R]) یا دوتایی (\f[CB]"\f[R]) برای دربرگرفتن آرگومان‌های حاوی نویسه‌های فاصله خالی استفاده کرد. تمامی محتوای بین نقل‌قول باز و اولین نقل‌قول بسته متناظر با حذف جفت نقل‌قول حفظ می‌شود. در صورتی که نقل‌قول متناظر پیدا نشود، راه‌انداز با یک پیام خطا متوقف خواهد شد. فایل‌های حاوی آرگومان (\f[CB]\@\f[R]\-files) به همان صورتی که در خط فرمان مشخص می‌شوند پشتیبانی می‌گردند. با این حال، همانند فایل‌های \f[CB]\@\f[R]\-files، استفاده از نویسه‌های عمومی (wildcard) پشتیبانی نمی‌شود. برای جلوگیری از سوءاستفاده احتمالی از رفتار \f[CB]JDK_JAVA_OPTIONS\f[R]، گزینه‌هایی که کلاس اصلی را مشخص می‌کنند (مانند \f[CB]\-jar\f[R]) یا باعث خروج راه‌انداز \f[CB]java\f[R] بدون اجرای کلاس اصلی می‌شوند (مانند \f[CB]\-h\f[R]) در این متغیر محیطی غیرمجاز هستند. اگر هر یک از این گزینه‌ها در متغیر محیطی ظاهر شوند، راه‌انداز با یک پیام خطا متوقف خواهد شد. هنگامی که \f[CB]JDK_JAVA_OPTIONS\f[R] تنظیم شده باشد، راه‌انداز پیامی را به عنوان یادآوری در خروجی خطای استاندارد چاپ می‌کند. .PP \f[B]مثال:\f[R] .IP .nf \f[CB] $\ export\ JDK_JAVA_OPTIONS=\[aq]\-g\ \@file1\ \-Dprop=value\ \@file2\ \-Dws.prop="white\ spaces"\[aq] $\ java\ \-Xint\ \@file3 \f[R] .fi .PP معادل است با خط فرمان: .IP .nf \f[CB] java\ \-g\ \@file1\ \-Dprop=value\ \@file2\ \-Dws.prop="white\ spaces"\ \-Xint\ \@file3 \f[R] .fi .SH "مرور کلی گزینه‌های جاوا (OVERVIEW OF JAVA OPTIONS)" .PP دستور \f[CB]java\f[R] از طیف گسترده‌ای از گزینه‌ها در دسته‌بندی‌های زیر پشتیبانی می‌کند: .IP \[bu] 2 \f[B]گزینه‌های استاندارد جاوا (Standard Options for Java)\f[R]: گزینه‌هایی که پشتیبانی از آن‌ها توسط تمامی پیاده‌سازی‌های ماشین مجازی جاوا (JVM) تضمین شده است. این گزینه‌ها برای اقدامات رایج مانند بررسی نسخه JRE، تنظیم مسیر کلاس، فعال‌سازی خروجی با جزئیات (verbose) و غیره استفاده می‌شوند. .IP \[bu] 2 \f[B]گزینه‌های اضافی جاوا (Extra Options for Java)\f[R]: گزینه‌های عمومی که مختص ماشین مجازی Java HotSpot هستند. پشتیبانی از آن‌ها در تمام پیاده‌سازی‌های JVM تضمین نشده است و ممکن است تغییر کنند. این گزینه‌ها با \f[CB]\-X\f[R] شروع می‌شوند. .PP گزینه‌های پیشرفته برای استفاده‌های روزمره و تفننی توصیه نمی‌شوند. این موارد گزینه‌های توسعه‌دهندگان برای تنظیم بخش‌های خاصی از عملکرد ماشین مجازی Java HotSpot هستند که اغلب نیازمندی‌های سیستمی ویژه‌ای دارند و ممکن است نیازمند دسترسی ممتاز به پارامترهای پیکربندی سیستم باشند. چندین مثال از بهینه‌سازی کارایی در بخش \f[B]مثال‌های بهینه‌سازی کارایی (Performance Tuning Examples)\f[R] ارائه شده است. پشتیبانی از این گزینه‌ها در همه پیاده‌سازی‌های JVM تضمین نمی‌شود و ممکن است تغییر کنند. گزینه‌های پیشرفته با \f[CB]\-XX\f[R] شروع می‌شوند. .IP \[bu] 2 \f[B]گزینه‌های پیشرفته زمان اجرا برای جاوا (Advanced Runtime Options for Java)\f[R]: رفتار زمان اجرای Java HotSpot VM را کنترل می‌کنند. .IP \[bu] 2 \f[B]گزینه‌های پیشرفته کامپایلر JIT برای جاوا (Advanced JIT Compiler Options for java)\f[R]: کامپایل پویای زمان اجرا (JIT) انجام‌شده توسط Java HotSpot VM را کنترل می‌کنند. .IP \[bu] 2 \f[B]گزینه‌های پیشرفته خدمات‌پذیری و خطایابی برای جاوا (Advanced Serviceability Options for Java)\f[R]: امکان جمع‌آوری اطلاعات سیستم و انجام خطایابی جامع را فراهم می‌کنند. .IP \[bu] 2 \f[B]گزینه‌های پیشرفته بازیافت حافظه برای جاوا (Advanced Garbage Collection Options for Java)\f[R]: نحوه انجام بازیافت حافظه (GC) را توسط Java HotSpot کنترل می‌کنند. .PP گزینه‌های بولی (Boolean) برای فعال‌سازی قابلیتی که به‌طور پیش‌فرض غیرفعال است یا غیرفعال‌سازی قابلیتی که به‌طور پیش‌فرض فعال است استفاده می‌شوند. چنین گزینه‌هایی به پارامتر نیاز ندارند. گزینه‌های بولی \f[CB]\-XX\f[R] با استفاده از علامت مثبت (\f[CB]\-XX:+\f[R]\f[I]OptionName\f[R]) فعال شده و با استفاده از علامت منفی (\f[CB]\-XX:\-\f[R]\f[I]OptionName\f[R]) غیرفعال می‌شوند. .PP برای گزینه‌هایی که به آرگومان نیاز دارند، آرگومان ممکن است با فاصله، دو نقطه (:) یا علامت مساوی (=) از نام گزینه جدا شود، یا ممکن است آرگومان بلافاصله پس از گزینه بیاید (سینتکس دقیق برای هر گزینه متفاوت است). اگر باید اندازه را به بایت مشخص کنید، می‌توانید از هیچ پسوندی استفاده نکنید، یا از پسوند \f[CB]k\f[R] یا \f[CB]K\f[R] برای کیلوبایت (KB)، \f[CB]m\f[R] یا \f[CB]M\f[R] برای مگابایت (MB) یا \f[CB]g\f[R] یا \f[CB]G\f[R] برای گیگابایت (GB) استفاده کنید. برای مثال، جهت تنظیم اندازه روی ۸ گیگابایت، می‌توانید یکی از مقادیر \f[CB]8g\f[R]، \f[CB]8192m\f[R]، \f[CB]8388608k\f[R] یا \f[CB]8589934592\f[R] را به عنوان آرگومان مشخص کنید. اگر باید درصد را مشخص کنید، از عددی بین ۰ تا ۱ استفاده کنید. برای مثال، مقدار \f[CB]0.25\f[R] را برای ۲۵٪ مشخص نمایید. .PP بخش‌های زیر گزینه‌های منسوخ، از رده خارج و حذف‌شده را شرح می‌دهند: .IP \[bu] 2 \f[B]گزینه‌های منسوخ‌شده جاوا (Deprecated Java Options)\f[R]: پذیرفته می‌شوند و اثر می‌کنند \-\-\- در صورت استفاده از آن‌ها هشدار صادر می‌شود. .IP \[bu] 2 \f[B]گزینه‌های از رده خارج‌شده جاوا (Obsolete Java Options)\f[R]: پذیرفته می‌شوند اما نادیده گرفته می‌شوند \-\-\- در صورت استفاده از آن‌ها هشدار صادر می‌شود. .IP \[bu] 2 \f[B]گزینه‌های حذف‌شده جاوا (Removed Java Options)\f[R]: حذف شده‌اند \-\-\- استفاده از آن‌ها منجر به خطا می‌شود. .SH "گزینه‌های استاندارد جاوا (STANDARD OPTIONS FOR JAVA)" .PP این گزینه‌ها پرکاربردترین گزینه‌هایی هستند که توسط تمامی پیاده‌سازی‌های JVM پشتیبانی می‌شوند. .RS .PP \f[B]نکته:\f[R] برای مشخص کردن آرگومان برای یک گزینه طولانی، می‌توانید از \f[CB]\-\-\f[R]\f[I]name\f[R]\f[CB]=\f[R]\f[I]value\f[R] یا \f[CB]\-\-\f[R]\f[I]name\f[R] \f[I]value\f[R] استفاده کنید. .RE .TP .B \f[CB]\-agentlib:\f[R]\f[I]libname\f[R][\f[CB]=\f[R]\f[I]options\f[R]] کتابخانه عامل بومی (Native Agent Library) مشخص‌شده را بارگذاری می‌کند. پس از نام کتابخانه، می‌توان فهرستی از گزینه‌های مختص آن کتابخانه را که با کاما جدا شده‌اند استفاده کرد. .RS .IP \[bu] 2 \f[B]لینوکس و macOS:\f[R] اگر گزینه \f[CB]\-agentlib:foo\f[R] مشخص شود، JVM تلاش می‌کند کتابخانه با نام \f[CB]libfoo.so\f[R] را در مسیر مشخص‌شده توسط متغیر سیستمی \f[CB]LD_LIBRARY_PATH\f[R] بارگذاری کند (در macOS این متغیر \f[CB]DYLD_LIBRARY_PATH\f[R] است). .IP \[bu] 2 \f[B]ویندوز:\f[R] اگر گزینه \f[CB]\-agentlib:foo\f[R] مشخص شود، JVM تلاش می‌کند کتابخانه با نام \f[CB]foo.dll\f[R] را در مسیر مشخص‌شده توسط متغیر سیستمی \f[CB]PATH\f[R] بارگذاری کند. .RS 2 .PP مثال زیر نحوه بارگذاری کتابخانه پروتکل اشکال‌زدایی سیمی جاوا (JDWP) و گوش دادن به اتصال سوکت روی پورت 8000 و معلق کردن JVM قبل از بارگذاری کلاس اصلی را نشان می‌دهد: .RS .PP \f[CB]\-agentlib:jdwp=transport=dt_socket,server=y,address=8000\f[R] .RE .RE .RE .TP .B \f[CB]\-agentpath:\f[R]\f[I]pathname\f[R][\f[CB]=\f[R]\f[I]options\f[R]] کتابخانه عامل بومی مشخص‌شده با مسیر مطلق را بارگذاری می‌کند. این گزینه معادل \f[CB]\-agentlib\f[R] است اما از مسیر کامل و نام فایل کتابخانه استفاده می‌کند. .RS .RE .TP .B \f[CB]\-\-class\-path\f[R] \f[I]classpath\f[R], \f[CB]\-classpath\f[R] \f[I]classpath\f[R], or \f[CB]\-cp\f[R] \f[I]classpath\f[R] فهرستی از دایرکتوری‌ها، آرشیوهای JAR و آرشیوهای ZIP جدا شده با نقطه\-ویرگول (\f[CB];\f[R]) برای جستجوی فایل‌های کلاس. .RS .PP مشخص کردن \f[I]classpath\f[R] بر هر مقداری از متغیر محیطی \f[CB]CLASSPATH\f[R] اولویت دارد. اگر گزینه مسیر کلاس استفاده نشود و \f[I]classpath\f[R] تنظیم نشده باشد، مسیر کلاس کاربر شامل دایرکتوری جاری (.) خواهد بود. .PP به‌عنوان یک ویژگی خاص، عنصری از مسیر کلاس که شامل نام پایه ستاره (*) باشد، معادل مشخص کردن فهرستی از تمام فایل‌های موجود در دایرکتوری با پسوند \f[CB]\&.jar\f[R] یا \f[CB]\&.JAR\f[R] در نظر گرفته می‌شود. برنامه جاوا نمی‌تواند تفاوتی بین این دو روش فراخوانی تشخیص دهد. به‌عنوان مثال، اگر دایرکتوری mydir حاوی \f[CB]a.jar\f[R] و \f[CB]b.JAR\f[R] باشد، عنصر مسیر کلاس mydir/* به \f[CB]A.jar:b.JAR\f[R] بسط داده می‌شود، هرچند ترتیب فایل‌های JAR مشخص نیست. تمام فایل‌های \f[CB]\&.jar\f[R] در دایرکتوری مشخص‌شده، حتی فایل‌های پنهان، در فهرست گنجانده می‌شوند. یک ورودی مسیر کلاس شامل ستاره (*) به فهرستی از تمام فایل‌های jar در دایرکتوری جاری بسط می‌یابد. متغیر محیطی \f[CB]CLASSPATH\f[R] نیز در صورت تعریف، به شکل مشابهی بسط می‌یابد. هرگونه بسط کاراکتر عمومی مسیر کلاس قبل از شروع Java VM رخ می‌دهد. برنامه‌های جاوا هرگز کاراکترهای عمومی بسط‌نیافته را نمی‌بینند مگر از طریق پرس‌وجو از متغیرهای محیطی، مانند فراخوانی \f[CB]System.getenv("CLASSPATH")\f[R]. .RE .TP .B \f[CB]\-\-disable\-\@files\f[R] می‌تواند در هر جایی از خط فرمان، از جمله درون یک فایل آرگومان، برای جلوگیری از بسط بیشتر \f[CB]\@filename\f[R] استفاده شود. این گزینه بسط فایل‌های آرگومان \f[CB]\@\f[R] را بعد از این گزینه متوقف می‌کند. .RS .RE .TP .B \f[CB]\-\-enable\-preview\f[R] به کلاس‌ها اجازه می‌دهد به \f[B]قابلیت‌های پیش‌نمایش (Preview Features)\f[R] [https://docs.oracle.com/en/java/javase/12/language/index.html#JSLAN\-GUID\-5A82FE0E\-0CA4\-4F1F\-B075\-564874FE2823] این نسخه وابسته باشند. .RS .RE .TP .B \f[CB]\-\-module\-path\f[R] \f[I]modulepath\f[R]... or \f[CB]\-p\f[R] \f[I]modulepath\f[R] فهرستی از دایرکتوری‌ها که با نقطه\-ویرگول (\f[CB];\f[R]) جدا شده‌اند و هر دایرکتوری شامل ماژول‌ها است. .RS .RE .TP .B \f[CB]\-\-upgrade\-module\-path\f[R] \f[I]modulepath\f[R]... فهرستی از دایرکتوری‌ها که با نقطه\-ویرگول (\f[CB];\f[R]) جدا شده‌اند و هر دایرکتوری شامل ماژول‌هایی است که جایگزین ماژول‌های قابل ارتقا در ایمیج زمان اجرا می‌شوند. .RS .RE .TP .B \f[CB]\-\-add\-modules\f[R] \f[I]module\f[R][\f[CB],\f[R]\f[I]module\f[R]...] ماژول‌های ریشه را برای حل وابستگی علاوه بر ماژول اولیه مشخص می‌کند. \f[I]module\f[R] همچنین می‌تواند \f[CB]ALL\-DEFAULT\f[R]، \f[CB]ALL\-SYSTEM\f[R] و \f[CB]ALL\-MODULE\-PATH\f[R] باشد. .RS .RE .TP .B \f[CB]\-\-list\-modules\f[R] ماژول‌های قابل مشاهده را فهرست کرده و سپس خارج می‌شود. .RS .RE .TP .B \f[CB]\-d\f[R] \f[I]module_name\f[R] or \f[CB]\-\-describe\-module\f[R] \f[I]module_name\f[R] ماژول مشخص‌شده را توصیف کرده و سپس خارج می‌شود. .RS .RE .TP .B \f[CB]\-\-dry\-run\f[R] ماشین مجازی (VM) را ایجاد می‌کند اما متد اصلی (main) را اجرا نمی‌کند. این گزینه \f[CB]\-\-dry\-run\f[R] ممکن است برای اعتبارسنجی گزینه‌های خط فرمان مانند پیکربندی سیستم ماژول مفید باشد. .RS .RE .TP .B \f[CB]\-\-validate\-modules\f[R] همه ماژول‌ها را اعتبارسنجی کرده و خارج می‌شود. این گزینه برای یافتن تداخل‌ها و سایر خطاهای ماژول‌ها در مسیر ماژول مفید است. .RS .RE .TP .B \f[CB]\-D\f[R]\f[I]property\f[R]\f[CB]=\f[R]\f[I]value\f[R] مقدار یک ویژگی سیستمی (System Property) را تنظیم می‌کند. متغیر \f[I]property\f[R] رشته‌ای بدون فاصله است که نام ویژگی را مشخص می‌کند. متغیر \f[I]value\f[R] رشته‌ای است که مقدار ویژگی را مشخص می‌کند. اگر \f[I]value\f[R] شامل فاصله باشد، آن را درون علامت نقل‌قول قرار دهید (مانند \f[CB]\-Dfoo="foo\ bar"\f[R]). .RS .RE .TP .B \f[CB]\-disableassertions\f[R][\f[CB]:\f[R][\f[I]packagename\f[R]]...|\f[CB]:\f[R]\f[I]classname\f[R]] or \f[CB]\-da\f[R][\f[CB]:\f[R][\f[I]packagename\f[R]]...|\f[CB]:\f[R]\f[I]classname\f[R]] بررسی ادعاها (Assertions) را غیرفعال می‌کند. به‌طور پیش‌فرض، ادعاها در تمام بسته‌ها و کلاس‌ها غیرفعال هستند. بدون آرگومان، \f[CB]\-disableassertions\f[R] (\f[CB]\-da\f[R]) ادعاها را در تمام بسته‌ها و کلاس‌ها غیرفعال می‌کند. با آرگومان \f[I]packagename\f[R] که به \f[CB]\&...\f[R] ختم می‌شود، ادعاها در بسته مشخص‌شده و تمام زیربسته‌های آن غیرفعال می‌شوند. اگر آرگومان به سادگی \f[CB]\&...\f[R] باشد، ادعاها در بسته بدون نام در دایرکتوری کاری جاری غیرفعال می‌شوند. با آرگومان \f[I]classname\f[R]، ادعاها در کلاس مشخص‌شده غیرفعال می‌شوند. .RS .PP گزینه \f[CB]\-disableassertions\f[R] (\f[CB]\-da\f[R]) بر تمام بارگذارنده‌های کلاس (Class Loaders) و کلاس‌های سیستمی (که بارگذارنده کلاس ندارند) اعمال می‌شود. یک استثنا برای این قاعده وجود دارد: اگر گزینه بدون آرگومان ارائه شود، بر کلاس‌های سیستمی اعمال نمی‌شود. این امر غیرفعال کردن ادعاها را در تمام کلاس‌ها به جز کلاس‌های سیستمی آسان می‌کند. گزینه \f[CB]\-disablesystemassertions\f[R] به شما امکان می‌دهد ادعاها را در تمام کلاس‌های سیستمی غیرفعال کنید. برای فعال‌سازی صریح ادعاها در بسته‌ها یا کلاس‌های خاص، از گزینه \f[CB]\-enableassertions\f[R] (\f[CB]\-ea\f[R]) استفاده کنید. هر دو گزینه را می‌توان همزمان استفاده کرد. به‌عنوان مثال، برای اجرای برنامه \f[CB]MyClass\f[R] با ادعاهای فعال در بسته \f[CB]com.wombat.fruitbat\f[R] (و هر زیربسته‌ای) اما غیرفعال در کلاس \f[CB]com.wombat.fruitbat.Brickbat\f[R]، از دستور زیر استفاده کنید: .RS .PP \f[CB]java\ \-ea:com.wombat.fruitbat...\ \-da:com.wombat.fruitbat.Brickbat\ MyClass\f[R] .RE .RE .TP .B \f[CB]\-disablesystemassertions\f[R] or \f[CB]\-dsa\f[R] ادعاها را در تمام کلاس‌های سیستمی غیرفعال می‌کند. .RS .RE .TP .B \f[CB]\-enableassertions\f[R][\f[CB]:\f[R][\f[I]packagename\f[R]]...|\f[CB]:\f[R]\f[I]classname\f[R]] or \f[CB]\-ea\f[R][\f[CB]:\f[R][\f[I]packagename\f[R]]...|\f[CB]:\f[R]\f[I]classname\f[R]] ادعاها (Assertions) را فعال می‌کند. به‌طور پیش‌فرض، ادعاها در تمام بسته‌ها و کلاس‌ها غیرفعال هستند. بدون آرگومان، \f[CB]\-enableassertions\f[R] (\f[CB]\-ea\f[R]) ادعاها را در تمام بسته‌ها و کلاس‌ها فعال می‌کند. با آرگومان \f[I]packagename\f[R] که به \f[CB]\&...\f[R] ختم می‌شود، ادعاها در بسته مشخص‌شده و تمام زیربسته‌های آن فعال می‌شوند. اگر آرگومان به سادگی \f[CB]\&...\f[R] باشد، ادعاها در بسته بدون نام در دایرکتوری کاری جاری فعال می‌شوند. با آرگومان \f[I]classname\f[R]، ادعاها در کلاس مشخص‌شده فعال می‌شوند. .RS .PP گزینه \f[CB]\-enableassertions\f[R] (\f[CB]\-ea\f[R]) بر تمام بارگذارنده‌های کلاس و کلاس‌های سیستمی (که بارگذارنده کلاس ندارند) اعمال می‌شود. یک استثنا برای این قاعده وجود دارد: اگر گزینه بدون آرگومان ارائه شود، بر کلاس‌های سیستمی اعمال نمی‌شود. این امر فعال‌سازی ادعاها را در تمام کلاس‌ها به جز کلاس‌های سیستمی آسان می‌کند. گزینه \f[CB]\-enablesystemassertions\f[R] سوییچ جداگانه‌ای برای فعال‌سازی ادعاها در تمام کلاس‌های سیستمی فراهم می‌کند. برای غیرفعال‌سازی صریح ادعاها در بسته‌ها یا کلاس‌های خاص، از گزینه \f[CB]\-disableassertions\f[R] (\f[CB]\-da\f[R]) استفاده کنید. اگر یک دستور حاوی چندین نمونه از این سوییچ‌ها باشد، آن‌ها به ترتیب، قبل از بارگذاری هر کلاسی پردازش می‌شوند. به‌عنوان مثال، برای اجرای برنامه \f[CB]MyClass\f[R] با ادعاهای فعال فقط در بسته \f[CB]com.wombat.fruitbat\f[R] (و هر زیربسته‌ای) اما غیرفعال در کلاس \f[CB]com.wombat.fruitbat.Brickbat\f[R]، از دستور زیر استفاده کنید: .RS .PP \f[CB]java\ \-ea:com.wombat.fruitbat...\ \-da:com.wombat.fruitbat.Brickbat\ MyClass\f[R] .RE .RE .TP .B \f[CB]\-enablesystemassertions\f[R] or \f[CB]\-esa\f[R] ادعاها را در تمام کلاس‌های سیستمی فعال می‌کند. .RS .RE .TP .B \f[CB]\-help\f[R], \f[CB]\-h\f[R], or \f[CB]\-?\f[R] پیام راهنما را در جریان خطا (stderr) چاپ می‌کند. .RS .RE .TP .B \f[CB]\-\-help\f[R] پیام راهنما را در جریان خروجی استاندارد (stdout) چاپ می‌کند. .RS .RE .TP .B \f[CB]\-javaagent:\f[R]\f[I]jarpath\f[R][\f[CB]=\f[R]\f[I]options\f[R]] عامل زبان برنامه‌نویسی جاوا (Java Programming Language Agent) مشخص‌شده را بارگذاری می‌کند. به \f[CB]java.lang.instrument\f[R] مراجعه کنید. .RS .RE .TP .B \f[CB]\-\-show\-version\f[R] نسخه محصول را در جریان خروجی چاپ کرده و به اجرای برنامه ادامه می‌دهد. .RS .RE .TP .B \f[CB]\-showversion\f[R] نسخه محصول را در جریان خطا چاپ کرده و به اجرای برنامه ادامه می‌دهد. .RS .RE .TP .B \f[CB]\-\-show\-module\-resolution\f[R] خروجی حل وابستگی‌های ماژول را در زمان راه‌اندازی نمایش می‌دهد. .RS .RE .TP .B \f[CB]\-splash:\f[R]\f[I]imagepath\f[R] صفحه اسپلش (Splash Screen) را با تصویر مشخص‌شده توسط \f[I]imagepath\f[R] نمایش می‌دهد. تصاویر مقیاس‌بندی‌شده HiDPI به‌طور خودکار پشتیبانی شده و در صورت موجود بودن استفاده می‌شوند. نام فایل تصویر مقیاس‌بندی‌نشده، مانند \f[CB]image.ext\f[R]، همیشه باید به‌عنوان آرگومان گزینه \f[CB]\-splash\f[R] ارسال شود. مناسب‌ترین تصویر مقیاس‌بندی‌شده ارائه‌شده به‌طور خودکار انتخاب می‌شود. .RS .PP به‌عنوان مثال، برای نمایش فایل \f[CB]splash.gif\f[R] از دایرکتوری \f[CB]images\f[R] هنگام شروع برنامه، از گزینه زیر استفاده کنید: .RS .PP \f[CB]\-splash:images/splash.gif\f[R] .RE .PP برای اطلاعات بیشتر به مستندات SplashScreen API مراجعه کنید. .RE .TP .B \f[CB]\-verbose:class\f[R] اطلاعات مربوط به هر کلاس بارگذاری‌شده را نمایش می‌دهد. .RS .RE .TP .B \f[CB]\-verbose:gc\f[R] اطلاعات مربوط به هر رویداد جمع‌آوری زباله (GC) را نمایش می‌دهد. .RS .RE .TP .B \f[CB]\-verbose:jni\f[R] اطلاعات مربوط به استفاده از متدهای بومی و سایر فعالیت‌های رابط بومی جاوا (JNI) را نمایش می‌دهد. .RS .RE .TP .B \f[CB]\-verbose:module\f[R] اطلاعات مربوط به ماژول‌های در حال استفاده را نمایش می‌دهد. .RS .RE .TP .B \f[CB]\-\-version\f[R] نسخه محصول را در جریان خروجی استاندارد چاپ کرده و خارج می‌شود. .RS .RE .TP .B \f[CB]\-version\f[R] نسخه محصول را در جریان خطا چاپ کرده و خارج می‌شود. .RS .RE .TP .B \f[CB]\-X\f[R] راهنمای گزینه‌های اضافی را در جریان خطا چاپ می‌کند. .RS .RE .TP .B \f[CB]\-\-help\-extra\f[R] راهنمای گزینه‌های اضافی را در جریان خروجی استاندارد چاپ می‌کند. .RS .RE .TP .B \f[CB]\@\f[R]\f[I]argfile\f[R] یک یا چند فایل آرگومان با پیشوند \f[CB]\@\f[R] را مشخص می‌کند که توسط دستور \f[CB]java\f[R] استفاده می‌شوند. بسیار رایج است که خط فرمان \f[CB]java\f[R] به دلیل فایل‌های \f[CB]\&.jar\f[R] مورد نیاز در classpath بسیار طولانی شود. گزینه \f[CB]\@\f[R]\f[I]argfile\f[R] با توانمندسازی راه‌انداز برای بسط محتویات فایل‌های آرگومان پس از بسط شل اما قبل از پردازش آرگومان‌ها، بر محدودیت‌های طول خط فرمان غلبه می‌کند. محتویات درون فایل‌های آرگومان بسط می‌یابند زیرا در غیر این صورت، تا زمانی که گزینه \f[CB]\-\-disable\-\@files\f[R] مشاهده شود، روی خط فرمان مشخص می‌شدند. .RS .PP فایل‌های آرگومان همچنین می‌توانند شامل نام کلاس اصلی و تمام گزینه‌ها باشند. اگر یک فایل آرگومان شامل تمام گزینه‌های مورد نیاز دستور \f[CB]java\f[R] باشد، خط فرمان می‌تواند به سادگی دستور زیر باشد: .RS .PP \f[CB]java\ \@\f[R]\f[I]argfile\f[R] .RE .PP برای توضیحات و مثال‌های استفاده از فایل‌های آرگومان \f[CB]\@\f[R]، به بخش \f[B]فایل‌های آرگومان خط فرمان جاوا (java Command\-Line Argument Files)\f[R] مراجعه کنید. .RE .SH "گزینه‌های اضافی جاوا (EXTRA OPTIONS FOR JAVA)" .PP گزینه‌های \f[CB]java\f[R] زیر گزینه‌های عمومی هستند که مختص ماشین مجازی Java HotSpot می‌باشند. .TP .B \f[CB]\-Xbatch\f[R] کامپایل در پس‌زمینه را غیرفعال می‌کند. به‌طور پیش‌فرض، JVM متد را به‌عنوان یک تسک پس‌زمینه کامپایل می‌کند و تا زمان اتمام کامپایل پس‌زمینه، متد را در حالت مفسر اجرا می‌کند. پرچم \f[CB]\-Xbatch\f[R] کامپایل پس‌زمینه را غیرفعال می‌کند تا کامپایل تمام متدها به‌عنوان یک تسک پیش‌زمینه تا زمان تکمیل پیش برود. این گزینه معادل \f[CB]\-XX:\-BackgroundCompilation\f[R] است. .RS .RE .TP .B \f[CB]\-Xbootclasspath/a:\f[R]\f[I]directories\f[R]|\f[I]zip\f[R]|\f[I]JAR\-files\f[R] فهرستی از دایرکتوری‌ها، فایل‌های JAR و آرشیوهای ZIP را برای اضافه شدن به انتهای مسیر کلاس بوت‌استرپ (Bootstrap Class Path) پیش‌فرض مشخص می‌کند. .RS .PP \f[B]لینوکس و macOS:\f[R] دونقطه (\f[CB]:\f[R]) موجودیت‌ها را در این فهرست جدا می‌کند. .PP \f[B]ویندوز:\f[R] نقطه\-ویرگول (\f[CB];\f[R]) موجودیت‌ها را در این فهرست جدا می‌کند. .RE .TP .B \f[CB]\-Xcheck:jni\f[R] بررسی‌های اضافی را برای توابع رابط بومی جاوا (JNI) انجام می‌دهد. .RS .PP بررسی‌های زیر نشان‌دهنده مشکلات قابل توجه در کد بومی تلقی می‌شوند و JVM در چنین مواردی با خطای غیرقابل بازیابی خاتمه می‌یابد: .IP \[bu] 2 نخی که فراخوانی را انجام می‌دهد به JVM متصل (Attach) نشده است. .IP \[bu] 2 نخی که فراخوانی را انجام می‌دهد از \f[CB]JNIEnv\f[R] متعلق به نخ دیگری استفاده می‌کند. .IP \[bu] 2 یک بررسی اعتبارسنجی پارامتر با شکست مواجه شود: .RS 2 .IP \[bu] 2 یک \f[CB]jfieldID\f[R] یا \f[CB]jmethodID\f[R] نامعتبر تشخیص داده شود. به‌عنوان مثال: .RS 2 .IP \[bu] 2 از نوع نادرست باشد .IP \[bu] 2 مرتبط با کلاس نادرست باشد .RE .IP \[bu] 2 پارامتری با نوع نادرست تشخیص داده شود. .IP \[bu] 2 مقدار پارامتر نامعتبر تشخیص داده شود. به‌عنوان مثال: .RS 2 .IP \[bu] 2 مقدار NULL در جایی که مجاز نیست .IP \[bu] 2 اندیس آرایه خارج از محدوده یا ظرفیت فریم .IP \[bu] 2 یک رشته غیر UTF\-8 .IP \[bu] 2 یک ارجاع JNI نامعتبر .IP \[bu] 2 تلاش برای استفاده از تابع \f[CB]ReleaseXXX\f[R] روی پارامتری که توسط تابع متناظر \f[CB]GetXXX\f[R] تولید نشده است .RE .RE .PP بررسی‌های زیر تنها منجر به چاپ هشدارهای متنی می‌شوند: .IP \[bu] 2 یک فراخوانی JNI بدون بررسی استثنای معلق از فراخوانی قبلی JNI انجام شده باشد، و فراخوانی فعلی در صورت وجود استثنای معلق ایمن نباشد. .IP \[bu] 2 توصیف‌کننده کلاس در قالب تزیین‌شده (\f[CB]Lname;\f[R]) باشد در حالی که نباید باشد. .IP \[bu] 2 پارامتر \f[CB]NULL\f[R] مجاز باشد، اما استفاده از آن جای تردید داشته باشد. .IP \[bu] 2 فراخوانی سایر توابع JNI در محدوده \f[CB]Get/ReleasePrimitiveArrayCritical\f[R] یا \f[CB]Get/ReleaseStringCritical\f[R] .PP در صورت استفاده از این گزینه، انتظار کاهش کارایی را داشته باشید. .RE .TP .B \f[CB]\-Xdebug\f[R] کاری انجام نمی‌دهد. برای سازگاری با نسخه‌های پیشین فراهم شده است. .RS .RE .TP .B \f[CB]\-Xdiag\f[R] پیام‌های تشخیصی اضافی را نمایش می‌دهد. .RS .RE .TP .B \f[CB]\-Xint\f[R] برنامه را فقط در حالت تفسیری (Interpreted\-only) اجرا می‌کند. کامپایل به کد بومی غیرفعال است و تمام بایت‌کدها توسط مفسر اجرا می‌شوند. مزایای کارایی ارائه‌شده توسط کامپایلر Just\-In\-Time (JIT) در این حالت وجود ندارند. .RS .RE .TP .B \f[CB]\-Xinternalversion\f[R] اطلاعات دقیق‌تری از نسخه JVM نسبت به گزینه \f[CB]\-version\f[R] نمایش داده و سپس خارج می‌شود. .RS .RE .TP .B \f[CB]\-Xlog:\f[R]\f[I]option\f[R] ثبت لاگ را با چارچوب لاگ یکپارچه ماشین مجازی جاوا (JVM) پیکربندی یا فعال می‌کند. به بخش \f[B]فعال‌سازی لاگ با چارچوب لاگ یکپارچه JVM (Enable Logging with the JVM Unified Logging Framework)\f[R] مراجعه کنید. .RS .RE .TP .B \f[CB]\-Xmixed\f[R] تمام بایت‌کدها را توسط مفسر اجرا می‌کند به جز متدهای داغ (Hot Methods) که به کد بومی کامپایل می‌شوند. به‌طور پیش‌فرض فعال است. برای خاموش کردن از \f[CB]\-Xint\f[R] استفاده کنید. .RS .RE .TP .B \f[CB]\-Xmn\f[R] \f[I]size\f[R] اندازه اولیه و حداکثر اندازه (به بایت) هیپ برای نسل جوان (Young Generation / Nursery) را در جمع‌آوری‌کننده‌های نسلی تنظیم می‌کند. حرف \f[CB]k\f[R] یا \f[CB]K\f[R] را برای نشان دادن کیلوبایت، \f[CB]m\f[R] یا \f[CB]M\f[R] برای مگابایت یا \f[CB]g\f[R] یا \f[CB]G\f[R] برای گیگابایت اضافه کنید. ناحیه نسل جوان هیپ برای اشیاء جدید استفاده می‌شود. عملیات GC در این ناحیه بیشتر از سایر نواحی انجام می‌شود. اگر اندازه نسل جوان بیش از حد کوچک باشد، تعداد زیادی جمع‌آوری زباله جزئی (Minor GC) انجام می‌شود. اگر اندازه بیش از حد بزرگ باشد، فقط جمع‌آوری‌های کامل زباله (Full GC) انجام می‌شوند که ممکن است زمان زیادی برای تکمیل ببرند. توصیه می‌شود که برای جمع‌آوری‌کننده G1 اندازه نسل جوان را تنظیم نکنید، و برای سایر جمع‌آوری‌کننده‌ها اندازه نسل جوان را بیشتر از 25٪ و کمتر از 50٪ اندازه کل هیپ نگه دارید. مثال‌های زیر نحوه تنظیم اندازه اولیه و حداکثر اندازه نسل جوان روی 256 مگابایت را با واحدهای مختلف نشان می‌دهند: .RS .IP .nf \f[CB] \-Xmn256m \-Xmn262144k \-Xmn268435456 \f[R] .fi .PP به‌جای گزینه \f[CB]\-Xmn\f[R] برای تنظیم هم‌زمان اندازه اولیه و حداکثر اندازه هیپ برای نسل جوان، می‌توانید از \f[CB]\-XX:NewSize\f[R] برای تنظیم اندازه اولیه و از \f[CB]\-XX:MaxNewSize\f[R] برای تنظیم حداکثر اندازه استفاده کنید. .RE .TP .B \f[CB]\-Xms\f[R] \f[I]size\f[R] حداقل و اندازه اولیه (به بایت) هیپ را تنظیم می‌کند. این مقدار باید مضربی از 1024 و بزرگتر از 1 مگابایت باشد. حرف \f[CB]k\f[R] یا \f[CB]K\f[R] را برای نشان دادن کیلوبایت، \f[CB]m\f[R] یا \f[CB]M\f[R] برای مگابایت یا \f[CB]g\f[R] یا \f[CB]G\f[R] برای گیگابایت اضافه کنید. مثال‌های زیر نحوه تنظیم اندازه حافظه تخصیص‌یافته به 6 مگابایت را با واحدهای مختلف نشان می‌دهند: .RS .IP .nf \f[CB] \-Xms6291456 \-Xms6144k \-Xms6m \f[R] .fi .PP به‌جای گزینه \f[CB]\-Xms\f[R] برای تنظیم هم‌زمان حداقل و اندازه اولیه هیپ، می‌توانید از \f[CB]\-XX:MinHeapSize\f[R] برای تنظیم حداقل اندازه و از \f[CB]\-XX:InitialHeapSize\f[R] برای تنظیم اندازه اولیه استفاده کنید. .PP اگر این گزینه را تنظیم نکنید، اندازه اولیه برابر با مجموع اندازه‌های تخصیص‌یافته برای نسل قدیم و نسل جوان تنظیم می‌شود. اندازه اولیه هیپ برای نسل جوان را می‌توان با استفاده از گزینه \f[CB]\-Xmn\f[R] یا گزینه \f[CB]\-XX:NewSize\f[R] تنظیم کرد. .RE .TP .B \f[CB]\-Xmx\f[R] \f[I]size\f[R] حداکثر اندازه (به بایت) هیپ را مشخص می‌کند. این مقدار باید مضربی از 1024 و بزرگتر از 2 مگابایت باشد. حرف \f[CB]k\f[R] یا \f[CB]K\f[R] را برای نشان دادن کیلوبایت، \f[CB]m\f[R] یا \f[CB]M\f[R] برای مگابایت یا \f[CB]g\f[R] یا \f[CB]G\f[R] برای گیگابایت اضافه کنید. مقدار پیش‌فرض در زمان اجرا بر اساس پیکربندی سیستم انتخاب می‌شود. برای استقرار در سرور، معمولاً \f[CB]\-Xms\f[R] و \f[CB]\-Xmx\f[R] روی مقدار یکسانی تنظیم می‌شوند. مثال‌های زیر نحوه تنظیم حداکثر اندازه مجاز حافظه تخصیص‌یافته به 80 مگابایت را با واحدهای مختلف نشان می‌دهند: .RS .IP .nf \f[CB] \-Xmx83886080 \-Xmx81920k \-Xmx80m \f[R] .fi .PP گزینه \f[CB]\-Xmx\f[R] معادل \f[CB]\-XX:MaxHeapSize\f[R] است. .RE .TP .B \f[CB]\-Xnoclassgc\f[R] جمع‌آوری زباله (GC) کلاس‌ها را غیرفعال می‌کند. این کار می‌تواند مقداری از زمان GC را صرفه‌جویی کند که وقفه‌ها را در طول اجرای برنامه کوتاه می‌کند. وقتی در زمان راه‌اندازی \f[CB]\-Xnoclassgc\f[R] را مشخص می‌کنید، اشیاء کلاس در برنامه در طول GC دست‌نخورده باقی می‌مانند و همیشه زنده در نظر گرفته می‌شوند. این امر می‌تواند منجر به اشغال دائمی حافظه بیشتر شود که اگر با احتیاط استفاده نشود، استثنای کمبود حافظه (Out of Memory) ایجاد می‌کند. .RS .RE .TP .B \f[CB]\-Xrs\f[R] استفاده از سیگنال‌های سیستم‌عامل توسط JVM را کاهش می‌دهد. قلاب‌های خاموشی (Shutdown Hooks) امکان خاموش شدن منظم یک برنامه جاوا را با اجرای کد پاکسازی کاربر (مانند بستن اتصالات پایگاه‌داده) در هنگام خاموش شدن، حتی در صورت پایان ناگهانی JVM فراهم می‌کنند. .RS .IP \[bu] 2 \f[B]لینوکس و macOS:\f[R] .RS 2 .IP \[bu] 2 ماشین مجازی JVM سیگنال‌ها را برای پیاده‌سازی قلاب‌های خاموشی جهت خاتمه‌های غیرمنتظره دریافت می‌کند. ماشین مجازی JVM از \f[CB]SIGHUP\f[R]، \f[CB]SIGINT\f[R] و \f[CB]SIGTERM\f[R] برای شروع اجرای قلاب‌های خاموشی استفاده می‌کند. .IP \[bu] 2 برنامه‌هایی که JVM را درون خود تعبیه می‌کنند، مکرراً نیاز به به دام انداختن سیگنال‌هایی مانند \f[CB]SIGINT\f[R] یا \f[CB]SIGTERM\f[R] دارند که می‌تواند منجر به تداخل با گرداننده‌های سیگنال JVM شود. گزینه \f[CB]\-Xrs\f[R] برای رفع این مشکل در دسترس است. هنگامی که از \f[CB]\-Xrs\f[R] استفاده می‌شود، ماسک‌های سیگنال برای \f[CB]SIGINT\f[R]، \f[CB]SIGTERM\f[R]، \f[CB]SIGHUP\f[R] و \f[CB]SIGQUIT\f[R] توسط JVM تغییر نمی‌کنند و گرداننده‌های سیگنال برای این سیگنال‌ها نصب نمی‌شوند. .RE .IP \[bu] 2 \f[B]ویندوز:\f[R] .RS 2 .IP \[bu] 2 ماشین مجازی JVM رویدادهای کنترلی کنسول را برای پیاده‌سازی قلاب‌های خاموشی جهت خاتمه غیرمنتظره زیر نظر می‌گیرد. به‌طور مشخص، JVM یک گرداننده کنترل کنسول ثبت می‌کند که پردازش قلاب خاموشی را آغاز کرده و برای \f[CB]CTRL_C_EVENT\f[R]، \f[CB]CTRL_CLOSE_EVENT\f[R]، \f[CB]CTRL_LOGOFF_EVENT\f[R] و \f[CB]CTRL_SHUTDOWN_EVENT\f[R] مقدار \f[CB]TRUE\f[R] برمی‌گرداند. .IP \[bu] 2 ماشین مجازی JVM از مکانیزم مشابهی برای پیاده‌سازی قابلیت دامپ استک‌های نخ برای اهداف اشکال‌زدایی استفاده می‌کند. ماشین مجازی JVM از \f[CB]CTRL_BREAK_EVENT\f[R] برای انجام دامپ نخ استفاده می‌کند. .IP \[bu] 2 اگر JVM به‌عنوان یک سرویس اجرا شود (به‌عنوان مثال، به‌عنوان یک موتور سرولت برای یک وب‌سرور)، می‌تواند \f[CB]CTRL_LOGOFF_EVENT\f[R] را دریافت کند اما نباید خاموشی را آغاز کند زیرا سیستم‌عامل در واقع فرایند را خاتمه نمی‌دهد. برای جلوگیری از تداخل احتمالی مانند این، می‌توان از گزینه \f[CB]\-Xrs\f[R] استفاده کرد. هنگامی که از گزینه \f[CB]\-Xrs\f[R] استفاده می‌شود، JVM گرداننده کنترل کنسول را نصب نمی‌کند، به این معنی که رویدادهای \f[CB]CTRL_C_EVENT\f[R]، \f[CB]CTRL_CLOSE_EVENT\f[R]، \f[CB]CTRL_LOGOFF_EVENT\f[R] یا \f[CB]CTRL_SHUTDOWN_EVENT\f[R] را رصد یا پردازش نمی‌کند. .RE .PP مشخص کردن \f[CB]\-Xrs\f[R] دو پیامد دارد: .IP \[bu] 2 \f[B]لینوکس و macOS:\f[R] دامپ‌های نخ \f[CB]SIGQUIT\f[R] در دسترس نیستند. .IP \[bu] 2 \f[B]ویندوز:\f[R] دامپ‌های نخ Ctrl + Break در دسترس نیستند. .PP کد کاربر مسئول اجرای قلاب‌های خاموشی است، به‌عنوان مثال، با فراخوانی \f[CB]System.exit()\f[R] در زمانی که قرار است JVM خاتمه یابد. .RE .TP .B \f[CB]\-Xshare:\f[R]\f[I]mode\f[R] حالت اشتراک‌گذاری داده‌های کلاس (CDS) را تنظیم می‌کند. .RS .PP آرگومان‌های ممکن \f[I]mode\f[R] برای این گزینه شامل موارد زیر هستند: .TP .B \f[CB]auto\f[R] در صورت امکان از داده‌های کلاس مشترک استفاده می‌کند (پیش‌فرض). .RS .RE .TP .B \f[CB]on\f[R] استفاده از داده‌های کلاس مشترک را الزامی می‌کند، در غیر این صورت با شکست مواجه می‌شود. .RS .RE .RS .PP \f[B]نکته:\f[R] گزینه \f[CB]\-Xshare:on\f[R] فقط برای اهداف آزمایشی استفاده می‌شود. ممکن است باعث شود که ماشین مجازی در هنگام راه‌اندازی، زمانی که آرشیو CDS قابل استفاده نیست (به‌عنوان مثال، زمانی که برخی پارامترهای VM تغییر می‌کنند، یا زمانی که JDK متفاوتی استفاده می‌شود)، به‌طور غیرمنتظره‌ای خارج شود. این گزینه نباید در محیط‌های عملیاتی استفاده شود. .RE .TP .B \f[CB]off\f[R] تلاشی برای استفاده از داده‌های کلاس مشترک نمی‌کند. .RS .RE .RE .TP .B \f[CB]\-XshowSettings\f[R] تمام تنظیمات را نمایش داده و سپس به اجرا ادامه می‌دهد. .RS .RE .TP .B \f[CB]\-XshowSettings:\f[R]\f[I]category\f[R] تنظیمات را نمایش داده و ادامه می‌دهد. آرگومان‌های ممکن \f[I]category\f[R] برای این گزینه شامل موارد زیر هستند: .RS .TP .B \f[CB]all\f[R] تمام دسته‌بندی‌های تنظیمات را نمایش می‌دهد. این مقدار پیش‌فرض است. .RS .RE .TP .B \f[CB]locale\f[R] تنظیمات مربوط به محلی‌سازی (Locale) را نمایش می‌دهد. .RS .RE .TP .B \f[CB]properties\f[R] تنظیمات مربوط به ویژگی‌های سیستمی را نمایش می‌دهد. .RS .RE .TP .B \f[CB]vm\f[R] تنظیمات JVM را نمایش می‌دهد. .RS .RE .TP .B \f[CB]system\f[R] \f[B]لینوکس:\f[R] پیکربندی سیستم میزبان یا کانتینر را نمایش داده و ادامه می‌دهد. .RS .RE .RE .TP .B \f[CB]\-Xss\f[R] \f[I]size\f[R] اندازه پشته نخ (Thread Stack Size) را به بایت تنظیم می‌کند. حرف \f[CB]k\f[R] یا \f[CB]K\f[R] را برای نشان دادن کیلوبایت، \f[CB]m\f[R] یا \f[CB]M\f[R] برای مگابایت یا \f[CB]g\f[R] یا \f[CB]G\f[R] برای گیگابایت اضافه کنید. مقدار پیش‌فرض به پلتفرم بستگی دارد: .RS .IP \[bu] 2 لینوکس/x64 (نسخه ۶۴ بیتی): 1024 کیلوبایت .IP \[bu] 2 مک macOS (نسخه ۶۴ بیتی): 1024 کیلوبایت .IP \[bu] 2 ویندوز: مقدار پیش‌فرض به حافظه مجازی بستگی دارد .PP مثال‌های زیر اندازه پشته نخ را با واحدهای مختلف روی 1024 کیلوبایت تنظیم می‌کنند: .IP .nf \f[CB] \-Xss1m \-Xss1024k \-Xss1048576 \f[R] .fi .PP این گزینه شبیه به \f[CB]\-XX:ThreadStackSize\f[R] است. .RE .TP .B \f[CB]\-\-add\-reads\f[R] \f[I]module\f[R]\f[CB]=\f[R]\f[I]target\-module\f[R](\f[CB],\f[R]\f[I]target\-module\f[R])* ماژول \f[I]module\f[R] را برای خواندن \f[I]target\-module\f[R]، صرف‌نظر از اعلان ماژول، به‌روزرسانی می‌کند. مقدار \f[I]target\-module\f[R] می‌تواند all unnamed برای خواندن تمام ماژول‌های بدون نام باشد. .RS .RE .TP .B \f[CB]\-\-add\-exports\f[R] \f[I]module\f[R]\f[CB]/\f[R]\f[I]package\f[R]\f[CB]=\f[R]\f[I]target\-module\f[R](\f[CB],\f[R]\f[I]target\-module\f[R])* ماژول \f[I]module\f[R] را برای برون‌ریزی (Export) بسته \f[I]package\f[R] به \f[I]target\-module\f[R]، صرف‌نظر از اعلان ماژول، به‌روزرسانی می‌کند. مقدار \f[I]target\-module\f[R] می‌تواند all unnamed برای برون‌ریزی به تمام ماژول‌های بدون نام باشد. .RS .RE .TP .B \f[CB]\-\-add\-opens\f[R] \f[I]module\f[R]\f[CB]/\f[R]\f[I]package\f[R]\f[CB]=\f[R]\f[I]target\-module\f[R](\f[CB],\f[R]\f[I]target\-module\f[R])* ماژول \f[I]module\f[R] را برای باز کردن بسته \f[I]package\f[R] به روی \f[I]target\-module\f[R]، صرف‌نظر از اعلان ماژول، به‌روزرسانی می‌کند. .RS .RE .TP .B \f[CB]\-\-limit\-modules\f[R] \f[I]module\f[R][\f[CB],\f[R]\f[I]module\f[R]...] محدوده ماژول‌های قابل مشاهده را مشخص می‌کند. .RS .RE .TP .B \f[CB]\-\-patch\-module\f[R] \f[I]module\f[R]\f[CB]=\f[R]\f[I]file\f[R](\f[CB];\f[R]\f[I]file\f[R])* یک ماژول را با کلاس‌ها و منابع موجود در فایل‌های JAR یا دایرکتوری‌ها بازنویسی کرده یا بهبود می‌بخشد. .RS .RE .TP .B \f[CB]\-\-source\f[R] \f[I]version\f[R] نسخه سورس‌کد را در حالت فایل سورس تنظیم می‌کند. .RS .RE .SH "گزینه‌های اضافی برای MACOS (EXTRA OPTIONS FOR MACOS)" .PP گزینه‌های اضافی زیر مختص سیستم‌عامل macOS هستند. .TP .B \f[CB]\-XstartOnFirstThread\f[R] متد \f[CB]main()\f[R] را روی نخ اول (AppKit) اجرا می‌کند. .RS .RE .TP .B \f[CB]\-Xdock:name=\f[R]\f[I]application_name\f[R] نام پیش‌فرض برنامه نمایش داده‌شده در داک (Dock) را بازنویسی می‌کند. .RS .RE .TP .B \f[CB]\-Xdock:icon=\f[R]\f[I]path_to_icon_file\f[R] آیکون پیش‌فرض نمایش داده‌شده در داک را بازنویسی می‌کند. .RS .RE .SH "گزینه‌های پیشرفته جاوا (ADVANCED OPTIONS FOR JAVA)" .PP این گزینه‌های \f[CB]java\f[R] می‌توانند برای فعال کردن سایر گزینه‌های پیشرفته استفاده شوند. .TP .B \f[CB]\-XX:+UnlockDiagnosticVMOptions\f[R] گزینه‌های در نظر گرفته شده برای عیب‌یابی و تشخیص JVM را بازگشایی می‌کند. به‌طور پیش‌فرض، این گزینه غیرفعال است و گزینه‌های تشخیصی در دسترس نیستند. .RS .PP گزینه‌های خط فرمانی که با استفاده از این گزینه فعال می‌شوند، پشتیبانی رسمی ندارند. اگر هنگام استفاده از هر یک از این گزینه‌ها با مشکلی مواجه شدید، احتمالاً لازم خواهد بود قبل از دریافت راهنمایی و بررسی از سوی پشتیبانی اوراکل، مشکل را بدون استفاده از این گزینه‌های پشتیبانی‌نشده بازتولید کنید. همچنین این احتمال وجود دارد که هر یک از این گزینه‌ها بدون هیچ هشداری حذف شوند یا رفتار آن‌ها تغییر کند. .RE .TP .B \f[CB]\-XX:+UnlockExperimentalVMOptions\f[R] گزینه‌هایی را که قابلیت‌های آزمایشی را در JVM فراهم می‌کنند بازگشایی می‌کند. به‌طور پیش‌فرض، این گزینه غیرفعال است و قابلیت‌های آزمایشی در دسترس نیستند. .RS .RE .SH "گزینه‌های پیشرفته زمان اجرا برای جاوا (ADVANCED RUNTIME OPTIONS FOR JAVA)" .PP این گزینه‌های \f[CB]java\f[R] رفتار زمان اجرای Java HotSpot VM را کنترل می‌کنند. .TP .B \f[CB]\-XX:ActiveProcessorCount=\f[R]\f[I]x\f[R] تعداد پردازنده‌هایی (CPU) را که ماشین مجازی برای محاسبه اندازه استخرهای نخ (Thread Pools) مورد استفاده در عملیات مختلف مانند جمع‌آوری زباله و ForkJoinPool به کار می‌برد، بازنویسی می‌کند. .RS .PP ماشین مجازی به‌طور معمول تعداد پردازنده‌های موجود را از سیستم‌عامل تعیین می‌کند. این پرچم می‌تواند برای بخش‌بندی منابع CPU هنگام اجرای چندین فرایند جاوا در کانتینرهای داکر مفید باشد. این پرچم حتی اگر \f[CB]UseContainerSupport\f[R] فعال نباشد نیز اعمال می‌شود. برای توضیحات مربوط به فعال‌سازی و غیرفعال‌سازی پشتیبانی از کانتینر، به \f[CB]\-XX:\-UseContainerSupport\f[R] مراجعه کنید. .RE .TP .B \f[CB]\-XX:AllocateHeapAt=\f[R]\f[I]path\f[R] مسیری به سیستم فایل دریافت کرده و از نگاشت حافظه (Memory Mapping) برای تخصیص هیپ اشیاء بر روی دستگاه حافظه استفاده می‌کند. استفاده از این گزینه HotSpot VM را قادر می‌سازد تا هیپ اشیاء جاوا را بر روی یک دستگاه حافظه جایگزین مانند NV\-DIMM که توسط کاربر مشخص شده است تخصیص دهد. .RS .PP دستگاه‌های حافظه جایگزین که معناشناسی مشابهی با DRAM دارند، از جمله معناشناسی عملیات اتمیک، می‌توانند به جای DRAM برای هیپ اشیاء بدون تغییر کد برنامه موجود استفاده شوند. تمام ساختارهای حافظه دیگر (مانند هیپ کد، متاسپیس و پشته‌های نخ) همچنان در DRAM باقی می‌مانند. .PP برخی از سیستم‌عامل‌ها حافظه غیر DRAM را از طریق سیستم فایل در معرض دسترسی قرار می‌دهند. فایل‌های نگاشت‌شده در حافظه در این سیستم‌های فایل از کش صفحه (Page Cache) عبور کرده و نگاشت مستقیمی از حافظه مجازی به حافظه فیزیکی روی دستگاه فراهم می‌کنند. پرچم‌های موجود مربوط به هیپ (مانند \f[CB]\-Xmx\f[R] و \f[CB]\-Xms\f[R]) و پرچم‌های مربوط به جمع‌آوری زباله مانند قبل به کار خود ادامه می‌دهند. .RE .TP .B \f[CB]\-XX:\-CompactStrings\f[R] قابلیت رشته‌های فشرده (Compact Strings) را غیرفعال می‌کند. به‌طور پیش‌فرض، این گزینه فعال است. هنگامی که این گزینه فعال باشد، رشته‌های جاوا که فقط حاوی کاراکترهای تک‌بایتی هستند، به‌صورت داخلی با کدگذاری ISO\-8859\-1 / Latin\-1 به‌صورت یک بایت به ازای هر کاراکتر ذخیره و نمایش داده می‌شوند. این امر فضای مورد نیاز برای رشته‌هایی که فقط حاوی کاراکترهای تک‌بایتی هستند را تا 50٪ کاهش می‌دهد. برای رشته‌های جاوایی که حداقل یک کاراکتر چندبایتی دارند، با کدگذاری UTF\-16 به‌صورت 2 بایت به ازای هر کاراکتر نمایش داده و ذخیره می‌شوند. غیرفعال کردن قابلیت رشته‌های فشرده، استفاده از کدگذاری UTF\-16 را به‌عنوان نمایش داخلی برای تمام رشته‌های جاوا اجباری می‌کند. .RS .PP موارد زیر شرایطی هستند که غیرفعال کردن رشته‌های فشرده در آن‌ها می‌تواند مفید باشد: .IP \[bu] 2 زمانی که مشخص است یک برنامه عمدتاً رشته‌هایی با کاراکترهای چندبایتی تخصیص می‌دهد. .IP \[bu] 2 در شرایط غیرمنتظره‌ای که افت کارایی در مهاجرت از Java SE 8 به Java SE 9 مشاهده شود و تحلیل‌ها نشان دهند که Compact Strings عامل این افت است. .PP در هر دوی این سناریوها، غیرفعال کردن Compact Strings منطقی است. .RE .TP .B \f[CB]\-XX:ErrorFile=\f[R]\f[I]filename\f[R] مسیر و نام فایلی را که داده‌های خطا در صورت بروز خطای غیرقابل بازیابی در آن نوشته می‌شوند مشخص می‌کند. به‌طور پیش‌فرض، این فایل در دایرکتوری کاری جاری با نام \f[CB]hs_err_pid\f[R]\f[I]pid\f[R]\f[CB]\&.log\f[R] ایجاد می‌شود که در آن \f[I]pid\f[R] شناسه فرایندی است که با خطا مواجه شده است. .RS .PP مثال زیر نحوه تنظیم فایل لاگ پیش‌فرض را نشان می‌دهد (توجه داشته باشید که شناسه فرایند به‌صورت \f[CB]%p\f[R] مشخص شده است): .RS .PP \f[CB]\-XX:ErrorFile=./hs_err_pid%p.log\f[R] .RE .IP \[bu] 2 \f[B]لینوکس و macOS:\f[R] مثال زیر نحوه تنظیم لاگ خطا روی \f[CB]/var/log/java/java_error.log\f[R] را نشان می‌دهد: .RS 2 .RS .PP \f[CB]\-XX:ErrorFile=/var/log/java/java_error.log\f[R] .RE .RE .IP \[bu] 2 \f[B]ویندوز:\f[R] مثال زیر نحوه تنظیم فایل لاگ خطا روی \f[CB]C:/log/java/java_error.log\f[R] را نشان می‌دهد: .RS 2 .RS .PP \f[CB]\-XX:ErrorFile=C:/log/java/java_error.log\f[R] .RE .RE .PP اگر فایل وجود داشته و قابل نوشتن باشد، بازنویسی می‌شود. در غیر این صورت، اگر فایل نتواند در دایرکتوری مشخص‌شده ایجاد شود (به دلیل کمبود فضا، مشکل دسترسی یا موارد دیگر)، فایل در دایرکتوری موقت سیستم‌عامل ایجاد می‌شود: .IP \[bu] 2 \f[B]لینوکس و macOS:\f[R] دایرکتوری موقت \f[CB]/tmp\f[R] است. .IP \[bu] 2 \f[B]ویندوز:\f[R] دایرکتوری موقت با مقدار متغیر محیطی \f[CB]TMP\f[R] مشخص می‌شود؛ اگر این متغیر تعریف نشده باشد، مقدار متغیر محیطی \f[CB]TEMP\f[R] استفاده می‌شود. .RE .TP .B \f[CB]\-XX:+ExtensiveErrorReports\f[R] گزارش اطلاعات خطای جامع‌تر در \f[CB]ErrorFile\f[R] را فعال می‌کند. این گزینه می‌تواند در محیط‌هایی که حداکثر اطلاعات مورد نظر است روشن شود \- حتی اگر لاگ‌های حاصل بسیار بزرگ باشند یا حاوی اطلاعاتی باشند که حساس تلقی می‌شوند. اطلاعات می‌تواند از نسخه‌ای به نسخه دیگر و در پلتفرم‌های مختلف متفاوت باشد. به‌طور پیش‌فرض این گزینه غیرفعال است. .RS .RE .TP .B \f[CB]\-XX:FlightRecorderOptions=\f[R]\f[I]parameter\f[R]\f[CB]=\f[R]\f[I]value\f[R] (یا)\f[CB]\-XX:FlightRecorderOptions:\f[R]\f[I]parameter\f[R]\f[CB]=\f[R]\f[I]value\f[R] پارامترهایی را که رفتار JFR (Java Flight Recorder) را کنترل می‌کنند تنظیم می‌کند. .RS .PP فهرست زیر حاوی ورودی‌های موجود \f[I]parameter\f[R]\f[CB]=\f[R]\f[I]value\f[R] برای JFR است: .TP .B \f[CB]globalbuffersize=\f[R]\f[I]size\f[R] مقدار کل حافظه اصلی مورد استفاده برای نگهداری داده‌ها را مشخص می‌کند. مقدار پیش‌فرض بر اساس مقدار مشخص‌شده برای \f[CB]memorysize\f[R] تعیین می‌شود. برای تغییر اندازه بافرهای سراسری، پارامتر \f[CB]memorysize\f[R] را تغییر دهید. .RS .RE .TP .B \f[CB]maxchunksize=\f[R]\f[I]size\f[R] حداکثر اندازه (به بایت) تکه‌های داده (Data Chunks) در یک ضبط را مشخص می‌کند. حرف \f[CB]m\f[R] یا \f[CB]M\f[R] را برای تعیین اندازه به مگابایت (MB) یا \f[CB]g\f[R] یا \f[CB]G\f[R] برای تعیین اندازه به گیگابایت (GB) اضافه کنید. به‌طور پیش‌فرض، حداکثر اندازه تکه‌های داده روی 12 مگابایت تنظیم شده است. حداقل مقدار مجاز 1 مگابایت است. .RS .RE .TP .B \f[CB]memorysize=\f[R]\f[I]size\f[R] تعیین می‌کند چه مقدار حافظه بافر باید استفاده شود، و پارامترهای \f[CB]globalbuffersize\f[R] و \f[CB]numglobalbuffers\f[R] را بر اساس اندازه مشخص‌شده تنظیم می‌کند. حرف \f[CB]m\f[R] یا \f[CB]M\f[R] را برای تعیین اندازه به مگابایت (MB) یا \f[CB]g\f[R] یا \f[CB]G\f[R] برای تعیین اندازه به گیگابایت (GB) اضافه کنید. به‌طور پیش‌فرض، اندازه حافظه روی 10 مگابایت تنظیم شده است. .RS .RE .TP .B \f[CB]numglobalbuffers\f[R] تعداد بافرهای سراسری مورد استفاده را مشخص می‌کند. مقدار پیش‌فرض بر اساس اندازه حافظه مشخص‌شده تعیین می‌شود. برای تغییر تعداد بافرهای سراسری، پارامتر \f[CB]memorysize\f[R] را تغییر دهید. .RS .RE .TP .B \f[CB]old\-object\-queue\-size=number\-of\-objects\f[R] حداکثر تعداد اشیاء قدیمی برای ردگیری. به‌طور پیش‌فرض، تعداد اشیاء روی 256 تنظیم شده است. .RS .RE .TP .B \f[CB]repository=\f[R]\f[I]path\f[R] مخزن (یک دایرکتوری) را برای ذخیره‌سازی موقت دیسک مشخص می‌کند. به‌طور پیش‌فرض، از دایرکتوری موقت سیستم استفاده می‌شود. .RS .RE .TP .B \f[CB]retransform=\f[R]{\f[CB]true\f[R]|\f[CB]false\f[R]} مشخص می‌کند که آیا کلاس‌های رویداد باید با استفاده از JVMTI بازتغییرشکل (Retransform) داده شوند یا خیر. اگر false باشد، ابزارسازی (Instrumentation) هنگام بارگذاری کلاس‌های رویداد اضافه می‌شود. به‌طور پیش‌فرض، این پارامتر فعال است. .RS .RE .TP .B \f[CB]samplethreads=\f[R]{\f[CB]true\f[R]|\f[CB]false\f[R]} مشخص می‌کند که آیا نمونه‌برداری از نخ‌ها فعال است یا خیر. نمونه‌برداری از نخ تنها در صورتی رخ می‌دهد که رویداد نمونه‌برداری همراه با این پارامتر فعال باشد. به‌طور پیش‌فرض، این پارامتر فعال است. .RS .RE .TP .B \f[CB]stackdepth=\f[R]\f[I]depth\f[R] عمق پشته برای ردیابی‌های پشته (Stack Traces). به‌طور پیش‌فرض، عمق روی 64 فراخوانی متد تنظیم شده است. حداکثر مقدار 2048 است. مقادیر بزرگتر از 64 می‌توانند بار اضافی قابل توجهی ایجاد کرده و کارایی را کاهش دهند. .RS .RE .TP .B \f[CB]threadbuffersize=\f[R]\f[I]size\f[R] اندازه بافر محلی هر نخ (به بایت) را مشخص می‌کند. به‌طور پیش‌فرض، اندازه بافر محلی روی 8 کیلوبایت تنظیم شده و حداقل مقدار آن 4 کیلوبایت است. تغییر این پارامتر می‌تواند کارایی را کاهش دهد و توصیه نمی‌شود. .RS .RE .PP می‌توانید مقادیر چندین پارامتر را با جدا کردن آن‌ها با کاما مشخص کنید. .RE .TP .B \f[CB]\-XX:LargePageSizeInBytes=\f[R]\f[I]size\f[R] حداکثر اندازه صفحه بزرگ حافظه (به بایت) مورد استفاده توسط JVM را تنظیم می‌کند. آرگومان \f[I]size\f[R] باید اندازه صفحه معتبری باشد که توسط محیط پشتیبانی می‌شود تا اثربخش باشد. حرف \f[CB]k\f[R] یا \f[CB]K\f[R] را برای نشان دادن کیلوبایت، \f[CB]m\f[R] یا \f[CB]M\f[R] برای مگابایت یا \f[CB]g\f[R] یا \f[CB]G\f[R] برای گیگابایت اضافه کنید. به‌طور پیش‌فرض، اندازه روی 0 تنظیم شده است، به این معنی که JVM از اندازه پیش‌فرض صفحه بزرگ محیط به‌عنوان حداکثر اندازه برای صفحات بزرگ استفاده می‌کند. به بخش \f[B]صفحات بزرگ حافظه (Large Pages)\f[R] مراجعه کنید. .RS .PP مثال زیر نحوه تنظیم اندازه صفحه بزرگ روی 1 گیگابایت (GB) را شرح می‌دهد: .RS .PP \f[CB]\-XX:LargePageSizeInBytes=1g\f[R] .RE .RE .TP .B \f[CB]\-XX:MaxDirectMemorySize=\f[R]\f[I]size\f[R] حداکثر اندازه کل (به بایت) تخصیص‌های بافر مستقیم (Direct-buffer) بسته \f[CB]java.nio\f[R] را تنظیم می‌کند. حرف \f[CB]k\f[R] یا \f[CB]K\f[R] را برای نشان دادن کیلوبایت، \f[CB]m\f[R] یا \f[CB]M\f[R] برای مگابایت یا \f[CB]g\f[R] یا \f[CB]G\f[R] برای گیگابایت اضافه کنید. به‌طور پیش‌فرض، اندازه روی 0 تنظیم شده است، به این معنی که JVM اندازه را برای تخصیص‌های بافر مستقیم NIO به‌طور خودکار انتخاب می‌کند. .RS .PP مثال‌های زیر نحوه تنظیم اندازه NIO روی 1024 کیلوبایت را با واحدهای مختلف نشان می‌دهند: .IP .nf \f[CB] \-XX:MaxDirectMemorySize=1m \-XX:MaxDirectMemorySize=1024k \-XX:MaxDirectMemorySize=1048576 \f[R] .fi .RE .TP .B \f[CB]\-XX:\-MaxFDLimit\f[R] تلاش برای تنظیم حد نرم (Soft Limit) تعداد توصیف‌کننده‌های فایل باز به حد سخت (Hard Limit) را غیرفعال می‌کند. به‌طور پیش‌فرض، این گزینه در تمام پلتفرم‌ها فعال است، اما در ویندوز نادیده گرفته می‌شود. تنها زمانی که ممکن است نیاز به غیرفعال کردن این گزینه داشته باشید در Mac OS است، جایی که استفاده از آن حداکثر مقدار 10240 را تحمیل می‌کند که کمتر از حداکثر واقعی سیستم است. .RS .RE .TP .B \f[CB]\-XX:NativeMemoryTracking=\f[R]\f[I]mode\f[R] حالت ردگیری مصرف حافظه بومی JVM را مشخص می‌کند. آرگومان‌های ممکن \f[I]mode\f[R] برای این گزینه شامل موارد زیر هستند: .RS .TP .B \f[CB]off\f[R] دستور می‌دهد مصرف حافظه بومی JVM ردگیری نشود. این رفتار پیش‌فرض است اگر گزینه \f[CB]\-XX:NativeMemoryTracking\f[R] را مشخص نکنید. .RS .RE .TP .B \f[CB]summary\f[R] مصرف حافظه را فقط توسط زیرسیستم‌های JVM مانند هیپ جاوا، کلاس، کد و نخ ردگیری می‌کند. .RS .RE .TP .B \f[CB]detail\f[R] علاوه بر ردگیری مصرف حافظه توسط زیرسیستم‌های JVM، مصرف حافظه را بر اساس هر \f[CB]CallSite\f[R]، ناحیه حافظه مجازی مجزا و نواحی متعهدشده (Committed) آن ردگیری می‌کند. .RS .RE .RE .TP .B \f[CB]-XX:TrimNativeHeapInterval=\f[R]\f[I]millis\f[R] فاصله زمانی (به میلی‌ثانیه) که در آن JVM هیپ بومی را هرس (Trim) می‌کند. مقادیر کمتر حافظه را مشتاقانه‌تر با هزینه بار پردازشی بیشتر آزاد می‌کنند. مقدار 0 (پیش‌فرض) هرس هیپ بومی را غیرفعال می‌کند. هرس هیپ بومی در یک نخ اختصاصی انجام می‌شود. .RS .PP این گزینه فقط در لینوکس با کتابخانه استاندارد C گنو (glibc) پشتیبانی می‌شود. .RE .TP .B \f[CB]\-XX:ObjectAlignmentInBytes=\f[R]\f[I]alignment\f[R] تراز حافظه اشیاء جاوا (به بایت) را تنظیم می‌کند. به‌طور پیش‌فرض، این مقدار روی 8 بایت تنظیم شده است. مقدار مشخص‌شده باید توانی از 2 باشد و در محدوده 8 تا 256 (شامل هر دو) قرار گیرد. این گزینه امکان استفاده از اشاره‌گرهای فشرده را با اندازه‌های بزرگ هیپ جاوا فراهم می‌کند. .RS .PP محدودیت اندازه هیپ به بایت به صورت زیر محاسبه می‌شود: .RS .PP \f[CB]4GB\ *\ ObjectAlignmentInBytes\f[R] .RE .RS .PP \f[B]نکته:\f[R] با افزایش مقدار تراز، فضای استفاده‌نشده بین اشیاء نیز افزایش می‌یابد. در نتیجه، ممکن است هیچ مزیتی از استفاده از اشاره‌گرهای فشرده با اندازه‌های بزرگ هیپ جاوا به دست نیاورید. .RE .RE .TP .B \f[CB]\-XX:OnError=\f[R]\f[I]string\f[R] یک دستور سفارشی یا مجموعه‌ای از دستورات جدا شده با نقطه\-ویرگول را برای اجرا در صورت بروز خطای غیرقابل بازیابی تنظیم می‌کند. اگر رشته شامل فاصله باشد، باید درون علامت نقل‌قول قرار گیرد. .RS .IP \[bu] 2 \f[B]لینوکس و macOS:\f[R] مثال زیر نشان می‌دهد چگونه گزینه \f[CB]\-XX:OnError\f[R] می‌تواند برای اجرای دستور \f[CB]gcore\f[R] جهت ایجاد ایمیج core و شروع اشکال‌زدا \f[CB]gdb\f[R] برای اتصال به فرایند در صورت بروز خطای غیرقابل بازیابی استفاده شود (\f[CB]%p\f[R] شناسه فرایند جاری را مشخص می‌کند): .RS 2 .RS .PP \f[CB]\-XX:OnError="gcore\ %p;gdb\ \-p\ %p"\f[R] .RE .RE .IP \[bu] 2 \f[B]ویندوز:\f[R] مثال زیر نشان می‌دهد چگونه گزینه \f[CB]\-XX:OnError\f[R] می‌تواند برای اجرای ابزار \f[CB]userdump.exe\f[R] جهت دریافت کرش دامپ در صورت بروز خطای غیرقابل بازیابی استفاده شود (\f[CB]%p\f[R] شناسه فرایند جاری را مشخص می‌کند). این مثال فرض می‌کند که مسیر ابزار \f[CB]userdump.exe\f[R] در متغیر محیطی \f[CB]PATH\f[R] مشخص شده است: .RS 2 .RS .PP \f[CB]\-XX:OnError="userdump.exe\ %p"\f[R] .RE .RE .RE .TP .B \f[CB]\-XX:OnOutOfMemoryError=\f[R]\f[I]string\f[R] یک دستور سفارشی یا مجموعه‌ای از دستورات جدا شده با نقطه\-ویرگول را برای اجرا در زمان پرتاب اولین استثنای \f[CB]OutOfMemoryError\f[R] تنظیم می‌کند. اگر رشته شامل فاصله باشد، باید درون علامت نقل‌قول قرار گیرد. برای نمونه‌ای از رشته دستور، به توضیحات گزینه \f[CB]\-XX:OnError\f[R] مراجعه کنید. .RS .RE .TP .B \f[CB]\-XX:+PrintCommandLineFlags\f[R] چاپ پرچم‌های JVM انتخاب‌شده به‌صورت ارگونومیک را که در خط فرمان ظاهر شده‌اند فعال می‌کند. دانستن مقادیر ارگونومیک تنظیم‌شده توسط JVM، مانند اندازه فضای هیپ و جمع‌آوری‌کننده زباله انتخاب‌شده، می‌تواند مفید باشد. به‌طور پیش‌فرض، این گزینه غیرفعال است و پرچم‌ها چاپ نمی‌شوند. .RS .RE .TP .B \f[CB]\-XX:+PreserveFramePointer\f[R] بین استفاده از ثبات RBP به‌عنوان یک ثبات عمومی (\f[CB]\-XX:\-PreserveFramePointer\f[R]) و استفاده از ثبات RBP برای نگهداری اشاره‌گر فریم متد در حال اجرای فعلی (\f[CB]\-XX:+PreserveFramePointer\f[R]) یکی را انتخاب می‌کند. اگر اشاره‌گر فریم در دسترس باشد، ابزارهای پروفایلینگ خارجی (مانند Linux perf) می‌توانند ردیابی‌های پشته دقیق‌تری بسازند. .RS .RE .TP .B \f[CB]\-XX:+PrintNMTStatistics\f[R] چاپ داده‌های جمع‌آوری‌شده ردگیری حافظه بومی را در زمان خروج JVM، زمانی که ردگیری حافظه بومی فعال است (به \f[CB]\-XX:NativeMemoryTracking\f[R] مراجعه کنید)، فعال می‌کند. به‌طور پیش‌فرض، این گزینه غیرفعال است و داده‌های ردگیری حافظه بومی چاپ نمی‌شوند. .RS .RE .TP .B \f[CB]\-XX:SharedArchiveFile=\f[R]\f[I]path\f[R] مسیر و نام فایل آرشیو اشتراک‌گذاری داده‌های کلاس (CDS) را مشخص می‌کند. .RS .PP به بخش \f[B]اشتراک‌گذاری داده‌های کلاس برنامه (Application Class Data Sharing)\f[R] مراجعه کنید. .RE .TP \f[V]-XX:+VerifySharedSpaces\f[R] اگر این گزینه مشخص شود، JVM یک فایل آرشیو CDS را تنها در صورتی بارگذاری می‌کند که بررسی یکپارچگی بر اساس چک‌سام‌های CRC32 را با موفقیت پشت سر بگذارد. هدف از این پرچم بررسی آسیب‌های ناخواسته به فایل‌های آرشیو CDS در حین انتقال یا ذخیره‌سازی است. برای تضمین امنیت و عملکرد صحیح CDS، کاربر باید اطمینان حاصل کند که فایل‌های آرشیو CDS مورد استفاده برنامه‌های جاوا بدون مجوز مناسب قابل تغییر نیستند. .TP .B \f[CB]\-XX:SharedArchiveConfigFile\f[R]=\f[I]shared_config_file\f[R] داده‌های اشتراکی اضافی اضافه شده به فایل آرشیو را مشخص می‌کند. .RS .RE .TP .B \f[CB]\-XX:SharedClassListFile=\f[R]\f[I]file_name\f[R] فایل متنی حاوی نام کلاس‌هایی را که باید در آرشیو اشتراک‌گذاری داده‌های کلاس (CDS) ذخیره شوند مشخص می‌کند. این فایل شامل نام کامل یک کلاس در هر خط است، با این تفاوت که اسلش (\f[CB]/\f[R]) جایگزین نقطه (\f[CB]\&.\f[R]) می‌شود. به‌عنوان مثال، برای مشخص کردن کلاس‌های \f[CB]java.lang.Object\f[R] و \f[CB]hello.Main\f[R]، یک فایل متنی حاوی دو خط زیر ایجاد کنید: .RS .IP .nf \f[CB] java/lang/Object hello/Main \f[R] .fi .PP کلاس‌هایی که در این فایل متنی مشخص می‌کنید باید شامل کلاس‌هایی باشند که معمولاً توسط برنامه استفاده می‌شوند. آن‌ها ممکن است شامل هر کلاسی از مسیرهای کلاس برنامه، افزونه یا بوت‌استرپ باشند. .PP به بخش \f[B]اشتراک‌گذاری داده‌های کلاس برنامه (Application Class Data Sharing)\f[R] مراجعه کنید. .RE .TP .B \f[CB]\-XX:+ShowCodeDetailsInExceptionMessages\f[R] چاپ پیام‌های بهبودیافته \f[CB]NullPointerException\f[R] را فعال می‌کند. هنگامی که یک برنامه استثنای \f[CB]NullPointerException\f[R] پرتاب می‌کند، این گزینه JVM را قادر می‌سازد تا دستورالعمل‌های بایت‌کد برنامه را تحلیل کند تا دقیقاً مشخص کند کدام ارجاع \f[CB]null\f[R] است، و منبع را با پیام جزئیات نال شرح می‌دهد. پیام جزئیات نال توسط \f[CB]NullPointerException.getMessage()\f[R] محاسبه و بازگردانده می‌شود و به‌عنوان پیام استثنا همراه با متد، نام فایل و شماره خط چاپ خواهد شد. به‌طور پیش‌فرض، این گزینه فعال است. .RS .RE .TP .B \f[CB]\-XX:+ShowMessageBoxOnError\f[R] نمایش کادر محاوره را در زمانی که JVM با یک خطای غیرقابل بازیابی مواجه می‌شود فعال می‌کند. این کار از خروج JVM جلوگیری کرده و فرایند را فعال نگه می‌دارد تا بتوانید یک اشکال‌زدا به آن متصل کنید و علت خطا را بررسی نمایید. به‌طور پیش‌فرض، این گزینه غیرفعال است. .RS .RE .TP .B \f[CB]\-XX:StartFlightRecording=\f[R]\f[I]parameter\f[R]\f[CB]=\f[R]\f[I]value\f[R] یک ضبط JFR را برای برنامه جاوا آغاز می‌کند. این گزینه معادل دستور تشخیصی \f[CB]JFR.start\f[R] است که ضبط را در زمان اجرا آغاز می‌کند. می‌توانید ورودی‌های \f[I]parameter\f[R]\f[CB]=\f[R]\f[I]value\f[R] زیر را هنگام شروع ضبط JFR تنظیم کنید: .RS .TP .B \f[CB]delay=\f[R]\f[I]time\f[R] تأخیر بین زمان راه‌اندازی برنامه جاوا و شروع ضبط را مشخص می‌کند. حرف \f[CB]s\f[R] را برای تعیین زمان به ثانیه، \f[CB]m\f[R] برای دقیقه، \f[CB]h\f[R] برای ساعت یا \f[CB]d\f[R] برای روز اضافه کنید (به‌عنوان مثال، مشخص کردن \f[CB]10m\f[R] به معنی 10 دقیقه است). به‌طور پیش‌فرض هیچ تأخیری وجود ندارد و این پارامتر روی 0 تنظیم شده است. .RS .RE .TP .B \f[CB]disk=\f[R]{\f[CB]true\f[R]|\f[CB]false\f[R]} مشخص می‌کند که آیا داده‌ها در حین ضبط روی دیسک نوشته شوند یا خیر. به‌طور پیش‌فرض، این پارامتر فعال است. .RS .RE .TP .B \f[CB]dumponexit=\f[R]{\f[CB]true\f[R]|\f[CB]false\f[R]} مشخص می‌کند که آیا ضبط در حال اجرا هنگام خاموش شدن JVM دامپ شود یا خیر. اگر فعال باشد و نام فایلی وارد نشده باشد، ضبط در فایلی در دایرکتوری که فرایند در آن شروع شده است نوشته می‌شود. نام فایل یک نام تولیدشده توسط سیستم است که حاوی شناسه فرایند، شناسه ضبط و برچسب زمانی فعلی است، مشابه \f[CB]hotspot\-pid\-47496\-id\-1\-2018_01_25_19_10_41.jfr\f[R]. به‌طور پیش‌فرض، این پارامتر غیرفعال است. .RS .RE .TP .B \f[CB]duration=\f[R]\f[I]time\f[R] مدت زمان ضبط را مشخص می‌کند. حرف \f[CB]s\f[R] را برای تعیین زمان به ثانیه، \f[CB]m\f[R] برای دقیقه، \f[CB]h\f[R] برای ساعت یا \f[CB]d\f[R] برای روز اضافه کنید (به‌عنوان مثال، مشخص کردن \f[CB]5h\f[R] به معنی 5 ساعت است). به‌طور پیش‌فرض، مدت زمان نامحدود است و این پارامتر روی 0 تنظیم شده است. .RS .RE .TP .B \f[CB]filename=\f[R]\f[I]path\f[R] مسیر و نام فایلی را که ضبط هنگام متوقف شدن در آن نوشته می‌شود مشخص می‌کند، به‌عنوان مثال: .RS .IP \[bu] 2 \f[CB]recording.jfr\f[R] .IP \[bu] 2 \f[CB]/home/user/recordings/recording.jfr\f[R] .IP \[bu] 2 \f[CB]c:\\recordings\\recording.jfr\f[R] .RE .TP .B \f[CB]name=\f[R]\f[I]identifier\f[R] هم نام و هم شناسه یک ضبط را دریافت می‌کند. .RS .RE .TP .B \f[CB]maxage=\f[R]\f[I]time\f[R] حداکثر سن داده‌های دیسک را برای نگهداری در ضبط مشخص می‌کند. این پارامتر تنها زمانی معتبر است که پارامتر \f[CB]disk\f[R] روی \f[CB]true\f[R] تنظیم شده باشد. حرف \f[CB]s\f[R] را برای تعیین زمان به ثانیه، \f[CB]m\f[R] برای دقیقه، \f[CB]h\f[R] برای ساعت یا \f[CB]d\f[R] برای روز اضافه کنید (به‌عنوان مثال، مشخص کردن \f[CB]30s\f[R] به معنی 30 ثانیه است). به‌طور پیش‌فرض، حداکثر سن نامحدود است و این پارامتر روی \f[CB]0s\f[R] تنظیم شده است. .RS .RE .TP .B \f[CB]maxsize=\f[R]\f[I]size\f[R] حداکثر اندازه (به بایت) داده‌های دیسک را برای نگهداری در ضبط مشخص می‌کند. این پارامتر تنها زمانی معتبر است که پارامتر \f[CB]disk\f[R] روی \f[CB]true\f[R] تنظیم شده باشد. این مقدار نباید کمتر از مقدار پارامتر \f[CB]maxchunksize\f[R] تنظیم‌شده با \f[CB]\-XX:FlightRecorderOptions\f[R] باشد. حرف \f[CB]m\f[R] یا \f[CB]M\f[R] را برای تعیین اندازه به مگابایت یا \f[CB]g\f[R] یا \f[CB]G\f[R] برای تعیین اندازه به گیگابایت اضافه کنید. به‌طور پیش‌فرض، حداکثر اندازه داده‌های دیسک نامحدود است و این پارامتر روی \f[CB]0\f[R] تنظیم شده است. .RS .RE .TP .B \f[CB]path\-to\-gc\-roots=\f[R]{\f[CB]true\f[R]|\f[CB]false\f[R]} مشخص می‌کند که آیا مسیر به ریشه‌های جمع‌آوری زباله (GC Roots) در پایان یک ضبط جمع‌آوری شود یا خیر. به‌طور پیش‌فرض، این پارامتر غیرفعال است. .RS .PP مسیر به ریشه‌های GC برای یافتن نشت‌های حافظه مفید است، اما جمع‌آوری آن زمان‌بر است. این گزینه را تنها زمانی فعال کنید که ضبطی را برای برنامه‌ای شروع می‌کنید که مشکوک به نشت حافظه است. اگر پارامتر \f[CB]settings\f[R] روی \f[CB]profile\f[R] تنظیم شده باشد، ردیابی پشته از جایی که شیء دارای نشت احتمالی در آن تخصیص یافته است در اطلاعات جمع‌آوری‌شده گنجانده می‌شود. .RE .TP .B \f[CB]settings=\f[R]\f[I]path\f[R] مسیر و نام فایل تنظیمات رویداد (از نوع JFC) را مشخص می‌کند. به‌طور پیش‌فرض، فایل \f[CB]default.jfc\f[R] استفاده می‌شود که در مسیر \f[CB]JAVA_HOME/lib/jfr\f[R] قرار دارد. این فایل تنظیمات پیش‌فرض مجموعه‌ای از پیش تعریف‌شده از اطلاعات را با بار اضافی کم جمع‌آوری می‌کند، بنابراین تأثیر حداقلی بر کارایی دارد و می‌تواند با ضبط‌هایی که به‌طور مداوم اجرا می‌شوند استفاده شود. .RS .PP یک فایل تنظیمات دوم نیز ارائه شده است، profile.jfc، که داده‌های بیشتری نسبت به پیکربندی پیش‌فرض فراهم می‌کند، اما می‌تواند بار اضافی بیشتری داشته و بر کارایی تأثیر بگذارد. از این پیکربندی برای دوره‌های زمانی کوتاه هنگامی که اطلاعات بیشتری مورد نیاز است استفاده کنید. .RE .PP می‌توانید مقادیر چندین پارامتر را با جدا کردن آن‌ها با کاما مشخص کنید. تنظیمات رویداد و گزینه‌های .jfc را می‌توان با استفاده از ساختار زیر مشخص کرد: .TP .B \f[CB]option=\f[R]\f[I]value\f[R] مقدار گزینه‌ای را برای اصلاح مشخص می‌کند. برای فهرست کردن گزینه‌های موجود، از ابزار \f[CB]JAVA_HOME\f[R]/bin/jfr استفاده کنید. .RS .RE .TP .B \f[CB]event\-setting\f[R]=\f[I]value\f[R] مقدار تنظیم رویداد را برای اصلاح مشخص می‌کند. از قالب: #= استفاده کنید. برای افزودن یک تنظیم رویداد جدید، نام رویداد را با \[aq]+\[aq] پیشوند دهید. .RS .RE .PP می‌توانید مقادیر چندین تنظیم رویداد و گزینه‌های .jfc را با جدا کردن آن‌ها با کاما مشخص کنید. در صورت تداخل بین یک پارامتر و یک گزینه .jfc، پارامتر اولویت خواهد داشت. جداکننده فضای خالی را می‌توان برای مقادیر بازه زمانی حذف کرد، مانند 20ms. برای اطلاعات بیشتر در مورد ساختار دستوری تنظیمات، به Javadoc بسته jdk.jfr مراجعه کنید. .RE .TP .B \f[CB]\-XX:ThreadStackSize=\f[R]\f[I]size\f[R] اندازه پشته نخ جاوا را (به کیلوبایت) تنظیم می‌کند. استفاده از پسوند مقیاس‌بندی مانند \f[CB]k\f[R] منجر به مقیاس‌بندی مقدار کیلوبایت می‌شود، بنابراین \f[CB]\-XX:ThreadStackSize=1k\f[R] اندازه پشته نخ جاوا را روی 1024*1024 بایت یا 1 مگابایت تنظیم می‌کند. مقدار پیش‌فرض به پلتفرم بستگی دارد: .RS .IP \[bu] 2 لینوکس/x64 (نسخه ۶۴ بیتی): 1024 کیلوبایت .IP \[bu] 2 مک macOS (نسخه ۶۴ بیتی): 1024 کیلوبایت .IP \[bu] 2 ویندوز: مقدار پیش‌فرض به حافظه مجازی بستگی دارد .PP مثال‌های زیر نحوه تنظیم اندازه پشته نخ را به 1 مگابایت با واحدهای مختلف نشان می‌دهند: .IP .nf \f[CB] \-XX:ThreadStackSize=1k \-XX:ThreadStackSize=1024 \f[R] .fi .PP این گزینه شبیه به \f[CB]\-Xss\f[R] است. .RE .TP .B \f[CB]\-XX:\-UseCompressedOops\f[R] استفاده از اشاره‌گرهای فشرده (Compressed OOPs) را غیرفعال می‌کند. به‌طور پیش‌فرض، این گزینه فعال است و از اشاره‌گرهای فشرده استفاده می‌شود. این کار به‌طور خودکار حداکثر اندازه هیپ جاوا تعیین‌شده به‌صورت ارگونومیک را به حداکثر مقدار حافظه‌ای که می‌تواند توسط اشاره‌گرهای فشرده پوشش داده شود محدود می‌کند. به‌طور پیش‌فرض این محدوده 32 گیگابایت است. .RS .PP با فعال بودن oops فشرده، ارجاعات اشیاء به جای اشاره‌گرهای 64 بیتی به‌عنوان آفست‌های 32 بیتی نمایش داده می‌شوند که معمولاً کارایی را هنگام اجرای برنامه با اندازه‌های هیپ جاوا کوچکتر از محدوده اشاره‌گر oops فشرده افزایش می‌دهد. این گزینه فقط برای JVMهای 64 بیتی کار می‌کند. .PP استفاده از اشاره‌گرهای فشرده با اندازه‌های هیپ جاوا بزرگتر از 32 گیگابایت امکان‌پذیر است. به گزینه \f[CB]\-XX:ObjectAlignmentInBytes\f[R] مراجعه کنید. .RE .TP .B \f[CB]\-XX:\-UseContainerSupport\f[R] ماشین مجازی اکنون پشتیبانی خودکار از تشخیص کانتینر را فراهم می‌کند که به VM امکان می‌دهد مقدار حافظه و تعداد پردازنده‌های موجود برای یک فرایند جاوا در حال اجرا در کانتینرهای داکر را تعیین کند. از این اطلاعات برای تخصیص منابع سیستم استفاده می‌کند. این پشتیبانی تنها در پلتفرم‌های لینوکس x64 در دسترس است. در صورت پشتیبانی، مقدار پیش‌فرض برای این پرچم \f[CB]true\f[R] است و پشتیبانی از کانتینر به‌طور پیش‌فرض فعال است. می‌توان آن را با \f[CB]\-XX:\-UseContainerSupport\f[R] غیرفعال کرد. .RS .PP لاگ یکپارچه (Unified Logging) برای کمک به تشخیص مشکلات مربوط به این پشتیبانی در دسترس است. .PP از \f[CB]\-Xlog:os+container=trace\f[R] برای حداکثر ثبت لاگ اطلاعات کانتینر استفاده کنید. برای شرح استفاده از لاگ یکپارچه، به بخش \f[B]فعال‌سازی لاگ با چارچوب لاگ یکپارچه JVM (Enable Logging with the JVM Unified Logging Framework)\f[R] مراجعه کنید. .RE .TP .B \f[CB]\-XX:+UseHugeTLBFS\f[R] \f[B]فقط در لینوکس:\f[R] این گزینه معادل مشخص کردن \f[CB]\-XX:+UseLargePages\f[R] است. این گزینه به‌طور پیش‌فرض غیرفعال است. این گزینه تمام صفحات بزرگ را از قبل، در زمان رزرو حافظه، پیش‌تخصیص می‌دهد؛ در نتیجه JVM نمی‌تواند نواحی حافظه صفحات بزرگ را به‌طور پویا رشد داده یا کوچک کند؛ اگر خواهان این رفتار هستید به \f[CB]\-XX:UseTransparentHugePages\f[R] مراجعه کنید. .RS .PP به بخش \f[B]صفحات بزرگ حافظه (Large Pages)\f[R] مراجعه کنید. .RE .TP .B \f[CB]\-XX:+UseLargePages\f[R] استفاده از حافظه صفحات بزرگ (Large Pages) را فعال می‌کند. به‌طور پیش‌فرض، این گزینه غیرفعال است و از حافظه صفحات بزرگ استفاده نمی‌شود. .RS .PP به بخش \f[B]صفحات بزرگ حافظه (Large Pages)\f[R] مراجعه کنید. .RE .TP .B \f[CB]\-XX:+UseTransparentHugePages\f[R] \f[B]فقط در لینوکس:\f[R] استفاده از صفحات بزرگی را که می‌توانند به‌طور پویا رشد کرده یا کوچک شوند فعال می‌کند. این گزینه به‌طور پیش‌فرض غیرفعال است. ممکن است با صفحات بزرگ شفاف (THP) با مشکلات کارایی مواجه شوید زیرا سیستم‌عامل صفحات دیگر را برای ایجاد صفحات بزرگ جابجا می‌کند؛ این گزینه برای آزمایش و تجربه فراهم شده است. .RS .RE .TP .B \f[CB]\-XX:+AllowUserSignalHandlers\f[R] نصب گرداننده‌های سیگنال توسط برنامه را فعال می‌کند. به‌طور پیش‌فرض، این گزینه غیرفعال است و برنامه مجاز به نصب گرداننده‌های سیگنال نیست. .RS .RE .TP .B \f[CB]\-XX:VMOptionsFile=\f[R]\f[I]filename\f[R] به کاربر اجازه می‌دهد گزینه‌های VM را در یک فایل مشخص کند، به‌عنوان مثال، \f[CB]java\ \-XX:VMOptionsFile=/var/my_vm_options\ HelloWorld\f[R]. .RS .RE .SH "گزینه‌های پیشرفته کامپایلر JIT برای جاوا (ADVANCED JIT COMPILER OPTIONS FOR JAVA)" .PP این گزینه‌های \f[CB]java\f[R] کامپایل پویا در زمان اجرا یا Just\-In\-Time (JIT) انجام‌شده توسط Java HotSpot VM را کنترل می‌کنند. .TP .B \f[CB]\-XX:AllocateInstancePrefetchLines=\f[R]\f[I]lines\f[R] تعداد خطوطی که باید جلوتر از اشاره‌گر تخصیص نمونه پیش‌واکشی شوند را تعیین می‌کند. به‌طور پیش‌فرض، تعداد خطوط برای پیش‌واکشی روی 1 تنظیم شده است: .RS .RS .PP \f[CB]\-XX:AllocateInstancePrefetchLines=1\f[R] .RE .RE .TP .B \f[CB]\-XX:AllocatePrefetchDistance=\f[R]\f[I]size\f[R] اندازه (به بایت) فاصله پیش‌واکشی را برای تخصیص شیء تعیین می‌کند. حافظه‌ای که قرار است با مقدار اشیاء جدید مقداردهی شود، تا این فاصله با شروع از نشانی آخرین شیء تخصیص‌یافته پیش‌واکشی می‌شود. هر ریسه جاوا نقطه تخصیص مخصوص به خود را دارد. .RS .PP مقادیر منفی نشان می‌دهند که فاصله پیش‌واکشی بر اساس بستر (پلتفرم) انتخاب می‌شود. مقادیر مثبت بایت‌های مورد نظر برای پیش‌واکشی هستند. حرف \f[CB]k\f[R] یا \f[CB]K\f[R] را برای مشخص کردن کیلوبایت، \f[CB]m\f[R] یا \f[CB]M\f[R] را برای مشخص کردن مگابایت، یا \f[CB]g\f[R] یا \f[CB]G\f[R] را برای مشخص کردن گیگابایت ضمیمه کنید. مقدار پیش‌فرض روی \-1 تنظیم شده است. .PP مثال زیر نحوه تنظیم فاصله پیش‌واکشی روی 1024 بایت را نشان می‌دهد: .RS .PP \f[CB]\-XX:AllocatePrefetchDistance=1024\f[R] .RE .RE .TP .B \f[CB]\-XX:AllocatePrefetchInstr=\f[R]\f[I]instruction\f[R] دستورالعمل پیش‌واکشی را برای پیش‌واکشی جلوتر از اشاره‌گر تخصیص تعیین می‌کند. مقادیر ممکن از 0 تا 3 هستند. دستورالعمل‌های واقعی پشت این مقادیر به بستر اجرایی بستگی دارند. به‌طور پیش‌فرض، دستورالعمل پیش‌واکشی روی 0 تنظیم شده است: .RS .RS .PP \f[CB]\-XX:AllocatePrefetchInstr=0\f[R] .RE .RE .TP .B \f[CB]\-XX:AllocatePrefetchLines=\f[R]\f[I]lines\f[R] تعداد خطوط حافظه پنهان (cache lines) را برای بارگذاری پس از آخرین تخصیص شیء، با استفاده از دستورالعمل‌های پیش‌واکشی تولیدشده در کد کامپایل‌شده تعیین می‌کند. مقدار پیش‌فرض اگر آخرین شیء تخصیص‌یافته یک نمونه باشد 1، و اگر یک آرایه باشد 3 است. .RS .PP مثال زیر نحوه تنظیم تعداد خطوط حافظه پنهان بارگذاری‌شده روی 5 را نشان می‌دهد: .RS .PP \f[CB]\-XX:AllocatePrefetchLines=5\f[R] .RE .RE .TP .B \f[CB]\-XX:AllocatePrefetchStepSize=\f[R]\f[I]size\f[R] اندازه گام (به بایت) را برای دستورالعمل‌های پیش‌واکشی متوالی تعیین می‌کند. حرف \f[CB]k\f[R] یا \f[CB]K\f[R] را برای مشخص کردن کیلوبایت، \f[CB]m\f[R] یا \f[CB]M\f[R] را برای مشخص کردن مگابایت، یا \f[CB]g\f[R] یا \f[CB]G\f[R] را برای مشخص کردن گیگابایت ضمیمه کنید. به‌طور پیش‌فرض، اندازه گام روی 16 بایت تنظیم شده است: .RS .RS .PP \f[CB]\-XX:AllocatePrefetchStepSize=16\f[R] .RE .RE .TP .B \f[CB]\-XX:AllocatePrefetchStyle=\f[R]\f[I]style\f[R] سبک کد تولیدشده برای دستورالعمل‌های پیش‌واکشی را تعیین می‌کند. آرگومان \f[I]style\f[R] یک عدد صحیح از 0 تا 3 است: .RS .TP .B \f[CB]0\f[R] دستورالعمل‌های پیش‌واکشی تولید نشوند. .RS .RE .TP .B \f[CB]1\f[R] دستورالعمل‌های پیش‌واکشی پس از هر تخصیص اجرا شوند. این تنظیم پیش‌فرض است. .RS .RE .TP .B \f[CB]2\f[R] استفاده از اشاره‌گر واترمارک بلوک تخصیص محلی ریسه (TLAB) برای تعیین زمان اجرای دستورالعمل‌های پیش‌واکشی. .RS .RE .TP .B \f[CB]3\f[R] تولید یک دستورالعمل پیش‌واکشی به ازای هر خط حافظه پنهان (cache line). .RS .RE .RE .TP .B \f[CB]\-XX:+BackgroundCompilation\f[R] کامپایل در پس‌زمینه را فعال می‌کند. این گزینه به‌طور پیش‌فرض فعال است. برای غیرفعال کردن کامپایل در پس‌زمینه، \f[CB]\-XX:\-BackgroundCompilation\f[R] را مشخص کنید (این کار معادل مشخص کردن \f[CB]\-Xbatch\f[R] است). .RS .RE .TP .B \f[CB]\-XX:CICompilerCount=\f[R]\f[I]threads\f[R] تعداد ریسه‌های کامپایلر را برای استفاده در کامپایل تعیین می‌کند. به‌طور پیش‌فرض، تعداد ریسه‌های کامپایلر بسته به تعداد CPUها و حافظه موجود برای کد کامپایل‌شده به‌طور خودکار انتخاب می‌شود. مثال زیر نحوه تنظیم تعداد ریسه‌ها روی 2 را نشان می‌دهد: .RS .RS .PP \f[CB]\-XX:CICompilerCount=2\f[R] .RE .RE .TP .B \f[CB]\-XX:+UseDynamicNumberOfCompilerThreads\f[R] ایجاد پویای ریسه‌های کامپایلر تا سقف تعیین‌شده توسط \f[CB]\-XX:CICompilerCount\f[R]. این گزینه به‌طور پیش‌فرض فعال است. .RS .RE .TP .B \f[CB]\-XX:CompileCommand=\f[R]\f[I]command\f[R]\f[CB],\f[R]\f[I]method\f[R][\f[CB],\f[R]\f[I]option\f[R]] یک \f[I]command\f[R] (دستور) را برای اجرا روی یک \f[I]method\f[R] (متد) مشخص می‌کند. برای مثال، برای مستثنی کردن متد \f[CB]indexOf()\f[R] از کلاس \f[CB]String\f[R] از کامپایل شدن، از دستور زیر استفاده کنید: .RS .RS .PP \f[CB]\-XX:CompileCommand=exclude,java/lang/String.indexOf\f[R] .RE .PP توجه داشته باشید که نام کامل کلاس، شامل تمام بسته‌ها و زیربسته‌ها که با اسلش (\f[CB]/\f[R]) جدا شده‌اند، مشخص می‌شود. برای سهولت در عملیات کپی و چسباندن (cut and paste)، می‌توان از فرمت نام متد تولیدشده توسط گزینه‌های \f[CB]\-XX:+PrintCompilation\f[R] و \f[CB]\-XX:+LogCompilation\f[R] نیز استفاده کرد: .RS .PP \f[CB]\-XX:CompileCommand=exclude,java.lang.String::indexOf\f[R] .RE .PP اگر متد بدون امضا (signature) مشخص شود، دستور روی تمام متدهای دارای نام مشخص‌شده اعمال می‌شود. با این حال، می‌توانید امضای متد را نیز در فرمت فایل کلاس مشخص کنید. در این حالت، باید آرگومان‌ها را درون علامت نقل‌قول (کوتیشن) قرار دهید، زیرا در غیر این صورت پوسته با نقطه\-ویرگول (سمیکالن) به عنوان پایان دستور رفتار می‌کند. برای مثال، اگر می‌خواهید فقط متد \f[CB]indexOf(String)\f[R] از کلاس \f[CB]String\f[R] را از کامپایل شدن مستثنی کنید، از دستور زیر استفاده کنید: .RS .PP \f[CB]\-XX:CompileCommand="exclude,java/lang/String.indexOf,(Ljava/lang/String;)I"\f[R] .RE .PP همچنین می‌توانید از علامت ستاره (*) به عنوان نویسه عام (wildcard) برای نام‌های کلاس و متد استفاده کنید. برای مثال، جهت مستثنی کردن تمام متدهای \f[CB]indexOf()\f[R] در تمام کلاس‌ها از کامپایل شدن، از دستور زیر استفاده کنید: .RS .PP \f[CB]\-XX:CompileCommand=exclude,*.indexOf\f[R] .RE .PP کاماها و نقطه‌ها نام مستعار برای فاصله‌ها (spaces) هستند، که انتقال دستورات کامپایلر را از طریق پوسته آسان‌تر می‌کنند. می‌توانید با استفاده از فاصله‌ها به عنوان جداکننده و با محصور کردن آرگومان در علامت نقل‌قول، آرگومان‌ها را به \f[CB]\-XX:CompileCommand\f[R] ارسال کنید: .RS .PP \f[CB]\-XX:CompileCommand="exclude\ java/lang/String\ indexOf"\f[R] .RE .PP توجه داشته باشید که کامپایلر JIT پس از تجزیه دستورات ارسالی در خط فرمان با استفاده از گزینه‌های \f[CB]\-XX:CompileCommand\f[R]، دستورات را از فایل \f[CB]\&.hotspot_compiler\f[R] می‌خواند. می‌توانید دستوراتی را به این فایل اضافه کنید یا با استفاده از گزینه \f[CB]\-XX:CompileCommandFile\f[R] فایل متفاوتی را مشخص نمایید. .PP برای افزودن چندین دستور، یا گزینه \f[CB]\-XX:CompileCommand\f[R] را چندین بار مشخص کنید، یا هر آرگومان را با جداکننده خط جدید (\f[CB]\\n\f[R]) جدا کنید. دستورات زیر در دسترس هستند: .TP .B \f[CB]break\f[R] یک نقطه توقف (breakpoint) را هنگام اشکال‌زدایی JVM تنظیم می‌کند تا در ابتدای کامپایل متد مشخص‌شده متوقف شود. .RS .RE .TP .B \f[CB]compileonly\f[R] تمام متدها را به جز متد مشخص‌شده از کامپایل مستثنی می‌کند. به عنوان جایگزین، می‌توانید از گزینه \f[CB]\-XX:CompileOnly\f[R] استفاده کنید که به شما امکان مشخص کردن چندین متد را می‌دهد. .RS .RE .TP .B \f[CB]dontinline\f[R] از درون‌خطی کردن (inlining) متد مشخص‌شده جلوگیری می‌کند. .RS .RE .TP .B \f[CB]exclude\f[R] متد مشخص‌شده را از کامپایل مستثنی می‌کند. .RS .RE .TP .B \f[CB]help\f[R] یک پیام راهنما برای گزینه \f[CB]\-XX:CompileCommand\f[R] چاپ می‌کند. .RS .RE .TP .B \f[CB]inline\f[R] برای درون‌خطی کردن متد مشخص‌شده تلاش می‌کند. .RS .RE .TP .B \f[CB]log\f[R] ثبت وقایع کامپایل (با گزینه \f[CB]\-XX:+LogCompilation\f[R]) را برای همه متدها به جز متد مشخص‌شده مستثنی می‌کند. به‌طور پیش‌فرض، ثبت وقایع برای تمام متدهای کامپایل‌شده انجام می‌شود. .RS .RE .TP .B \f[CB]option\f[R] یک گزینه کامپایل JIT را به جای آخرین آرگومان (\f[CB]option\f[R]) به متد مشخص‌شده ارسال می‌کند. گزینه کامپایل در انتها، پس از نام متد تنظیم می‌شود. برای مثال، جهت فعال کردن گزینه \f[CB]BlockLayoutByFrequency\f[R] برای متد \f[CB]append()\f[R] از کلاس \f[CB]StringBuffer\f[R]، از دستور زیر استفاده کنید: .RS .RS .PP \f[CB]\-XX:CompileCommand=option,java/lang/StringBuffer.append,BlockLayoutByFrequency\f[R] .RE .PP می‌توانید چندین گزینه کامپایل را با کاما یا فاصله جدا کرده و مشخص کنید. .RE .TP .B \f[CB]print\f[R] کد اسمبلی تولیدشده را پس از کامپایل متد مشخص‌شده چاپ می‌کند. .RS .RE .TP .B \f[CB]quiet\f[R] دستور می‌دهد که دستورات کامپایل چاپ نشوند. به‌طور پیش‌فرض، دستوراتی که با گزینه \f[CB]\-XX:CompileCommand\f[R] مشخص می‌کنید چاپ می‌شوند؛ برای مثال، اگر متد \f[CB]indexOf()\f[R] از کلاس \f[CB]String\f[R] را از کامپایل مستثنی کنید، عبارت زیر در خروجی استاندارد چاپ می‌شود: .RS .RS .PP \f[CB]CompilerOracle:\ exclude\ java/lang/String.indexOf\f[R] .RE .PP می‌توانید با مشخص کردن گزینه \f[CB]\-XX:CompileCommand=quiet\f[R] قبل از سایر گزینه‌های \f[CB]\-XX:CompileCommand\f[R]، از این چاپ جلوگیری کنید. .RE .RE .TP .B \f[CB]\-XX:CompileCommandFile=\f[R]\f[I]filename\f[R] فایلی را که دستورات کامپایلر JIT از آن خوانده می‌شوند تعیین می‌کند. به‌طور پیش‌فرض، فایل \f[CB]\&.hotspot_compiler\f[R] برای ذخیره دستورات اجراشده توسط کامپایلر JIT استفاده می‌شود. .RS .PP هر خط در فایل دستورات، نشان‌دهنده یک دستور، نام کلاس و نام متدی است که دستور برای آن استفاده می‌شود. برای مثال، این خط کد اسمبلی را برای متد \f[CB]toString()\f[R] از کلاس \f[CB]String\f[R] چاپ می‌کند: .RS .PP \f[CB]print\ java/lang/String\ toString\f[R] .RE .PP اگر از دستوراتی برای اجرای کامپایلر JIT روی متدها استفاده می‌کنید، گزینه \f[CB]\-XX:CompileCommand\f[R] را مشاهده کنید. .RE .TP .B \f[CB]\-XX:CompilerDirectivesFile=\f[R]\f[I]file\f[R] دستورالعمل‌ها (directives) را از یک فایل هنگام شروع برنامه به پشته دستورالعمل‌ها اضافه می‌کند. مشاهده کنید: \f[B]کنترل کامپایلر (Compiler Control)\f[R] [https://docs.oracle.com/en/java/javase/12/vm/compiler\-control1.html#GUID\-94AD8194\-786A\-4F19\-BFFF\-278F8E237F3A]. .RS .PP گزینه \f[CB]\-XX:CompilerDirectivesFile\f[R] باید همراه با گزینه \f[CB]\-XX:UnlockDiagnosticVMOptions\f[R] که گزینه‌های تشخیصی JVM را باز می‌کند، استفاده شود. .RE .TP .B \f[CB]\-XX:+CompilerDirectivesPrint\f[R] پشته دستورالعمل‌ها را هنگام شروع برنامه یا هنگامی که دستورالعمل جدیدی اضافه می‌شود چاپ می‌کند. .RS .PP گزینه \f[CB]\-XX:+CompilerDirectivesPrint\f[R] باید همراه با گزینه \f[CB]\-XX:UnlockDiagnosticVMOptions\f[R] که گزینه‌های تشخیصی JVM را باز می‌کند، استفاده شود. .RE .TP .B \f[CB]\-XX:CompileOnly=\f[R]\f[I]methods\f[R] فهرست متدهایی (جداشده با کاما) را که کامپایل باید به آن‌ها محدود شود تعیین می‌کند. فقط متدهای مشخص‌شده کامپایل می‌شوند. هر متد را با نام کامل کلاس (شامل بسته‌ها و زیربسته‌ها) مشخص کنید. برای مثال، برای کامپایل فقط متد \f[CB]length()\f[R] از کلاس \f[CB]String\f[R] و متد \f[CB]size()\f[R] از کلاس \f[CB]List\f[R]، از دستور زیر استفاده کنید: .RS .RS .PP \f[CB]\-XX:CompileOnly=java/lang/String.length,java/util/List.size\f[R] .RE .PP توجه داشته باشید که نام کامل کلاس، شامل تمام بسته‌ها و زیربسته‌ها که با اسلش (\f[CB]/\f[R]) جدا شده‌اند، مشخص می‌شود. برای سهولت در عملیات کپی و چسباندن، می‌توان از فرمت نام متد تولیدشده توسط گزینه‌های \f[CB]\-XX:+PrintCompilation\f[R] و \f[CB]\-XX:+LogCompilation\f[R] نیز استفاده کرد: .RS .PP \f[CB]\-XX:CompileOnly=java.lang.String::length,java.util.List::size\f[R] .RE .PP اگرچه از نویسه‌های عام (wildcards) پشتیبانی نمی‌شود، اما می‌توانید فقط نام کلاس یا بسته را برای کامپایل تمام متدهای آن کلاس یا بسته مشخص کنید، و همچنین می‌توانید فقط متد را مشخص کنید تا متدهای دارای این نام در هر کلاسی کامپایل شوند: .IP .nf \f[CB] \-XX:CompileOnly=java/lang/String \-XX:CompileOnly=java/lang \-XX:CompileOnly=.length \f[R] .fi .RE .TP .B \f[CB]\-XX:CompileThresholdScaling=\f[R]\f[I]scale\f[R] کنترل یکپارچه‌ای بر اولین کامپایل فراهم می‌کند. این گزینه زمان اولین کامپایل متدها را برای هر دو حالت عملیاتی لایه‌ای (tiered) و غیرلایه‌ای (nontiered) کنترل می‌کند. گزینه \f[CB]CompileThresholdScaling\f[R] یک مقدار ممیز شناور بین 0 و +Inf دارد و آستانه‌های متناظر با حالت عملیاتی جاری (هم لایه‌ای و هم غیرلایه‌ای) را مقیاس‌بندی می‌کند. تنظیم \f[CB]CompileThresholdScaling\f[R] روی مقداری کمتر از 1.0 منجر به کامپایل زودهنگام‌تر می‌شود در حالی که مقادیر بزرگتر از 1.0 کامپایل را به تاخیر می‌اندازند. تنظیم \f[CB]CompileThresholdScaling\f[R] روی 0 معادل غیرفعال کردن کامپایل است. .RS .RE .TP .B \f[CB]\-XX:+DoEscapeAnalysis\f[R] استفاده از تحلیل گریز (escape analysis) را فعال می‌کند. این گزینه به‌طور پیش‌فرض فعال است. برای غیرفعال کردن تحلیل گریز، \f[CB]\-XX:\-DoEscapeAnalysis\f[R] را مشخص کنید. .RS .RE .TP .B \f[CB]\-XX:InitialCodeCacheSize=\f[R]\f[I]size\f[R] اندازه اولیه حافظه پنهان کد (code cache) را (به بایت) تعیین می‌کند. حرف \f[CB]k\f[R] یا \f[CB]K\f[R] را برای مشخص کردن کیلوبایت، \f[CB]m\f[R] یا \f[CB]M\f[R] را برای مشخص کردن مگابایت، یا \f[CB]g\f[R] یا \f[CB]G\f[R] را برای مشخص کردن گیگابایت ضمیمه کنید. مقدار پیش‌فرض به بستر اجرایی بستگی دارد. اندازه اولیه حافظه پنهان کد نباید کمتر از کمینه اندازه صفحه حافظه سیستم باشد. مثال زیر نحوه تنظیم اندازه اولیه حافظه پنهان کد روی 32 کیلوبایت را نشان می‌دهد: .RS .RS .PP \f[CB]\-XX:InitialCodeCacheSize=32k\f[R] .RE .RE .TP .B \f[CB]\-XX:+Inline\f[R] درون‌خطی‌سازی متدها (method inlining) را فعال می‌کند. این گزینه برای افزایش کارایی به‌طور پیش‌فرض فعال است. برای غیرفعال کردن درون‌خطی‌سازی متدها، \f[CB]\-XX:\-Inline\f[R] را مشخص کنید. .RS .RE .TP .B \f[CB]\-XX:InlineSmallCode=\f[R]\f[I]size\f[R] حداکثر اندازه کد (به بایت) را برای متدهای از قبل کامپایل‌شده که ممکن است درون‌خطی شوند، تعیین می‌کند. این فلگ فقط برای کامپایلر C2 اعمال می‌شود. حرف \f[CB]k\f[R] یا \f[CB]K\f[R] را برای مشخص کردن کیلوبایت، \f[CB]m\f[R] یا \f[CB]M\f[R] را برای مشخص کردن مگابایت، یا \f[CB]g\f[R] یا \f[CB]G\f[R] را برای مشخص کردن گیگابایت ضمیمه کنید. مقدار پیش‌فرض به بستر اجرایی و اینکه آیا کامپایل لایه‌ای فعال است یا خیر بستگی دارد. در مثال زیر روی 1000 بایت تنظیم شده است: .RS .RS .PP \f[CB]\-XX:InlineSmallCode=1000\f[R] .RE .RE .TP .B \f[CB]\-XX:+LogCompilation\f[R] ثبت وقایع فعالیت‌های کامپایل را در فایلی به نام \f[CB]hotspot.log\f[R] در دایرکتوری کاری جاری فعال می‌کند. می‌توانید با استفاده از گزینه \f[CB]\-XX:LogFile\f[R] مسیر و نام متفاوتی برای فایل لاگ مشخص کنید. .RS .PP به‌طور پیش‌فرض، این گزینه غیرفعال است و فعالیت کامپایل ثبت نمی‌شود. گزینه \f[CB]\-XX:+LogCompilation\f[R] باید همراه با گزینه \f[CB]\-XX:UnlockDiagnosticVMOptions\f[R] که گزینه‌های تشخیصی JVM را باز می‌کند، استفاده شود. .PP می‌توانید با استفاده از گزینه \f[CB]\-XX:+PrintCompilation\f[R]، خروجی تشخیصی با جزئیات را با پیامی که در هر بار کامپایل یک متد در کنسول چاپ می‌شود فعال کنید. .RE .TP .B \f[CB]\-XX:FreqInlineSize=\f[R]\f[I]size\f[R] حداکثر اندازه بایت‌کد (به بایت) یک متد پرکاربرد (hot method) را برای درون‌خطی شدن تعیین می‌کند. این فلگ فقط برای کامپایلر C2 اعمال می‌شود. حرف \f[CB]k\f[R] یا \f[CB]K\f[R] را برای مشخص کردن کیلوبایت، \f[CB]m\f[R] یا \f[CB]M\f[R] را برای مشخص کردن مگابایت، یا \f[CB]g\f[R] یا \f[CB]G\f[R] را برای مشخص کردن گیگابایت ضمیمه کنید. مقدار پیش‌فرض به بستر اجرایی بستگی دارد. در مثال زیر روی 325 بایت تنظیم شده است: .RS .RS .PP \f[CB]\-XX:FreqInlineSize=325\f[R] .RE .RE .TP .B \f[CB]\-XX:MaxInlineSize=\f[R]\f[I]size\f[R] حداکثر اندازه بایت‌کد (به بایت) یک متد کم‌کاربرد (cold method) را برای درون‌خطی شدن تعیین می‌کند. این فلگ فقط برای کامپایلر C2 اعمال می‌شود. حرف \f[CB]k\f[R] یا \f[CB]K\f[R] را برای مشخص کردن کیلوبایت، \f[CB]m\f[R] یا \f[CB]M\f[R] را برای مشخص کردن مگابایت، یا \f[CB]g\f[R] یا \f[CB]G\f[R] را برای مشخص کردن گیگابایت ضمیمه کنید. به‌طور پیش‌فرض، حداکثر اندازه بایت‌کد روی 35 بایت تنظیم شده است: .RS .RS .PP \f[CB]\-XX:MaxInlineSize=35\f[R] .RE .RE .TP .B \f[CB]\-XX:C1MaxInlineSize=\f[R]\f[I]size\f[R] حداکثر اندازه بایت‌کد (به بایت) یک متد کم‌کاربرد را برای درون‌خطی شدن تعیین می‌کند. این فلگ فقط برای کامپایلر C1 اعمال می‌شود. حرف \f[CB]k\f[R] یا \f[CB]K\f[R] را برای مشخص کردن کیلوبایت، \f[CB]m\f[R] یا \f[CB]M\f[R] را برای مشخص کردن مگابایت، یا \f[CB]g\f[R] یا \f[CB]G\f[R] را برای مشخص کردن گیگابایت ضمیمه کنید. به‌طور پیش‌فرض، حداکثر اندازه بایت‌کد روی 35 بایت تنظیم شده است: .RS .RS .PP \f[CB]\-XX:MaxInlineSize=35\f[R] .RE .RE .TP .B \f[CB]\-XX:MaxTrivialSize=\f[R]\f[I]size\f[R] حداکثر اندازه بایت‌کد (به بایت) یک متد جزئی و ساده (trivial method) را برای درون‌خطی شدن تعیین می‌کند. این فلگ فقط برای کامپایلر C2 اعمال می‌شود. حرف \f[CB]k\f[R] یا \f[CB]K\f[R] را برای مشخص کردن کیلوبایت، \f[CB]m\f[R] یا \f[CB]M\f[R] را برای مشخص کردن مگابایت، یا \f[CB]g\f[R] یا \f[CB]G\f[R] را برای مشخص کردن گیگابایت ضمیمه کنید. به‌طور پیش‌فرض، حداکثر اندازه بایت‌کد یک متد جزئی روی 6 بایت تنظیم شده است: .RS .RS .PP \f[CB]\-XX:MaxTrivialSize=6\f[R] .RE .RE .TP .B \f[CB]\-XX:C1MaxTrivialSize=\f[R]\f[I]size\f[R] حداکثر اندازه بایت‌کد (به بایت) یک متد جزئی و ساده را برای درون‌خطی شدن تعیین می‌کند. این فلگ فقط برای کامپایلر C1 اعمال می‌شود. حرف \f[CB]k\f[R] یا \f[CB]K\f[R] را برای مشخص کردن کیلوبایت، \f[CB]m\f[R] یا \f[CB]M\f[R] را برای مشخص کردن مگابایت، یا \f[CB]g\f[R] یا \f[CB]G\f[R] را برای مشخص کردن گیگابایت ضمیمه کنید. به‌طور پیش‌فرض، حداکثر اندازه بایت‌کد یک متد جزئی روی 6 بایت تنظیم شده است: .RS .RS .PP \f[CB]\-XX:MaxTrivialSize=6\f[R] .RE .RE .TP .B \f[CB]\-XX:MaxNodeLimit=\f[R]\f[I]nodes\f[R] حداکثر تعداد گره‌هایی را که در طول کامپایل یک متد منفرد استفاده می‌شوند تعیین می‌کند. به‌طور پیش‌فرض این مقدار به قابلیت‌های فعال‌شده بستگی دارد. در مثال زیر حداکثر تعداد گره‌ها روی 100,000 تنظیم شده است: .RS .RS .PP \f[CB]\-XX:MaxNodeLimit=100000\f[R] .RE .RE .TP .B \f[CB]\-XX:NonNMethodCodeHeapSize=\f[R]\f[I]size\f[R] اندازه (به بایت) بخش کدی شامل کدهای غیرمتد (nonmethod code) را تعیین می‌کند. .RS .PP یک بخش کد غیرمتد شامل کدهایی مانند بافرهای کامپایلر و مفسر بایت‌کد است. این نوع کد برای همیشه در حافظه پنهان کد باقی می‌ماند. این فلگ فقط در صورتی استفاده می‌شود که \f[CB]\-XX:SegmentedCodeCache\f[R] فعال باشد. .RE .TP .B \f[CB]\-XX:NonProfiledCodeHeapSize=\f[R]\f[I]size\f[R] اندازه (به بایت) بخش کدی شامل متدهای پروفایل‌نشده (nonprofiled) را تعیین می‌کند. این فلگ فقط در صورتی استفاده می‌شود که \f[CB]\-XX:SegmentedCodeCache\f[R] فعال باشد. .RS .RE .TP .B \f[CB]\-XX:+OptimizeStringConcat\f[R] بهینه‌سازی عملیات الحاق (concatenation) رشته \f[CB]String\f[R] را فعال می‌کند. این گزینه به‌طور پیش‌فرض فعال است. برای غیرفعال کردن بهینه‌سازی عملیات الحاق \f[CB]String\f[R]، \f[CB]\-XX:\-OptimizeStringConcat\f[R] را مشخص کنید. .RS .RE .TP .B \f[CB]\-XX:+PrintAssembly\f[R] چاپ کد اسمبلی را برای متدهای بایت‌کدی و بومی (native) با استفاده از کتابخانه خارجی \f[CB]hsdis\-.so\f[R] یا \f[CB]\&.dll\f[R] فعال می‌کند. برای ماشین مجازی 64 بیتی در ویندوز، این کتابخانه \f[CB]hsdis\-amd64.dll\f[R] است. این گزینه به شما امکان می‌دهد کد تولیدشده را مشاهده کنید، که ممکن است به شما در عیب‌یابی مشکلات کارایی کمک کند. .RS .PP به‌طور پیش‌فرض، این گزینه غیرفعال است و کد اسمبلی چاپ نمی‌شود. گزینه \f[CB]\-XX:+PrintAssembly\f[R] باید همراه با گزینه \f[CB]\-XX:UnlockDiagnosticVMOptions\f[R] که گزینه‌های تشخیصی JVM را باز می‌کند، استفاده شود. .RE .TP .B \f[CB]\-XX:ProfiledCodeHeapSize=\f[R]\f[I]size\f[R] اندازه (به بایت) بخش کدی شامل متدهای پروفایل‌شده (profiled) را تعیین می‌کند. این فلگ فقط در صورتی استفاده می‌شود که \f[CB]\-XX:SegmentedCodeCache\f[R] فعال باشد. .RS .RE .TP .B \f[CB]\-XX:+PrintCompilation\f[R] خروجی تشخیصی پرجزئیات از JVM را با چاپ پیامی در کنسول در هر بار کامپایل یک متد فعال می‌کند. این گزینه به شما امکان می‌دهد ببینید کدام متدها واقعاً کامپایل می‌شوند. به‌طور پیش‌فرض، این گزینه غیرفعال است و خروجی تشخیصی چاپ نمی‌شود. .RS .PP همچنین می‌توانید فعالیت کامپایل را با استفاده از گزینه \f[CB]\-XX:+LogCompilation\f[R] در یک فایل ثبت کنید. .RE .TP .B \f[CB]\-XX:+PrintInlining\f[R] چاپ تصمیمات مربوط به درون‌خطی‌سازی (inlining) را فعال می‌کند. این گزینه به شما امکان می‌دهد ببینید کدام متدها درون‌خطی می‌شوند. .RS .PP به‌طور پیش‌فرض، این گزینه غیرفعال است و اطلاعات درون‌خطی‌سازی چاپ نمی‌شود. گزینه \f[CB]\-XX:+PrintInlining\f[R] باید همراه با گزینه \f[CB]\-XX:+UnlockDiagnosticVMOptions\f[R] که گزینه‌های تشخیصی JVM را باز می‌کند، استفاده شود. .RE .TP .B \f[CB]\-XX:ReservedCodeCacheSize=\f[R]\f[I]size\f[R] حداکثر اندازه حافظه پنهان کد (به بایت) را برای کدهای کامپایل‌شده توسط JIT تعیین می‌کند. حرف \f[CB]k\f[R] یا \f[CB]K\f[R] را برای مشخص کردن کیلوبایت، \f[CB]m\f[R] یا \f[CB]M\f[R] را برای مشخص کردن مگابایت، یا \f[CB]g\f[R] یا \f[CB]G\f[R] را برای مشخص کردن گیگابایت ضمیمه کنید. حداکثر اندازه پیش‌فرض حافظه پنهان کد 240 مگابایت است؛ اگر کامپایل لایه‌ای را با گزینه \f[CB]\-XX:\-TieredCompilation\f[R] غیرفعال کنید، اندازه پیش‌فرض 48 مگابایت خواهد بود. این گزینه دارای سقف 2 گیگابایت است؛ در غیر این صورت، خطا ایجاد می‌شود. حداکثر اندازه حافظه پنهان کد نباید کمتر از اندازه اولیه آن باشد؛ گزینه \f[CB]\-XX:InitialCodeCacheSize\f[R] را ببینید. .RS .RE .TP .B \f[CB]\-XX:RTMAbortRatio=\f[R]\f[I]abort_ratio\f[R] نسبت سقط (abort ratio) تراکنش RTM را به صورت درصدی (%) از کل تراکنش‌های RTM اجراشده مشخص می‌کند. اگر تعداد تراکنش‌های سقط‌شده بیشتر از این نسبت شود، کد کامپایل‌شده بهینه‌زدایی (deoptimized) می‌شود. این نسبت زمانی استفاده می‌شود که گزینه \f[CB]\-XX:+UseRTMDeopt\f[R] فعال باشد. مقدار پیش‌فرض این گزینه 50 است. این بدان معناست که اگر 50% از تمام تراکنش‌ها سقط شوند، کد کامپایل‌شده بهینه‌زدایی می‌شود. .RS .RE .TP .B \f[CB]\-XX:RTMRetryCount=\f[R]\f[I]number_of_retries\f[R] تعداد دفعاتی را که تلاش مجدد برای کد قفل‌گذاری RTM (هنگام سقط یا مشغول بودن) پیش از بازگشت به مکانیسم قفل‌گذاری عادی انجام می‌شود، مشخص می‌کند. مقدار پیش‌فرض این گزینه 5 است. گزینه \f[CB]\-XX:UseRTMLocking\f[R] باید فعال باشد. .RS .RE .TP .B \f[CB]\-XX:+SegmentedCodeCache\f[R] تقسیم‌بندی حافظه پنهان کد (code cache segmentation) را فعال می‌کند. بدون \f[CB]\-XX:+SegmentedCodeCache\f[R]، حافظه پنهان کد از یک بخش بزرگ تشکیل شده است. با \f[CB]\-XX:+SegmentedCodeCache\f[R]، بخش‌های جداگانه‌ای برای کدهای غیرمتد، متدهای پروفایل‌شده و متدهای پروفایل‌نشده داریم. اندازه این بخش‌ها در زمان اجرا تغییر نمی‌کند. اگر کامپایل لایه‌ای فعال باشد (\f[CB]\-XX:+TieredCompilation\f[R]) و \f[CB]\-XX:ReservedCodeCacheSize\f[R] >= 240 MB باشد، این قابلیت به‌طور پیش‌فرض فعال است. مزایای آن کنترل بهتر ردپای حافظه، کاهش تکه‌تکه شدن کد (fragmentation) و رفتار بهتر iTLB/iCache به دلیل بهبود محلی‌سازی (locality) است. عبارت iTLB/iCache اصطلاحی مخصوص CPU است که به معنای بافر ترجمه نگاه به کنار دستورالعمل (ITLB) است. عبارت ICache حافظه پنهان دستورالعمل در CPU است. پیاده‌سازی حافظه پنهان کد را می‌توانید در فایل زیر بیابید: \f[CB]/share/vm/code/codeCache.cpp\f[R]. .RS .RE .TP .B \f[CB]\-XX:StartAggressiveSweepingAt=\f[R]\f[I]percent\f[R] هنگامی که فقط درصد مشخص‌شده‌ای از حافظه پنهان کد آزاد است، پیمایش پشته متدهای فعال را برای حذف تهاجمی کدهای استفاده‌نشده تحمیل می‌کند. مقدار پیش‌فرض 10% است. .RS .RE .TP .B \f[CB]\-XX:\-TieredCompilation\f[R] استفاده از کامپایل لایه‌ای (tiered compilation) را غیرفعال می‌کند. به‌طور پیش‌فرض، این گزینه فعال است. .RS .RE .TP .B \f[CB]\-XX:UseSSE=\f[R]\f[I]version\f[R] استفاده از مجموعه دستورالعمل‌های SSE با نگارش مشخص‌شده را فعال می‌کند. به‌طور پیش‌فرض روی بالاترین نگارش پشتیبانی‌شده موجود تنظیم است (فقط x86). .RS .RE .TP .B \f[CB]\-XX:UseAVX=\f[R]\f[I]version\f[R] استفاده از مجموعه دستورالعمل‌های AVX با نگارش مشخص‌شده را فعال می‌کند. به‌طور پیش‌فرض روی بالاترین نگارش پشتیبانی‌شده موجود تنظیم است (فقط x86). .RS .RE .TP .B \f[CB]\-XX:+UseAES\f[R] توابع درونی (intrinsics) رمزنگاری AES مبتنی بر سخت‌افزار را برای سخت‌افزارهایی که از آن پشتیبانی می‌کنند فعال می‌کند. این گزینه در سخت‌افزارهایی که دستورالعمل‌های لازم را دارند به‌طور پیش‌فرض روشن است. گزینه \f[CB]\-XX:+UseAES\f[R] در ترکیب با UseAESIntrinsics استفاده می‌شود. فلگ‌هایی که توابع درونی را کنترل می‌کنند اکنون نیازمند گزینه \f[CB]\-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .RS .RE .TP .B \f[CB]\-XX:+UseAESIntrinsics\f[R] توابع درونی AES را فعال می‌کند. مشخص کردن \f[CB]\-XX:+UseAESIntrinsics\f[R] معادل فعال کردن \f[CB]\-XX:+UseAES\f[R] نیز هست. برای غیرفعال کردن توابع درونی AES مبتنی بر سخت‌افزار، \f[CB]\-XX:\-UseAES\ \-XX:\-UseAESIntrinsics\f[R] را مشخص کنید. برای مثال، جهت فعال کردن AES سخت‌افزاری، از فلگ‌های زیر استفاده کنید: .RS .RS .PP \f[CB]\-XX:+UseAES\ \-XX:+UseAESIntrinsics\f[R] .RE .PP فلگ‌هایی که توابع درونی را کنترل می‌کنند اکنون نیازمند گزینه \f[CB]\-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .RE .TP .B \f[CB]\-XX:+UseAESCTRIntrinsics\f[R] مشابه با \f[CB]\-XX:+UseAESIntrinsics\f[R] توابع درونی AES/CTR را فعال می‌کند. .RS .RE .TP .B \f[CB]\-XX:+UseGHASHIntrinsics\f[R] استفاده از توابع درونی GHASH را کنترل می‌کند. به‌طور پیش‌فرض در بسترهایی که از دستورالعمل‌های مربوطه پشتیبانی می‌کنند فعال است. فلگ‌هایی که توابع درونی را کنترل می‌کنند اکنون نیازمند گزینه \f[CB]\-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .RS .RE .TP .B \f[CB]\-XX:+UseBASE64Intrinsics\f[R] استفاده از روال‌های شتاب‌یافته رمزگذاری BASE64 را برای \f[CB]java.util.Base64\f[R] کنترل می‌کند. به‌طور پیش‌فرض در بسترهایی که از آن پشتیبانی می‌کنند فعال است. فلگ‌هایی که توابع درونی را کنترل می‌کنند اکنون نیازمند گزینه \f[CB]\-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .RS .RE .TP .B \f[CB]\-XX:+UseAdler32Intrinsics\f[R] استفاده از تابع درونی الگوریتم چکسام Adler32 را برای \f[CB]java.util.zip.Adler32\f[R] کنترل می‌کند. به‌طور پیش‌فرض در بسترهایی که از آن پشتیبانی می‌کنند فعال است. فلگ‌هایی که توابع درونی را کنترل می‌کنند اکنون نیازمند گزینه \f[CB]\-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .RS .RE .TP .B \f[CB]\-XX:+UseCRC32Intrinsics\f[R] استفاده از توابع درونی CRC32 را برای \f[CB]java.util.zip.CRC32\f[R] کنترل می‌کند. به‌طور پیش‌فرض در بسترهایی که از آن پشتیبانی می‌کنند فعال است. فلگ‌هایی که توابع درونی را کنترل می‌کنند اکنون نیازمند گزینه \f[CB]\-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .RS .RE .TP .B \f[CB]\-XX:+UseCRC32CIntrinsics\f[R] استفاده از توابع درونی CRC32C را برای \f[CB]java.util.zip.CRC32C\f[R] کنترل می‌کند. به‌طور پیش‌فرض در بسترهایی که از آن پشتیبانی می‌کنند فعال است. فلگ‌هایی که توابع درونی را کنترل می‌کنند اکنون نیازمند گزینه \f[CB]\-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .RS .RE .TP .B \f[CB]\-XX:+UseSHA\f[R] توابع درونی مبتنی بر سخت‌افزار را برای توابع درهم‌سازی رمزنگاری SHA در برخی سخت‌افزارها فعال می‌کند. گزینه \f[CB]UseSHA\f[R] در ترکیب با گزینه‌های \f[CB]UseSHA1Intrinsics\f[R]، \f[CB]UseSHA256Intrinsics\f[R] و \f[CB]UseSHA512Intrinsics\f[R] استفاده می‌شود. .RS .PP فلگ‌های \f[CB]UseSHA\f[R] و \f[CB]UseSHA*Intrinsics\f[R] به‌طور پیش‌فرض روی ماشین‌هایی که از دستورالعمل‌های مربوطه پشتیبانی می‌کنند فعال هستند. .PP این قابلیت تنها هنگام استفاده از ارائه‌دهنده \f[CB]sun.security.provider.Sun\f[R] برای عملیات SHA قابل اعمال است. فلگ‌هایی که توابع درونی را کنترل می‌کنند اکنون نیازمند گزینه \f[CB]\-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .PP برای غیرفعال کردن تمام توابع درونی SHA مبتنی بر سخت‌افزار، \f[CB]\-XX:\-UseSHA\f[R] را مشخص کنید. برای غیرفعال کردن تنها یک تابع درونی خاص SHA، از گزینه متناظر مناسب استفاده کنید. برای مثال: \f[CB]\-XX:\-UseSHA256Intrinsics\f[R]. .RE .TP .B \f[CB]\-XX:+UseSHA1Intrinsics\f[R] توابع درونی را برای تابع درهم‌سازی رمزنگاری SHA\-1 فعال می‌کند. فلگ‌هایی که توابع درونی را کنترل می‌کنند اکنون نیازمند گزینه \f[CB]\-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .RS .RE .TP .B \f[CB]\-XX:+UseSHA256Intrinsics\f[R] توابع درونی را برای توابع درهم‌سازی رمزنگاری SHA\-224 و SHA\-256 فعال می‌کند. فلگ‌هایی که توابع درونی را کنترل می‌کنند اکنون نیازمند گزینه \f[CB]\-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .RS .RE .TP .B \f[CB]\-XX:+UseSHA512Intrinsics\f[R] توابع درونی را برای توابع درهم‌سازی رمزنگاری SHA\-384 و SHA\-512 فعال می‌کند. فلگ‌هایی که توابع درونی را کنترل می‌کنند اکنون نیازمند گزینه \f[CB]\-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .RS .RE .TP .B \f[CB]\-XX:+UseMathExactIntrinsics\f[R] درونی‌سازی (intrinsification) توابع مختلف \f[CB]java.lang.Math.*Exact()\f[R] را فعال می‌کند. به‌طور پیش‌فرض فعال است. فلگ‌هایی که توابع درونی را کنترل می‌کنند اکنون نیازمند گزینه \f[CB]\-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .RS .RE .TP .B \f[CB]\-XX:+UseMultiplyToLenIntrinsic\f[R] درونی‌سازی \f[CB]BigInteger.multiplyToLen()\f[R] را فعال می‌کند. به‌طور پیش‌فرض در بسترهایی که از آن پشتیبانی می‌کنند فعال است. فلگ‌هایی که توابع درونی را کنترل می‌کنند اکنون نیازمند گزینه \f[CB]\-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .RS .RE .TP .B \-XX:+UseSquareToLenIntrinsic درونی‌سازی \f[CB]BigInteger.squareToLen()\f[R] را فعال می‌کند. به‌طور پیش‌فرض در بسترهایی که از آن پشتیبانی می‌کنند فعال است. فلگ‌هایی که توابع درونی را کنترل می‌کنند اکنون نیازمند گزینه \f[CB]\-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .RS .RE .TP .B \-XX:+UseMulAddIntrinsic درونی‌سازی \f[CB]BigInteger.mulAdd()\f[R] را فعال می‌کند. به‌طور پیش‌فرض در بسترهایی که از آن پشتیبانی می‌کنند فعال است. فلگ‌هایی که توابع درونی را کنترل می‌کنند اکنون نیازمند گزینه \f[CB]\-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .RS .RE .TP .B \-XX:+UseMontgomeryMultiplyIntrinsic درونی‌سازی \f[CB]BigInteger.montgomeryMultiply()\f[R] را فعال می‌کند. به‌طور پیش‌فرض در بسترهایی که از آن پشتیبانی می‌کنند فعال است. فلگ‌هایی که توابع درونی را کنترل می‌کنند اکنون نیازمند گزینه \f[CB]\-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .RS .RE .TP .B \-XX:+UseMontgomerySquareIntrinsic درونی‌سازی \f[CB]BigInteger.montgomerySquare()\f[R] را فعال می‌کند. به‌طور پیش‌فرض در بسترهایی که از آن پشتیبانی می‌کنند فعال است. فلگ‌هایی که توابع درونی را کنترل می‌کنند اکنون نیازمند گزینه \f[CB]\-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .RS .RE .TP .B \f[CB]\-XX:+UseCMoveUnconditionally\f[R] دستورالعمل‌های CMove (اسکالر و برداری) را بدون توجه به تحلیل سودآوری تولید می‌کند. .RS .RE .TP .B \f[CB]\-XX:+UseCodeCacheFlushing\f[R] تخلیه (flush) حافظه پنهان کد را پیش از خاموش کردن کامپایلر فعال می‌کند. این گزینه به‌طور پیش‌فرض فعال است. برای غیرفعال کردن تخلیه حافظه پنهان کد پیش از خاموش کردن کامپایلر، \f[CB]\-XX:\-UseCodeCacheFlushing\f[R] را مشخص کنید. .RS .RE .TP .B \f[CB]\-XX:+UseCondCardMark\f[R] بررسی اینکه آیا کارت از قبل علامت‌گذاری شده است یا خیر را پیش از به‌روزرسانی جدول کارت‌ها فعال می‌کند. این گزینه به‌طور پیش‌فرض غیرفعال است. این گزینه باید تنها در ماشین‌های دارای چندین سوکت استفاده شود، جایی که کارایی برنامه‌های کاربردی جاوای متکی بر عملیات همزمان را افزایش می‌دهد. .RS .RE .TP .B \f[CB]\-XX:+UseCountedLoopSafepoints\f[R] نقاط امن (safepoints) را در حلقه‌های شمارش‌شده حفظ می‌کند. مقدار پیش‌فرض آن به این بستگی دارد که آیا جمع‌آوری‌کننده زباله انتخاب‌شده به نقاط امن با تاخیر کم نیاز دارد یا خیر. .RS .RE .TP .B \f[CB]\-XX:LoopStripMiningIter=\f[R]\f[I]number_of_iterations\f[R] تعداد تکرارها را در حلقه داخلی استخراج نواری (strip mined) کنترل می‌کند. استخراج نواری حلقه‌های شمارش‌شده را به حلقه‌های تو در توی دو سطحی تبدیل می‌کند. نقاط امن در حلقه بیرونی نگه داشته می‌شوند در حالی که حلقه داخلی می‌تواند با سرعت کامل اجرا شود. این گزینه حداکثر تعداد تکرارها در حلقه داخلی را کنترل می‌کند. مقدار پیش‌فرض 1,000 است. .RS .RE .TP .B \f[CB]\-XX:LoopStripMiningIterShortLoop\f[R]=\f[I]number_of_iterations\f[R] بهینه‌سازی استخراج نواری حلقه را کنترل می‌کند. حلقه‌هایی با تعداد تکرار کمتر از مقدار مشخص‌شده، نقطه امن در خود نخواهند داشت. مقدار پیش‌فرض یک‌دهم (1/10) مقدار \f[CB]\-XX:LoopStripMiningIter\f[R] است. .RS .RE .TP .B \f[CB]\-XX:+UseFMA\f[R] توابع درونی FMA مبتنی بر سخت‌افزار را برای سخت‌افزارهایی که دستورالعمل‌های FMA در آن‌ها در دسترس است (مانند Intel و ARM64) فعال می‌کند. توابع درونی FMA برای متدهای \f[CB]java.lang.Math.fma(\f[R]\f[I]a\f[R]\f[CB],\f[R] \f[I]b\f[R]\f[CB],\f[R] \f[I]c\f[R]\f[CB])\f[R] تولید می‌شوند که مقدار عبارت‌های \f[CB](\f[R]\f[I]a\f[R] \f[CB]*\f[R] \f[I]b\f[R] \f[CB]+\f[R] \f[I]c\f[R]\f[CB])\f[R] را محاسبه می‌کنند. .RS .RE .TP .B \f[CB]\-XX:+UseRTMDeopt\f[R] تنظیم خودکار قفل‌گذاری RTM را بسته به نسبت سقط انجام می‌دهد. این نسبت با گزینه \f[CB]\-XX:RTMAbortRatio\f[R] مشخص می‌شود. اگر تعداد تراکنش‌های سقط‌شده از نسبت سقط فراتر رود، متد حاوی قفل بهینه‌زدایی شده و با تبدیل تمام قفل‌ها به قفل‌های عادی مجدداً کامپایل می‌شود. این گزینه به‌طور پیش‌فرض غیرفعال است. گزینه \f[CB]\-XX:+UseRTMLocking\f[R] باید فعال باشد. .RS .RE .TP .B \f[CB]\-XX:+UseRTMLocking\f[R] کد قفل‌گذاری حافظه تراکنشی محدود (Restricted Transactional Memory یا RTM) را برای تمام قفل‌های متورم‌شده (inflated) با مکانیسم قفل‌گذاری عادی به عنوان گرداننده پشتیبان تولید می‌کند. این گزینه به‌طور پیش‌فرض غیرفعال است. گزینه‌های مربوط به RTM تنها در CPUهای x86 که از افزونه‌های همگام‌سازی تراکنشی (TSX) پشتیبانی می‌کنند در دسترس هستند. .RS .PP فناوری RTM بخشی از TSX اینتل است که یک افزونه مجموعه دستورالعمل‌های x86 بوده و ایجاد برنامه‌های کاربردی چندریسه‌ای را تسهیل می‌کند. فناوری RTM دستورالعمل‌های جدید \f[CB]XBEGIN\f[R]، \f[CB]XABORT\f[R]، \f[CB]XEND\f[R] و \f[CB]XTEST\f[R] را معرفی می‌کند. دستورالعمل‌های \f[CB]XBEGIN\f[R] و \f[CB]XEND\f[R] مجموعه‌ای از دستورالعمل‌ها را برای اجرا به عنوان یک تراکنش محصور می‌کنند. اگر هنگام اجرای تراکنش تعارضی یافت نشود، تغییرات حافظه و ثبات‌ها با هم در دستورالعمل \f[CB]XEND\f[R] اعمال (commit) می‌شوند. دستورالعمل \f[CB]XABORT\f[R] می‌تواند برای سقط صریح یک تراکنش استفاده شود و دستورالعمل \f[CB]XTEST\f[R] بررسی می‌کند که آیا مجموعه‌ای از دستورالعمل‌ها در قالب یک تراکنش در حال اجرا هستند یا خیر. .PP یک قفل روی یک تراکنش زمانی متورم می‌شود که ریسه دیگری تلاش کند به همان تراکنش دسترسی یابد، در نتیجه ریسه‌ای را که در ابتدا درخواست دسترسی به تراکنش نداشته مسدود می‌کند. فناوری RTM نیازمند آن است که مجموعه‌ای از عملیات پشتیبان در صورت سقط یا شکست یک تراکنش مشخص شود. یک قفل RTM قفلی است که به سیستم TSX واگذار شده است. .PP فناوری RTM کارایی را برای قفل‌های بسیار رقابتی با تعارض کم در یک ناحیه بحرانی (critical region \- کدی که نباید بیش از یک ریسه به‌طور همزمان به آن دسترسی داشته باشد) بهبود می‌بخشد. همچنین RTM کارایی قفل‌گذاری درشت‌دانه (coarse\-grain locking) را بهبود می‌بخشد که معمولاً در برنامه‌های کاربردی چندریسه‌ای عملکرد خوبی ندارد. (قفل‌گذاری درشت‌دانه راهبرد نگه‌داشتن قفل‌ها برای مدت طولانی جهت به حداقل رساندن سربار گرفتن و آزاد کردن قفل‌ها است، در حالی که قفل‌گذاری ریزدانه یا fine\-grained locking راهبرد تلاش برای دستیابی به حداکثر موازی‌سازی با قفل کردن تنها در زمان نیاز و باز کردن قفل در سریع‌ترین زمان ممکن است.) همچنین، برای قفل‌های با رقابت کم که توسط ریسه‌های مختلف استفاده می‌شوند، RTM می‌تواند اشتراک نادرست خط حافظه پنهان (false cache line sharing) را که به عنوان پینگ‌پنگ خط حافظه پنهان نیز شناخته می‌شود کاهش دهد. این امر زمانی رخ می‌دهد که چندین ریسه از پردازنده‌های مختلف به منابع متفاوتی دسترسی دارند، اما آن منابع یک خط حافظه پنهان مشترک دارند. در نتیجه، پردازنده‌ها مکرراً خطوط حافظه پنهان پردازنده‌های دیگر را باطل می‌کنند، که آن‌ها را مجبور می‌کند به جای حافظه پنهان خود، از حافظه اصلی بخوانند. .RE .TP .B \f[CB]\-XX:+UseSuperWord\f[R] تبدیل عملیات اسکالر به عملیات ابرکلمه (superword) را فعال می‌کند. ابرکلمه یک بهینه‌سازی برداری‌سازی (vectorization) است. این گزینه به‌طور پیش‌فرض فعال است. برای غیرفعال کردن تبدیل عملیات اسکالر به عملیات ابرکلمه، \f[CB]\-XX:\-UseSuperWord\f[R] را مشخص کنید. .RS .RE .SH "گزینه‌های پیشرفته سرویس‌دهی برای جاوا (ADVANCED SERVICEABILITY OPTIONS FOR JAVA)" .PP این گزینه‌های \f[CB]java\f[R] امکان جمع‌آوری اطلاعات سیستم و انجام اشکال‌زدایی گسترده را فراهم می‌کنند. .TP .B \f[CB]\-XX:+DisableAttachMechanism\f[R] مکانیزمی را که به ابزارها امکان اتصال به JVM را می‌دهد، غیرفعال می‌کند. به‌طور پیش‌فرض، این گزینه غیرفعال است؛ به این معنی که مکانیزم اتصال فعال است و می‌توانید از ابزارهای عیب‌یابی و خطایابی مانند \f[CB]jcmd\f[R]، \f[CB]jstack\f[R]، \f[CB]jmap\f[R] و \f[CB]jinfo\f[R] استفاده کنید. .RS .RS .PP \f[B]نکته:\f[R] ابزارهایی مانند \f[B]jcmd\f[R]، \f[B]jinfo\f[R]، \f[B]jmap\f[R] و \f[B]jstack\f[R] که همراه با JDK عرضه می‌شوند، هنگام استفاده از ابزارهای یک نسخه JDK برای عیب‌یابی نسخه‌ای متفاوت از JDK پشتیبانی نمی‌شوند. .RE .RE .TP .B \f[CB]\-XX:+ExtendedDTraceProbes\f[R] \f[B]لینوکس و macOS:\f[R] پروب‌های اضافی ابزار \f[CB]dtrace\f[R] را که بر کارایی تأثیر می‌گذارند، فعال می‌کند. به‌طور پیش‌فرض، این گزینه غیرفعال است و \f[CB]dtrace\f[R] فقط پروب‌های استاندارد را انجام می‌دهد. .RS .RE .TP .B \f[CB]\-XX:+HeapDumpOnOutOfMemoryError\f[R] تخلیه حافظه هیپ (heap dump) جاوا در فایلی در دایرکتوری جاری را با استفاده از پروفایلر هیپ (HPROF) هنگام رخ دادن استثنای \f[CB]java.lang.OutOfMemoryError\f[R] فعال می‌کند. می‌توانید مسیر و نام فایل دامپ هیپ را با استفاده از گزینه \f[CB]\-XX:HeapDumpPath\f[R] صریحاً تعیین کنید. به‌طور پیش‌فرض، این گزینه غیرفعال است و هنگام رخ دادن استثنای \f[CB]OutOfMemoryError\f[R]، هیپ دامپ نمی‌شود. .RS .RE .TP .B \f[CB]\-XX:HeapDumpPath=path\f[R] مسیر و نام فایل را برای نوشتن دامپ هیپ ارائه‌شده توسط پروفایلر هیپ (HPROF) هنگامی که گزینه \f[CB]\-XX:+HeapDumpOnOutOfMemoryError\f[R] تنظیم شده است، مشخص می‌کند. به‌طور پیش‌فرض، این فایل در دایرکتوری کاری جاری ایجاد شده و \f[CB]java_pid.hprof\f[R] نام‌گذاری می‌شود که در آن \f[CB]\f[R] شناسه فرایندی است که موجب خطا شده است. مثال زیر نحوه تنظیم صریح فایل پیش‌فرض را نشان می‌دهد (\f[CB]%p\f[R] نشان‌دهنده شناسه فرایند جاری است): .RS .RS .PP \f[CB]\-XX:HeapDumpPath=./java_pid%p.hprof\f[R] .RE .IP \[bu] 2 \f[B]لینوکس و macOS:\f[R] مثال زیر نحوه تنظیم فایل دامپ هیپ روی \f[CB]/var/log/java/java_heapdump.hprof\f[R] را نشان می‌دهد: .RS 2 .RS .PP \f[CB]\-XX:HeapDumpPath=/var/log/java/java_heapdump.hprof\f[R] .RE .RE .IP \[bu] 2 \f[B]ویندوز:\f[R] مثال زیر نحوه تنظیم فایل دامپ هیپ روی \f[CB]C:/log/java/java_heapdump.log\f[R] را نشان می‌دهد: .RS 2 .RS .PP \f[CB]\-XX:HeapDumpPath=C:/log/java/java_heapdump.log\f[R] .RE .RE .RE .TP .B \f[CB]\-XX:LogFile=\f[R]\f[I]path\f[R] مسیر و نام فایل محل نوشتن داده‌های گزارش (log) را تعیین می‌کند. به‌طور پیش‌فرض، فایل در دایرکتوری کاری جاری ایجاد شده و \f[CB]hotspot.log\f[R] نامیده می‌شود. .RS .IP \[bu] 2 \f[B]لینوکس و macOS:\f[R] مثال زیر نحوه تنظیم فایل لاگ روی \f[CB]/var/log/java/hotspot.log\f[R] را نشان می‌دهد: .RS 2 .RS .PP \f[CB]\-XX:LogFile=/var/log/java/hotspot.log\f[R] .RE .RE .IP \[bu] 2 \f[B]ویندوز:\f[R] مثال زیر نحوه تنظیم فایل لاگ روی \f[CB]C:/log/java/hotspot.log\f[R] را نشان می‌دهد: .RS 2 .RS .PP \f[CB]\-XX:LogFile=C:/log/java/hotspot.log\f[R] .RE .RE .RE .TP .B \f[CB]\-XX:+PrintClassHistogram\f[R] چاپ هیستوگرام نمونه‌های کلاس را پس از یکی از رویدادهای زیر فعال می‌کند: .RS .IP \[bu] 2 \f[B]لینوکس و macOS:\f[R] کلیدهای ترکیبی \f[CB]Control+Break\f[R] .IP \[bu] 2 \f[B]ویندوز:\f[R] کلیدهای ترکیبی \f[CB]Control+C\f[R] (\f[CB]SIGTERM\f[R]) .PP به‌طور پیش‌فرض، این گزینه غیرفعال است. .PP تنظیم این گزینه معادل اجرای دستور \f[CB]jmap\ \-histo\f[R] یا دستور \f[CB]jcmd\f[R] \f[I]pid\f[R] \f[CB]GC.class_histogram\f[R] است، که در آن \f[I]pid\f[R] شناسه فرایند جاوا جاری است. .RE .TP .B \f[CB]\-XX:+PrintConcurrentLocks\f[R] چاپ قفل‌های \f[CB]java.util.concurrent\f[R] را پس از یکی از رویدادهای زیر فعال می‌کند: .RS .IP \[bu] 2 \f[B]لینوکس و macOS:\f[R] کلیدهای ترکیبی \f[CB]Control+Break\f[R] .IP \[bu] 2 \f[B]ویندوز:\f[R] کلیدهای ترکیبی \f[CB]Control+C\f[R] (\f[CB]SIGTERM\f[R]) .PP به‌طور پیش‌فرض، این گزینه غیرفعال است. .PP تنظیم این گزینه معادل اجرای دستور \f[CB]jstack\ \-l\f[R] یا دستور \f[CB]jcmd\f[R] \f[I]pid\f[R] \f[CB]Thread.print\ \-l\f[R] است، که در آن \f[I]pid\f[R] شناسه فرایند جاوا جاری است. .RE .TP .B \f[CB]\-XX:+PrintFlagsRanges\f[R] محدوده مشخص‌شده را چاپ کرده و امکان آزمایش خودکار مقادیر را فراهم می‌سازد. بخش \f[B]اعتبارسنجی آرگومان‌های فلگ ماشین مجازی جاوا (Validate Java Virtual Machine Flag Arguments)\f[R] را ببینید. .RS .RE .TP .B \f[CB]\-XX:+PerfDataSaveToFile\f[R] در صورت فعال بودن، هنگام خروج برنامه جاوا، داده‌های باینری \f[B]jstat\f[R] را ذخیره می‌کند. این داده‌های باینری در فایلی با نام \f[CB]hsperfdata_\f[R]\f[I]pid\f[R] ذخیره می‌شوند که در آن \f[I]pid\f[R] شناسه فرایند برنامه جاوای اجرا شده است. از دستور \f[CB]jstat\f[R] برای نمایش داده‌های عملکردی موجود در این فایل به‌صورت زیر استفاده کنید: .RS .RS .PP \f[CB]jstat\ \-class\ file:///\f[R]\f[I]path\f[R]\f[CB]/hsperfdata_\f[R]\f[I]pid\f[R] .RE .RS .PP \f[CB]jstat\ \-gc\ file:///\f[R]\f[I]path\f[R]\f[CB]/hsperfdata_\f[R]\f[I]pid\f[R] .RE .RE .TP .B \f[CB]\-XX:+UsePerfData\f[R] ویژگی \f[CB]perfdata\f[R] را فعال می‌کند. این گزینه به‌طور پیش‌فرض برای امکان مانیتورینگ JVM و تست عملکرد فعال است. غیرفعال کردن آن مانع از ایجاد دایرکتوری‌های \f[CB]hsperfdata_userid\f[R] می‌شود. برای غیرفعال کردن ویژگی \f[CB]perfdata\f[R]، گزینه \f[CB]\-XX:\-UsePerfData\f[R] را مشخص کنید. .RS .RE .SH "گزینه‌های پیشرفته جمع‌آوری زباله برای جاوا (ADVANCED GARBAGE COLLECTION OPTIONS FOR JAVA)" .PP این گزینه‌های \f[CB]java\f[R] نحوه انجام فرآیند جمع‌آوری زباله (GC) توسط Java HotSpot VM را کنترل می‌کنند. .TP .B \f[CB]\-XX:+AggressiveHeap\f[R] بهینه‌سازی هیپ جاوا را فعال می‌کند. این گزینه بر اساس پیکربندی رایانه (رم و پردازنده)، پارامترهای مختلفی را برای کارهای طولانی‌مدت با تخصیص حافظه فشرده بهینه می‌سازد. به‌طور پیش‌فرض، این گزینه غیرفعال است و اندازه‌های هیپ کمتر تهاجمی پیکربندی می‌شوند. .RS .RE .TP .B \f[CB]\-XX:+AlwaysPreTouch\f[R] از VM درخواست می‌کند تا تمام صفحات حافظه هیپ جاوا را پس از درخواست از سیستم‌عامل و قبل از تحویل حافظه به برنامه، لمس (touch) کند. به‌طور پیش‌فرض، این گزینه غیرفعال است و تمام صفحات هم‌زمان با استفاده برنامه از فضای هیپ، تثبیت (commit) می‌شوند. .RS .RE .TP .B \f[CB]\-XX:ConcGCThreads=\f[R]\f[I]threads\f[R] تعداد رشته‌های (threads) مورد استفاده برای GC هم‌روند را تعیین می‌کند. مقدار \f[I]\f[CI]threads\f[I]\f[R] را تقریباً برابر با ۱/۴ تعداد رشته‌های موازی جمع‌آوری زباله قرار می‌دهد. مقدار پیش‌فرض به تعداد پردازنده‌های در دسترس JVM بستگی دارد. .RS .PP به‌عنوان مثال، برای تنظیم تعداد رشته‌ها برای GC هم‌روند روی ۲، گزینه زیر را مشخص کنید: .RS .PP \f[CB]\-XX:ConcGCThreads=2\f[R] .RE .RE .TP .B \f[CB]\-XX:+DisableExplicitGC\f[R] گزینه‌ای را که پردازش فراخوانی‌های متد \f[CB]System.gc()\f[R] را غیرفعال می‌کند، فعال می‌سازد. این گزینه به‌طور پیش‌فرض غیرفعال است، به این معنی که فراخوانی‌های \f[CB]System.gc()\f[R] پردازش می‌شوند. اگر پردازش فراخوانی‌های \f[CB]System.gc()\f[R] غیرفعال باشد، JVM همچنان در صورت لزوم GC را انجام می‌دهد. .RS .RE .TP .B \f[CB]\-XX:+ExplicitGCInvokesConcurrent\f[R] فراخوانی GC هم‌روند را با استفاده از درخواست \f[CB]System.gc()\f[R] فعال می‌کند. این گزینه به‌طور پیش‌فرض غیرفعال است و فقط همراه با گزینه \f[CB]\-XX:+UseG1GC\f[R] می‌تواند فعال شود. .RS .RE .TP .B \f[CB]\-XX:G1AdaptiveIHOPNumInitialSamples=\f[R]\f[I]number\f[R] هنگامی که \f[CB]\-XX:UseAdaptiveIHOP\f[R] فعال باشد، این گزینه تعداد چرخه‌های نشانه‌گذاری (marking) تکمیل‌شده را برای جمع‌آوری نمونه‌ها تعیین می‌کند تا زمانی که G1 به‌صورت تطبیقی مقدار بهینه \f[CB]\-XX:InitiatingHeapOccupancyPercent\f[R] را تعیین کند. پیش از آن، G1 مستقیماً از مقدار \f[CB]\-XX:InitiatingHeapOccupancyPercent\f[R] برای این منظور استفاده می‌کند. مقدار پیش‌فرض ۳ است. .RS .RE .TP .B \f[CB]\-XX:G1HeapRegionSize=size\f[R] اندازه ناحیه‌هایی (regions) را تعیین می‌کند که حافظه هیپ جاوا هنگام استفاده از جمع‌آورنده اولویت زباله (G1) به آن‌ها تقسیم می‌شود. مقدار باید توانی از ۲ باشد و می‌تواند از ۱ مگابایت تا ۳۲ مگابایت متغیر باشد. اندازه پیش‌فرض ناحیه به‌صورت ارگونومیک بر اساس اندازه هیپ و با هدف دستیابی به حدود ۲۰۴۸ ناحیه تعیین می‌شود. .RS .PP مثال زیر اندازه زیربخش‌ها را روی ۱۶ مگابایت تنظیم می‌کند: .RS .PP \f[CB]\-XX:G1HeapRegionSize=16m\f[R] .RE .RE .TP .B \f[CB]\-XX:G1HeapWastePercent=\f[R]\f[I]percent\f[R] درصدی از هیپ را که مایل به هدر دادن آن هستید تعیین می‌کند. هنگامی که درصد قابل‌بازیابی کمتر از درصد هدررفت هیپ باشد، Java HotSpot VM چرخه جمع‌آوری زباله ترکیبی (mixed GC) را آغاز نمی‌کند. مقدار پیش‌فرض ۵ درصد است. .RS .RE .TP .B \f[CB]\-XX:G1MaxNewSizePercent=\f[R]\f[I]percent\f[R] درصدی از اندازه هیپ را برای استفاده به‌عنوان بیشینه اندازه نسل جوان (young generation) تعیین می‌کند. مقدار پیش‌فرض ۶۰ درصد از هیپ جاوا است. .RS .PP این یک فلگ آزمایشی است. این تنظیم جایگزین تنظیم \f[CB]\-XX:DefaultMaxNewGenPercent\f[R] می‌شود. .RE .TP .B \f[CB]\-XX:G1MixedGCCountTarget=\f[R]\f[I]number\f[R] تعداد هدف جمع‌آوری‌های زباله ترکیبی را پس از یک چرخه نشانه‌گذاری برای جمع‌آوری ناحیه‌های قدیمی با حداکثر داده زنده به میزان \f[CB]G1MixedGCLiveThresholdPercent\f[R] تعیین می‌کند. مقدار پیش‌فرض ۸ بار جمع‌آوری زباله ترکیبی است. هدف برای جمع‌آوری‌های ترکیبی، ماندن در محدوده این تعداد است. .RS .RE .TP .B \f[CB]\-XX:G1MixedGCLiveThresholdPercent=\f[R]\f[I]percent\f[R] آستانه اشغال را برای یک ناحیه قدیمی تعیین می‌کند تا در چرخه جمع‌آوری زباله ترکیبی گنجانده شود. اشغال پیش‌فرض ۸۵ درصد است. .RS .PP این یک فلگ آزمایشی است. این تنظیم جایگزین تنظیم \f[CB]\-XX:G1OldCSetRegionLiveThresholdPercent\f[R] می‌شود. .RE .TP .B \f[CB]\-XX:G1NewSizePercent=\f[R]\f[I]percent\f[R] درصدی از هیپ را برای استفاده به‌عنوان کمینه اندازه نسل جوان تعیین می‌کند. مقدار پیش‌فرض ۵ درصد از هیپ جاوا است. .RS .PP این یک فلگ آزمایشی است. این تنظیم جایگزین تنظیم \f[CB]\-XX:DefaultMinNewGenPercent\f[R] می‌شود. .RE .TP .B \f[CB]\-XX:G1OldCSetRegionThresholdPercent=\f[R]\f[I]percent\f[R] حد بالایی را برای تعداد ناحیه‌های قدیمی که در طول یک چرخه جمع‌آوری زباله ترکیبی جمع‌آوری می‌شوند، تعیین می‌کند. مقدار پیش‌فرض ۱۰ درصد از هیپ جاوا است. .RS .RE .TP .B \f[CB]\-XX:G1ReservePercent=\f[R]\f[I]percent\f[R] درصدی از هیپ (۰ تا ۵۰) را تعیین می‌کند که به‌عنوان سقف کاذب برای کاهش احتمال خطای ارتقا (promotion failure) برای جمع‌آورنده G1 رزرو می‌شود. هنگام افزایش یا کاهش این درصد، مطمئن شوید که کل هیپ جاوا را به همان میزان تنظیم می‌کنید. به‌طور پیش‌فرض، این گزینه روی ۱۰% تنظیم شده است. .RS .PP مثال زیر هیپ رزرو شده را روی ۲۰% تنظیم می‌کند: .RS .PP \f[CB]\-XX:G1ReservePercent=20\f[R] .RE .RE .TP .B \f[CB]\-XX:+G1UseAdaptiveIHOP\f[R] محاسبه تطبیقی میزان اشغال نسل قدیمی را برای شروع کارهای پس‌زمینه آماده‌سازی جهت جمع‌آوری نسل قدیمی کنترل می‌کند. در صورت فعال بودن، G1 در دفعات اول همان‌طور که با مقدار \f[CB]\-XX:G1AdaptiveIHOPNumInitialSamples\f[R] مشخص شده از \f[CB]\-XX:InitiatingHeapOccupancyPercent\f[R] استفاده می‌کند، و پس از آن مقدار بهینه جدیدی را برای اشغال اولیه به‌طور خودکار محاسبه می‌کند. در غیر این صورت، فرآیند جمع‌آوری نسل قدیمی همیشه در میزان اشغال نسل قدیمی تعیین‌شده توسط \f[CB]\-XX:InitiatingHeapOccupancyPercent\f[R] آغاز می‌شود. .RS .PP به‌طور پیش‌فرض فعال است. .RE .TP .B \f[CB]\-XX:InitialHeapSize=\f[R]\f[I]size\f[R] اندازه اولیه (به بایت) مخزن تخصیص حافظه را تعیین می‌کند. این مقدار باید ۰ یا مضربی از ۱۰۲۴ و بزرگ‌تر از ۱ مگابایت باشد. حرف \f[CB]k\f[R] یا \f[CB]K\f[R] را برای نشان دادن کیلوبایت، \f[CB]m\f[R] یا \f[CB]M\f[R] را برای مگابایت، یا \f[CB]g\f[R] یا \f[CB]G\f[R] را برای گیگابایت اضافه کنید. مقدار پیش‌فرض در زمان اجرا بر اساس پیکربندی سیستم انتخاب می‌شود. .RS .PP مثال‌های زیر نحوه تنظیم اندازه حافظه تخصیص‌یافته روی ۶ مگابایت را با استفاده از واحدهای مختلف نشان می‌دهند: .IP .nf \f[CB] \-XX:InitialHeapSize=6291456 \-XX:InitialHeapSize=6144k \-XX:InitialHeapSize=6m \f[R] .fi .PP اگر این گزینه را روی ۰ تنظیم کنید، اندازه اولیه برابر با مجموع اندازه‌های تخصیص‌یافته برای نسل قدیمی و نسل جوان تنظیم می‌شود. اندازه هیپ برای نسل جوان را می‌توان با استفاده از گزینه \f[CB]\-XX:NewSize\f[R] تعیین کرد. .RE .TP .B \f[CB]\-XX:InitialRAMPercentage=\f[R]\f[I]percent\f[R] میزان اولیه حافظه‌ای را که JVM قبل از اعمال روش‌های ابتکاری ارگونومی برای هیپ جاوا استفاده می‌کند، به‌صورت درصدی از حداکثر مقدار تعیین‌شده مطابق با گزینه \f[CB]\-XX:MaxRAM\f[R] تنظیم می‌کند. مقدار پیش‌فرض ۱.۵۶۲۵ درصد است. .RS .PP مثال زیر نحوه تنظیم درصد مقدار اولیه حافظه مورد استفاده برای هیپ جاوا را نشان می‌دهد: .RS .PP \f[CB]\-XX:InitialRAMPercentage=5\f[R] .RE .RE .TP .B \f[CB]\-XX:InitialSurvivorRatio=\f[R]\f[I]ratio\f[R] نسبت اولیه فضای بازمانده (survivor space) مورد استفاده توسط جمع‌آورنده زباله توان عملیاتی (throughput garbage collector) را که با گزینه \f[CB]\-XX:+UseParallelGC\f[R] فعال می‌شود، تنظیم می‌کند. اندازه‌گیری تطبیقی به‌طور پیش‌فرض در جمع‌آورنده زباله throughput با استفاده از گزینه \f[CB]\-XX:+UseParallelGC\f[R] فعال است و فضای بازمانده با شروع از مقدار اولیه، متناسب با رفتار برنامه تغییر اندازه می‌یابد. اگر اندازه‌گیری تطبیقی غیرفعال باشد (با استفاده از گزینه \f[CB]\-XX:\-UseAdaptiveSizePolicy\f[R])، باید از گزینه \f[CB]\-XX:SurvivorRatio\f[R] برای تنظیم اندازه فضای بازمانده در تمام طول اجرای برنامه استفاده شود. .RS .PP فرمول زیر می‌تواند برای محاسبه اندازه اولیه فضای بازمانده (S) بر اساس اندازه نسل جوان (Y) و نسبت اولیه فضای بازمانده (R) استفاده شود: .RS .PP \f[CB]S=Y/(R+2)\f[R] .RE .PP عدد ۲ در معادله نشان‌دهنده دو فضای بازمانده است. هر چه مقدار مشخص‌شده برای نسبت اولیه فضای بازمانده بزرگ‌تر باشد، اندازه اولیه فضای بازمانده کوچک‌تر خواهد بود. .PP به‌طور پیش‌فرض، نسبت اولیه فضای بازمانده روی ۸ تنظیم شده است. اگر از مقدار پیش‌فرض برای اندازه فضای نسل جوان (۲ مگابایت) استفاده شود، اندازه اولیه فضای بازمانده ۰.۲ مگابایت خواهد بود. .PP مثال زیر نحوه تنظیم نسبت اولیه فضای بازمانده روی ۴ را نشان می‌دهد: .RS .PP \f[CB]\-XX:InitialSurvivorRatio=4\f[R] .RE .RE .TP .B \f[CB]\-XX:InitiatingHeapOccupancyPercent=\f[R]\f[I]percent\f[R] درصد اشغال نسل قدیمی (۰ تا ۱۰۰) را که در آن اولین چرخه‌های نشانه‌گذاری هم‌روند برای جمع‌آورنده زباله G1 آغاز می‌شود، تعیین می‌کند. .RS .PP به‌طور پیش‌فرض، مقدار اولیه روی ۴۵% تنظیم شده است. مقدار ۰ به معنای چرخه‌های GC هم‌روند بدون توقف از ابتدا است تا زمانی که G1 این مقدار را به‌صورت تطبیقی تنظیم کند. .PP همچنین گزینه‌های \f[CB]\-XX:G1UseAdaptiveIHOP\f[R] و \f[CB]\-XX:G1AdaptiveIHOPNumInitialSamples\f[R] را ببینید. .PP مثال زیر نحوه تنظیم اشغال هیپ اولیه روی ۷۵% را نشان می‌دهد: .RS .PP \f[CB]\-XX:InitiatingHeapOccupancyPercent=75\f[R] .RE .RE .TP .B \f[CB]\-XX:MaxGCPauseMillis=\f[R]\f[I]time\f[R] هدفی را برای حداکثر زمان توقف GC (به میلی‌ثانیه) تعیین می‌کند. این یک هدف منعطف (soft goal) است و JVM تمام تلاش خود را برای رسیدن به آن انجام خواهد داد. مقدار مشخص‌شده با اندازه هیپ شما تطبیق پیدا نمی‌کند. به‌طور پیش‌فرض، برای G1 هدف حداکثر زمان توقف ۲۰۰ میلی‌ثانیه است. سایر جمع‌آورنده‌های نسلی به‌طور پیش‌فرض از هدف زمان توقف استفاده نمی‌کنند. .RS .PP مثال زیر نحوه تنظیم حداکثر زمان توقف هدف را روی ۵۰۰ میلی‌ثانیه نشان می‌دهد: .RS .PP \f[CB]\-XX:MaxGCPauseMillis=500\f[R] .RE .RE .TP .B \f[CB]\-XX:MaxHeapSize=\f[R]\f[I]size\f[R] حداکثر اندازه (به بایت) مخزن تخصیص حافظه را تعیین می‌کند. این مقدار باید مضربی از ۱۰۲۴ و بزرگ‌تر از ۲ مگابایت باشد. حرف \f[CB]k\f[R] یا \f[CB]K\f[R] را برای نشان دادن کیلوبایت، \f[CB]m\f[R] یا \f[CB]M\f[R] را برای مگابایت، یا \f[CB]g\f[R] یا \f[CB]G\f[R] را برای گیگابایت اضافه کنید. مقدار پیش‌فرض در زمان اجرا بر اساس پیکربندی سیستم انتخاب می‌شود. برای استقرارهای سرور، گزینه‌های \f[CB]\-XX:InitialHeapSize\f[R] و \f[CB]\-XX:MaxHeapSize\f[R] اغلب روی مقداری یکسان تنظیم می‌شوند. .RS .PP مثال‌های زیر نحوه تنظیم حداکثر اندازه مجاز حافظه تخصیص‌یافته روی ۸۰ مگابایت را با استفاده از واحدهای مختلف نشان می‌دهند: .IP .nf \f[CB] \-XX:MaxHeapSize=83886080 \-XX:MaxHeapSize=81920k \-XX:MaxHeapSize=80m \f[R] .fi .PP گزینه \f[CB]\-XX:MaxHeapSize\f[R] معادل \f[CB]\-Xmx\f[R] است. .RE .TP .B \f[CB]\-XX:MaxHeapFreeRatio=\f[R]\f[I]percent\f[R] حداکثر درصد مجاز فضای خالی هیپ (۰ تا ۱۰۰) را پس از یک رویداد GC تعیین می‌کند. اگر فضای خالی هیپ بیش از این مقدار گسترش یابد، هیپ کوچک می‌شود. به‌طور پیش‌فرض، این مقدار روی ۷۰% تنظیم شده است. .RS .PP اندازه هیپ جاوا را با کاهش مقادیر پارامترهای \f[CB]MaxHeapFreeRatio\f[R] (مقدار پیش‌فرض ۷۰%) و \f[CB]MinHeapFreeRatio\f[R] (مقدار پیش‌فرض ۴۰%) از طریق گزینه‌های خط فرمان \f[CB]\-XX:MaxHeapFreeRatio\f[R] و \f[CB]\-XX:MinHeapFreeRatio\f[R] به حداقل برسانید. کاهش \f[CB]MaxHeapFreeRatio\f[R] تا ۱۰% و \f[CB]MinHeapFreeRatio\f[R] تا ۵%، اندازه هیپ را با موفقیت و بدون افت کارایی زیاد کاهش داده است؛ با این حال، نتایج ممکن است بسته به برنامه شما بسیار متفاوت باشد. مقادیر مختلف را برای این پارامترها امتحان کنید تا جایی که در کمترین حالت ممکن باشند و در عین حال کارایی قابل‌قبولی را حفظ کنند. .RS .PP \f[CB]\-XX:MaxHeapFreeRatio=10\ \-XX:MinHeapFreeRatio=5\f[R] .RE .PP کاربرانی که تلاش می‌کنند هیپ را کوچک نگه دارند باید گزینه \f[CB]\-XX:\-ShrinkHeapInSteps\f[R] را نیز اضافه کنند. برای توضیحات مربوط به استفاده از این گزینه جهت کوچک نگه داشتن هیپ جاوا با کاهش ردپای حافظه پویا برای برنامه‌های تعبیه‌شده (embedded)، بخش \f[B]مثال‌های تنظیم کارایی (Performance Tuning Examples)\f[R] را ببینید. .RE .TP .B \f[CB]\-XX:MaxMetaspaceSize=\f[R]\f[I]size\f[R] حداکثر مقدار حافظه بومی (native memory) را که می‌تواند برای فراداده کلاس (class metadata) تخصیص یابد، تعیین می‌کند. به‌طور پیش‌فرض، اندازه محدود نیست. مقدار فراداده برای یک برنامه به خود برنامه، سایر برنامه‌های در حال اجرا و مقدار حافظه موجود در سیستم بستگی دارد. .RS .PP مثال زیر نحوه تنظیم حداکثر اندازه فراداده کلاس را روی ۲۵۶ مگابایت نشان می‌دهد: .RS .PP \f[CB]\-XX:MaxMetaspaceSize=256m\f[R] .RE .RE .TP .B \f[CB]\-XX:MaxNewSize=\f[R]\f[I]size\f[R] حداکثر اندازه (به بایت) هیپ را برای نسل جوان (nursery) تعیین می‌کند. مقدار پیش‌فرض به‌صورت ارگونومیک تنظیم می‌شود. .RS .RE .TP .B \f[CB]\-XX:MaxRAM=\f[R]\f[I]size\f[R] حداکثر مقدار حافظه‌ای را که JVM می‌تواند برای هیپ جاوا قبل از اعمال روش‌های ارگونومی استفاده کند، تعیین می‌کند. مقدار پیش‌فرض، حداکثر مقدار حافظه در دسترس فرایند JVM یا ۱۲۸ گیگابایت است (هرکدام که کمتر باشد). .RS .PP حداکثر مقدار حافظه در دسترس فرایند JVM برابر است با کمینه حافظه فیزیکی دستگاه و هرگونه محدودیت تعیین‌شده توسط محیط (مانند کانتینر). .PP اگر نتیجه ترکیب این گزینه و سایر گزینه‌های مؤثر بر حداکثر مقدار حافظه، بزرگ‌تر از محدوده حافظه آدرس‌پذیر توسط oops فشرده باشد، مشخص کردن این گزینه استفاده خودکار از compressed oops را غیرفعال می‌کند. برای اطلاعات بیشتر درباره compressed oops، به \f[CB]\-XX:UseCompressedOops\f[R] مراجعه کنید. .PP مثال زیر نحوه تنظیم حداکثر مقدار حافظه در دسترس برای تعیین اندازه هیپ جاوا روی ۲ گیگابایت را نشان می‌دهد: .RS .PP \f[CB]\-XX:MaxRAM=2G\f[R] .RE .RE .TP .B \f[CB]\-XX:MaxRAMPercentage=\f[R]\f[I]percent\f[R] حداکثر مقدار حافظه‌ای را که JVM می‌تواند برای هیپ جاوا قبل از اعمال ارگونومیک به عنوان درصدی از حداکثر مقدار تعیین‌شده (همان‌طور که در گزینه \f[CB]\-XX:MaxRAM\f[R] شرح داده شده) استفاده کند، تنظیم می‌کند. مقدار پیش‌فرض 25 درصد است. .RS .PP مشخص کردن این گزینه، استفاده خودکار از اشاره‌گرهای فشرده (compressed oops) را در صورتی که نتیجه ترکیب این گزینه و سایر گزینه‌های مؤثر بر حداکثر حافظه بزرگ‌تر از محدوده حافظه قابل‌آدرس‌دهی توسط compressed oops باشد، غیرفعال می‌کند. برای اطلاعات بیشتر درباره اشاره‌گرهای فشرده، گزینه \f[CB]\-XX:UseCompressedOops\f[R] را ببینید. .PP مثال زیر نحوه تنظیم درصد حداکثر مقدار حافظه مورد استفاده برای هیپ جاوا را نشان می‌دهد: .RS .PP \f[CB]\-XX:MaxRAMPercentage=75\f[R] .RE .RE .TP .B \f[CB]\-XX:MinRAMPercentage=\f[R]\f[I]percent\f[R] حداکثر مقدار حافظه‌ای را که JVM می‌تواند برای هیپ جاوا قبل از اعمال ارگونومیک به عنوان درصدی از حداکثر مقدار تعیین‌شده (همان‌طور که در گزینه \f[CB]\-XX:MaxRAM\f[R] شرح داده شده) برای هیپ‌های کوچک استفاده کند، تنظیم می‌کند. یک هیپ کوچک، هیپی با اندازه تقریبی ۱۲۵ مگابایت است. مقدار پیش‌فرض 50 درصد است. .RS .PP مثال زیر نحوه تنظیم درصد حداکثر مقدار حافظه مورد استفاده برای هیپ جاوا را برای هیپ‌های کوچک نشان می‌دهد: .RS .PP \f[CB]\-XX:MinRAMPercentage=75\f[R] .RE .RE .TP .B \f[CB]\-XX:MaxTenuringThreshold=\f[R]\f[I]threshold\f[R] حداکثر آستانه ارتقای نسل (tenuring threshold) را برای استفاده در تنظیم اندازه تطبیقی GC مشخص می‌کند. بزرگ‌ترین مقدار مجاز 15 است. مقدار پیش‌فرض برای زباله‌روب موازی (throughput) برابر با 15 است. .RS .PP مثال زیر نحوه تنظیم حداکثر آستانه ارتقای نسل به 10 را نشان می‌دهد: .RS .PP \f[CB]\-XX:MaxTenuringThreshold=10\f[R] .RE .RE .TP .B \f[CB]\-XX:MetaspaceSize=\f[R]\f[I]size\f[R] اندازه فضای متادیتای کلاس تخصیص‌یافته را تنظیم می‌کند که فراتر رفتن از آن برای اولین بار، اجرای فرایند زباله‌روبی را تحریک می‌کند. این آستانه برای زباله‌روبی، بسته به میزان متادیتای استفاده‌شده افزایش یا کاهش می‌یابد. اندازه پیش‌فرض به پلتفرم بستگی دارد. .RS .RE .TP .B \f[CB]\-XX:MinHeapFreeRatio=\f[R]\f[I]percent\f[R] حداقل درصد مجاز فضای خالی هیپ (۰ تا ۱۰۰) پس از یک رویداد GC را تنظیم می‌کند. اگر فضای خالی هیپ به کمتر از این مقدار برسد، هیپ گسترش می‌یابد. به صورت پیش‌فرض، این مقدار روی 40% تنظیم شده است. .RS .PP با کاهش مقادیر پارامترهای \f[CB]MaxHeapFreeRatio\f[R] (مقدار پیش‌فرض 70%) و \f[CB]MinHeapFreeRatio\f[R] (مقدار پیش‌فرض 40%) با استفاده از گزینه‌های خط فرمان \f[CB]\-XX:MaxHeapFreeRatio\f[R] و \f[CB]\-XX:MinHeapFreeRatio\f[R]، اندازه هیپ جاوا را به حداقل برسانید. کاهش \f[CB]MaxHeapFreeRatio\f[R] تا 10% و \f[CB]MinHeapFreeRatio\f[R] تا 5% با موفقیت اندازه هیپ را بدون افت کارایی چشمگیر کاهش داده است؛ با این حال، نتایج بسته به برنامه شما ممکن است بسیار متفاوت باشد. مقادیر مختلف را برای این پارامترها امتحان کنید تا جایی که تا حد امکان کم باشند و در عین حال کارایی قابل قبولی را حفظ کنند. .RS .PP \f[CB]\-XX:MaxHeapFreeRatio=10\ \-XX:MinHeapFreeRatio=5\f[R] .RE .PP کاربرانی که تلاش می‌کنند هیپ را کوچک نگه دارند باید گزینه \f[CB]\-XX:\-ShrinkHeapInSteps\f[R] را نیز اضافه کنند. برای توضیحات مربوط به استفاده از این گزینه برای کوچک نگه داشتن هیپ جاوا از طریق کاهش ردپای حافظه پویا برای برنامه‌های تعبیه‌شده (embedded)، به بخش \f[B]مثال‌های تنظیم کارایی (Performance Tuning Examples)\f[R] مراجعه کنید. .RE .TP .B \f[CB]\-XX:MinHeapSize=\f[R]\f[I]size\f[R] حداقل اندازه (به بایت) استخر تخصیص حافظه را تنظیم می‌کند. این مقدار باید 0 یا مضربی از 1024 و بزرگ‌تر از 1 مگابایت باشد. حرف \f[CB]k\f[R] یا \f[CB]K\f[R] را برای مشخص کردن کیلوبایت، \f[CB]m\f[R] یا \f[CB]M\f[R] را برای مگابایت، یا \f[CB]g\f[R] یا \f[CB]G\f[R] را برای گیگابایت اضافه کنید. مقدار پیش‌فرض در زمان اجرا بر اساس پیکربندی سیستم انتخاب می‌شود. .RS .PP مثال‌های زیر نحوه تنظیم حداقل اندازه حافظه تخصیص‌یافته به 6 مگابایت را با استفاده از واحدهای مختلف نشان می‌دهند: .IP .nf \f[CB] \-XX:MinHeapSize=6291456 \-XX:MinHeapSize=6144k \-XX:MinHeapSize=6m \f[R] .fi .PP اگر این گزینه را روی 0 تنظیم کنید، حداقل اندازه برابر با مقدار اندازه اولیه تنظیم می‌شود. .RE .TP .B \f[CB]\-XX:NewRatio=\f[R]\f[I]ratio\f[R] نسبت بین اندازه‌های نسل جوان (young generation) و نسل قدیم (old generation) را تنظیم می‌کند. به صورت پیش‌فرض، این گزینه روی 2 تنظیم شده است. مثال زیر نحوه تنظیم نسبت نسل جوان به قدیم را روی 1 نشان می‌دهد: .RS .RS .PP \f[CB]\-XX:NewRatio=1\f[R] .RE .RE .TP .B \f[CB]\-XX:NewSize=\f[R]\f[I]size\f[R] اندازه اولیه (به بایت) هیپ برای نسل جوان (nursery) را تنظیم می‌کند. حرف \f[CB]k\f[R] یا \f[CB]K\f[R] را برای مشخص کردن کیلوبایت، \f[CB]m\f[R] یا \f[CB]M\f[R] را برای مگابایت، یا \f[CB]g\f[R] یا \f[CB]G\f[R] را برای گیگابایت اضافه کنید. .RS .PP ناحیه نسل جوان هیپ برای اشیاء جدید استفاده می‌شود. فرایند GC در این ناحیه بیشتر از سایر نواحی انجام می‌گیرد. اگر اندازه نسل جوان بیش از حد کم باشد، تعداد زیادی GC جزئی (minor GC) انجام خواهد شد. اگر اندازه بیش از حد زیاد باشد، فقط GCهای کامل (full GC) اجرا می‌شوند که ممکن است زمان زیادی برای تکمیل نیاز داشته باشند. توصیه می‌شود اندازه نسل جوان را بیش از 25% و کمتر از 50% از کل اندازه هیپ نگه دارید. .PP مثال‌های زیر نحوه تنظیم اندازه اولیه نسل جوان به 256 مگابایت را با استفاده از واحدهای مختلف نشان می‌دهند: .IP .nf \f[CB] \-XX:NewSize=256m \-XX:NewSize=262144k \-XX:NewSize=268435456 \f[R] .fi .PP گزینه \f[CB]\-XX:NewSize\f[R] معادل \f[CB]\-Xmn\f[R] است. .RE .TP .B \f[CB]\-XX:ParallelGCThreads=\f[R]\f[I]threads\f[R] تعداد نخ‌های پردازشی کارگر توقف کل دنیا (stop-the-world یا STW) را تنظیم می‌کند. مقدار پیش‌فرض به تعداد CPUهای در دسترس JVM و زباله‌روب انتخاب‌شده بستگی دارد. .RS .PP برای مثال، جهت تنظیم تعداد نخ‌ها برای زباله‌روب G1 به ۲، گزینه زیر را مشخص کنید: .RS .PP \f[CB]\-XX:ParallelGCThreads=2\f[R] .RE .RE .TP .B \f[CB]\-XX:+ParallelRefProcEnabled\f[R] پردازش موازی ارجاعات را فعال می‌کند. به صورت پیش‌فرض، این گزینه غیرفعال است. .RS .RE .TP .B \f[CB]\-XX:+PrintAdaptiveSizePolicy\f[R] چاپ اطلاعات مربوط به اندازه‌بندی تطبیقی نسل‌ها را فعال می‌کند. به صورت پیش‌فرض، این گزینه غیرفعال است. .RS .RE .TP .B \f[CB]\-XX:+ScavengeBeforeFullGC\f[R] زباله‌روبی نسل جوان را پیش از هر زباله‌روبی کامل (full GC) فعال می‌کند. این گزینه به صورت پیش‌فرض فعال است. توصیه می‌شود آن را غیرفعال \f[I]نکنید\f[R]، زیرا پاکسازی نسل جوان قبل از full GC می‌تواند تعداد اشیاء قابل‌دسترس از فضای نسل قدیم به فضای نسل جوان را کاهش دهد. برای غیرفعال کردن GC نسل جوان پیش از هر full GC، گزینه \f[CB]\-XX:\-ScavengeBeforeFullGC\f[R] را مشخص کنید. .RS .RE .TP .B \f[CB]\-XX:SoftRefLRUPolicyMSPerMB=\f[R]\f[I]time\f[R] مدت زمانی (به میلی‌ثانیه) را که یک شیء با دسترسی نرم (softly reachable) پس از آخرین باری که به آن ارجاع داده شده روی هیپ فعال باقی می‌ماند، تنظیم می‌کند. مقدار پیش‌فرض یک ثانیه طول عمر به ازای هر مگابایت فضای خالی در هیپ است. گزینه \f[CB]\-XX:SoftRefLRUPolicyMSPerMB\f[R] مقادیر صحیحی را می‌پذیرد که نشان‌دهنده میلی‌ثانیه به ازای یک مگابایت از اندازه فعلی هیپ (برای ماشین مجازی Java HotSpot Client) یا حداکثر اندازه ممکن هیپ (برای ماشین مجازی Java HotSpot Server) است. این تفاوت به این معناست که Client VM تمایل دارد به جای افزایش اندازه هیپ، ارجاعات نرم را پاکسازی کند، در حالی که Server VM تمایل دارد به جای پاکسازی ارجاعات نرم، اندازه هیپ را افزایش دهد. در حالت دوم، مقدار گزینه \f[CB]\-Xmx\f[R] تأثیر بسزایی بر سرعت زباله‌روبی ارجاعات نرم دارد. .RS .PP مثال زیر نحوه تنظیم این مقدار به 2.5 ثانیه را نشان می‌دهد: .PP \f[CB]\-XX:SoftRefLRUPolicyMSPerMB=2500\f[R] .RE .TP .B \f[CB]\-XX:\-ShrinkHeapInSteps\f[R] هیپ جاوا را به صورت مرحله‌ای و تدریجی به اندازه هدف مشخص‌شده توسط گزینه \f[CB]\-XX:MaxHeapFreeRatio\f[R] کاهش می‌دهد. این گزینه به صورت پیش‌فرض فعال است. در صورت غیرفعال بودن، هیپ جاوا را به جای نیاز به چندین چرخه زباله‌روبی، بلافاصله به اندازه هدف کاهش می‌دهد. اگر می‌خواهید اندازه هیپ جاوا را به حداقل برسانید، این گزینه را غیرفعال کنید. هنگامی که این گزینه غیرفعال است، احتمالاً با افت کارایی مواجه خواهید شد. .RS .PP برای شرح استفاده از گزینه \f[CB]MaxHeapFreeRatio\f[R] جهت کوچک نگه داشتن هیپ جاوا از طریق کاهش ردپای حافظه پویا برای برنامه‌های تعبیه‌شده، به بخش \f[B]مثال‌های تنظیم کارایی (Performance Tuning Examples)\f[R] مراجعه کنید. .RE .TP .B \f[CB]\-XX:StringDeduplicationAgeThreshold=\f[R]\f[I]threshold\f[R] اشیاء \f[CB]String\f[R] را که به سن مشخص‌شده می‌رسند و کاندیدای یکتا‌سازی (deduplication) در نظر گرفته می‌شوند، شناسایی می‌کند. سن یک شیء معیاری از تعداد دفعاتی است که از زباله‌روبی جان سالم به در برده است. گاهی اوقات به این مفهوم ارتقای نسل (tenuring) نیز گفته می‌شود. .RS .RS .PP \f[B]نکته:\f[R] اشیاء \f[CB]String\f[R] که قبل از رسیدن به این سن به ناحیه نسل قدیم هیپ ارتقا می‌یابند، همیشه کاندیدای یکتا‌سازی در نظر گرفته می‌شوند. مقدار پیش‌فرض برای این گزینه \f[CB]3\f[R] است. گزینه \f[CB]\-XX:+UseStringDeduplication\f[R] را ببینید. .RE .RE .TP .B \f[CB]\-XX:SurvivorRatio=\f[R]\f[I]ratio\f[R] نسبت بین اندازه فضای eden و اندازه فضای survivor را تنظیم می‌کند. به صورت پیش‌فرض، این گزینه روی 8 تنظیم شده است. مثال زیر نحوه تنظیم نسبت فضای eden/survivor به 4 را نشان می‌دهد: .RS .RS .PP \f[CB]\-XX:SurvivorRatio=4\f[R] .RE .RE .TP .B \f[CB]\-XX:TargetSurvivorRatio=\f[R]\f[I]percent\f[R] درصد مطلوب فضای survivor مورد استفاده پس از زباله‌روبی نسل جوان را (۰ تا ۱۰۰) تنظیم می‌کند. به صورت پیش‌فرض، این گزینه روی 50% تنظیم شده است. .RS .PP مثال زیر نحوه تنظیم نسبت هدف فضای survivor به 30% را نشان می‌دهد: .RS .PP \f[CB]\-XX:TargetSurvivorRatio=30\f[R] .RE .RE .TP .B \f[CB]\-XX:TLABSize=\f[R]\f[I]size\f[R] اندازه اولیه (به بایت) بافر تخصیص محلی نخ (TLAB) را تنظیم می‌کند. حرف \f[CB]k\f[R] یا \f[CB]K\f[R] را برای مشخص کردن کیلوبایت، \f[CB]m\f[R] یا \f[CB]M\f[R] را برای مگابایت، یا \f[CB]g\f[R] یا \f[CB]G\f[R] را برای گیگابایت اضافه کنید. اگر این گزینه روی 0 تنظیم شود، JVM اندازه اولیه را به طور خودکار انتخاب می‌کند. .RS .PP مثال زیر نحوه تنظیم اندازه اولیه TLAB به 512 کیلوبایت را نشان می‌دهد: .RS .PP \f[CB]\-XX:TLABSize=512k\f[R] .RE .RE .TP .B \f[CB]\-XX:+UseAdaptiveSizePolicy\f[R] استفاده از اندازه‌بندی تطبیقی نسل‌ها را فعال می‌کند. این گزینه به صورت پیش‌فرض فعال است. برای غیرفعال کردن اندازه‌بندی تطبیقی نسل‌ها، گزینه \f[CB]\-XX:\-UseAdaptiveSizePolicy\f[R] را مشخص کرده و اندازه استخر تخصیص حافظه را به صورت صریح تنظیم کنید. گزینه \f[CB]\-XX:SurvivorRatio\f[R] را ببینید. .RS .RE .TP .B \f[CB]\-XX:+UseG1GC\f[R] استفاده از زباله‌روب اولویت با زباله (G1 یا Garbage-First) را فعال می‌کند. این یک زباله‌روب مخصوص سرور است که برای ماشین‌های چندپردازنده‌ای با مقدار زیاد رم طراحی شده است. این گزینه با احتمال بالا اهداف زمان توقف GC را برآورده کرده و در عین حال توان پردازشی (throughput) خوبی را حفظ می‌کند. زباله‌روب G1 برای برنامه‌هایی پیشنهاد می‌شود که به هیپ‌های بزرگ (اندازه‌های حدود ۶ گیگابایت یا بزرگ‌تر) با محدودیت‌های تاخیر GC (زمان توقف پایدار و قابل پیش‌بینی کمتر از ۰.۵ ثانیه) نیاز دارند. به صورت پیش‌فرض، این گزینه فعال است و G1 به عنوان زباله‌روب پیش‌فرض استفاده می‌شود. .RS .RE .TP .B \f[CB]\-XX:+UseGCOverheadLimit\f[R] استفاده از سیاستی را فعال می‌کند که نسبت زمان صرف‌شده توسط JVM برای GC را قبل از پرتاب استثنای \f[CB]OutOfMemoryError\f[R] محدود می‌سازد. این گزینه به طور پیش‌فرض فعال است و اگر بیش از 98% از کل زمان صرف زباله‌روبی شود و کمتر از 2% از هیپ بازیابی گردد، GC موازی خطای \f[CB]OutOfMemoryError\f[R] را پرتاب خواهد کرد. هنگامی که هیپ کوچک است، از این ویژگی می‌توان برای جلوگیری از اجرای طولانی‌مدت برنامه‌ها با پیشرفت کم یا بدون پیشرفت استفاده کرد. برای غیرفعال کردن این گزینه، گزینه \f[CB]\-XX:\-UseGCOverheadLimit\f[R] را مشخص کنید. .RS .RE .TP .B \f[CB]\-XX:+UseNUMA\f[R] بهینه‌سازی کارایی برنامه را روی ماشینی با معماری حافظه غیریکنواخت (NUMA) از طریق افزایش استفاده برنامه از حافظه با تاخیر کمتر فعال می‌کند. به صورت پیش‌فرض، این گزینه غیرفعال است و هیچ بهینه‌سازی برای NUMA انجام نمی‌شود. این گزینه تنها زمانی در دسترس است که از زباله‌روب موازی استفاده شود (\f[CB]\-XX:+UseParallelGC\f[R]). .RS .RE .TP .B \f[CB]\-XX:+UseParallelGC\f[R] استفاده از زباله‌روب موازی (Parallel Scavenge که به عنوان throughput collector نیز شناخته می‌شود) را برای بهبود کارایی برنامه از طریق بهره‌گیری از چندین پردازنده فعال می‌کند. .RS .PP به صورت پیش‌فرض، این گزینه غیرفعال است و از زباله‌روب پیش‌فرض استفاده می‌شود. .RE .TP .B \f[CB]\-XX:+UseSerialGC\f[R] استفاده از زباله‌روب سریالی (Serial Garbage Collector) را فعال می‌کند. این گزینه عموماً بهترین انتخاب برای برنامه‌های کوچک و ساده است که به قابلیت‌های خاصی از زباله‌روبی نیاز ندارند. به صورت پیش‌فرض، این گزینه غیرفعال است و از زباله‌روب پیش‌فرض استفاده می‌شود. .RS .RE .TP .B \f[CB]\-XX:+UseSHM\f[R] \f[B]فقط در لینوکس:\f[R] به JVM امکان می‌دهد از حافظه اشتراکی برای راه‌اندازی صفحات بزرگ (large pages) استفاده کند. .RS .PP برای راه‌اندازی صفحات بزرگ، بخش \f[B]صفحات بزرگ (Large Pages)\f[R] را ببینید. .RE .TP .B \f[CB]\-XX:+UseStringDeduplication\f[R] یکتا‌سازی رشته‌ها (string deduplication) را فعال می‌کند. به صورت پیش‌فرض، این گزینه غیرفعال است. برای استفاده از این گزینه، باید زباله‌روب اولویت با زباله (G1) را فعال کنید. .RS .PP یکتا‌سازی رشته‌ها با بهره‌گیری از این واقعیت که بسیاری از اشیاء \f[CB]String\f[R] یکسان هستند، ردپای حافظه اشیاء \f[CB]String\f[R] را روی هیپ جاوا کاهش می‌دهد. به جای اینکه هر شیء \f[CB]String\f[R] به آرایه نویسه‌های اختصاصی خود اشاره کند، اشیاء \f[CB]String\f[R] یکسان می‌توانند به یک آرایه نویسه مشترک اشاره کرده و آن را به اشتراک بگذارند. .RE .TP .B \f[CB]\-XX:+UseTLAB\f[R] استفاده از بلوک‌های تخصیص محلی نخ (TLAB) را در فضای نسل جوان فعال می‌کند. این گزینه به صورت پیش‌فرض فعال است. برای غیرفعال کردن استفاده از TLAB، گزینه \f[CB]\-XX:\-UseTLAB\f[R] را مشخص کنید. .RS .RE .TP .B \f[CB]\-XX:+UseZGC\f[R] استفاده از زباله‌روب Z (موسوم به ZGC) را فعال می‌کند. این یک زباله‌روب با تاخیر کم است که حداکثر زمان توقف در حد چند میلی‌ثانیه را با مقداری هزینه در توان پردازشی فراهم می‌کند. زمان‌های توقف مستقل از اندازه هیپ مورد استفاده هستند. از اندازه‌های هیپ بین ۸ مگابایت تا ۱۶ ترابایت پشتیبانی می‌کند. .RS .RE .TP .B \f[CB]\-XX:ZAllocationSpikeTolerance\f[R]=\f[I]factor\f[R] میزان تحمل جهش تخصیص حافظه (allocation spike tolerance) را برای ZGC تنظیم می‌کند. به صورت پیش‌فرض، این گزینه روی 2.0 تنظیم شده است. این ضریب سطح جهش‌های تخصیص قابل‌انتظار را توصیف می‌کند. به عنوان مثال، استفاده از ضریب 3.0 به این معنی است که نرخ تخصیص فعلی می‌تواند در هر لحظه سه برابر شود. .RS .RE .TP .B \f[CB]\-XX:ZCollectionInterval\f[R]=\f[I]seconds\f[R] حداکثر فاصله زمانی (به ثانیه) بین دو چرخه GC را هنگام استفاده از ZGC مشخص می‌کند. به صورت پیش‌فرض، این گزینه روی 0 (غیرفعال) تنظیم شده است. .RS .RE .TP .B \f[CB]\-XX:ZFragmentationLimit\f[R]=\f[I]percent\f[R] حداکثر قطعه‌قطعه شدن مجاز هیپ (به درصد) را برای ZGC مشخص می‌کند. به صورت پیش‌فرض، این گزینه روی 25 تنظیم شده است. استفاده از مقدار کمتر باعث می‌شود هیپ به صورت تهاجمی‌تری فشرده‌سازی شود تا حافظه بیشتری به بهای مصرف زمان بیشتر CPU آزاد گردد. .RS .RE .TP .B \f[CB]\-XX:+ZProactive\f[R] چرخه‌های پیش‌دستانه (proactive) زباله‌روبی را هنگام استفاده از ZGC فعال می‌کند. این گزینه به صورت پیش‌فرض فعال است. اگر انتظار برود که اجرای زباله‌روبی تأثیر ناچیزی بر برنامه در حال اجرا داشته باشد، ZGC چرخه GC پیش‌دستانه را آغاز می‌کند. این قابلیت در صورتی مفید است که برنامه بیشتر در حالت غیرفعال باشد یا اشیاء بسیار کمی تخصیص دهد، اما همچنان بخواهید اندازه هیپ را پایین نگه داشته و به پردازش ارجاعات اجازه اجرا دهید حتی زمانی که فضای خالی زیادی روی هیپ وجود دارد. .RS .RE .TP .B \f[CB]\-XX:+ZUncommit\f[R] آزادسازی حافظه هیپ استفاده‌نشده (uncommit) را در هنگام استفاده از ZGC فعال می‌کند. این گزینه به صورت پیش‌فرض فعال است. آزادسازی حافظه استفاده‌نشده هیپ، ردپای حافظه JVM را کاهش داده و آن حافظه را برای استفاده سایر فرآیندها در دسترس قرار می‌دهد. .RS .RE .TP .B \f[CB]\-XX:ZUncommitDelay\f[R]=\f[I]seconds\f[R] مدت زمانی (به ثانیه) را تعیین می‌کند که حافظه هیپ قبل از آزادسازی (uncommit) باید استفاده‌نشده باقی مانده باشد. به صورت پیش‌فرض، این گزینه روی 300 (۵ دقیقه) تنظیم شده است. تخصیص مجدد و آزادسازی حافظه عملیات نسبتاً هزینه‌بری هستند. استفاده از مقدار کمتر باعث می‌شود حافظه هیپ زودتر آزاد شود، با این ریسک که ممکن است خیلی زود نیاز به تخصیص مجدد آن باشد. .RS .RE .SH "گزینه‌های منسوخ‌شده جاوا (DEPRECATED JAVA OPTIONS)" .PP این گزینه‌های \f[CB]java\f[R] منسوخ شده‌اند و ممکن است در نسخه‌های آینده JDK حذف شوند. آن‌ها هنوز پذیرفته شده و اعمال می‌شوند، اما هنگام استفاده از آن‌ها هشدار صادر می‌شود. .TP .B \f[CB]\-Xfuture\f[R] بررسی‌های سخت‌گیرانه فرمت فایل کلاس را فعال می‌کند که بر انطباق دقیق با مشخصات فرمت فایل کلاس نظارت دارد. توسعه‌دهندگان هنگام توسعه کدهای جدید باید از این فلگ استفاده کنند. بررسی‌های سخت‌گیرانه‌تر ممکن است در نسخه‌های آینده به حالت پیش‌فرض تبدیل شوند. .RS .RE .TP .B \f[CB]\-Xloggc:\f[R]\f[I]filename\f[R] فایلی را تنظیم می‌کند که اطلاعات مفصل رویدادهای GC باید برای ثبت وقایع به آن هدایت شوند. اگر هر دو گزینه با یک دستور java داده شوند، گزینه \f[CB]\-Xloggc\f[R] بر گزینه \f[CB]\-verbose:gc\f[R] اولویت دارد و آن را بازنویسی می‌کند. گزینه \f[CB]\-Xloggc:\f[R]\f[I]filename\f[R] با \f[CB]\-Xlog:gc:\f[R]\f[I]filename\f[R] جایگزین شده است. بخش «فعال‌سازی ثبت وقایع با چارچوب ثبت وقایع یکپارچه JVM» را ببینید. .RS .PP مثال: .PP \f[CB]\-Xlog:gc:garbage\-collection.log\f[R] .RE .TP .B \f[CB]\-XX:+FlightRecorder\f[R] استفاده از ضبط‌کننده پرواز جاوا (Java Flight Recorder یا JFR) را در طول زمان اجرای برنامه فعال می‌کند. از نسخه JDK 8u40 برای استفاده از JFR دیگر نیازی به این گزینه نیست. .RS .RE .TP .B \f[CB]\-XX:InitialRAMFraction=\f[R]\f[I]ratio\f[R] مقدار اولیه حافظه‌ای را که JVM می‌تواند برای هیپ جاوا قبل از اعمال ارگونومیک به عنوان نسبتی از حداکثر مقدار تعیین‌شده (همان‌طور که در گزینه \f[CB]\-XX:MaxRAM\f[R] شرح داده شده) استفاده کند، تنظیم می‌کند. مقدار پیش‌فرض 64 است. .RS .PP به جای این، از گزینه \f[CB]\-XX:InitialRAMPercentage\f[R] استفاده کنید. .RE .TP .B \f[CB]\-XX:MaxRAMFraction=\f[R]\f[I]ratio\f[R] حداکثر مقدار حافظه‌ای را که JVM می‌تواند برای هیپ جاوا قبل از اعمال ارگونومیک به عنوان کسری از حداکثر مقدار تعیین‌شده (همان‌طور که در گزینه \f[CB]\-XX:MaxRAM\f[R] شرح داده شده) استفاده کند، تنظیم می‌کند. مقدار پیش‌فرض 4 است. .RS .PP مشخص کردن این گزینه، استفاده خودکار از اشاره‌گرهای فشرده (compressed oops) را در صورتی که نتیجه ترکیب این گزینه و سایر گزینه‌های مؤثر بر حداکثر حافظه بزرگ‌تر از محدوده حافظه قابل‌آدرس‌دهی توسط compressed oops باشد، غیرفعال می‌کند. برای اطلاعات بیشتر درباره اشاره‌گرهای فشرده، گزینه \f[CB]\-XX:UseCompressedOops\f[R] را ببینید. .PP به جای این، از گزینه \f[CB]\-XX:MaxRAMPercentage\f[R] استفاده کنید. .RE .TP .B \f[CB]\-XX:MinRAMFraction=\f[R]\f[I]ratio\f[R] حداکثر مقدار حافظه‌ای را که JVM می‌تواند برای هیپ جاوا قبل از اعمال ارگونومیک به عنوان کسری از حداکثر مقدار تعیین‌شده (همان‌طور که در گزینه \f[CB]\-XX:MaxRAM\f[R] شرح داده شده) برای هیپ‌های کوچک استفاده کند، تنظیم می‌کند. یک هیپ کوچک، هیپی با اندازه تقریبی ۱۲۵ مگابایت است. مقدار پیش‌فرض 2 است. .RS .PP به جای این، از گزینه \f[CB]\-XX:MinRAMPercentage\f[R] استفاده کنید. .RE .TP .B \f[CB]\-XX:+UseBiasedLocking\f[R] استفاده از قفل‌گذاری متمایل (biased locking) را فعال می‌کند. برخی از برنامه‌ها با حجم قابل‌توجهی از همگام‌سازی بدون رقابت ممکن است با فعال بودن این فلگ افزایش سرعت چشمگیری کسب کنند، اما برنامه‌هایی با الگوهای خاصی از قفل‌گذاری ممکن است با کندی مواجه شوند. .RS .PP به صورت پیش‌فرض، این گزینه غیرفعال است. .RE .SH "گزینه‌های متروکه جاوا (OBSOLETE JAVA OPTIONS)" .PP این گزینه‌های \f[CB]java\f[R] هنوز پذیرفته می‌شوند اما نادیده گرفته می‌شوند و هنگام استفاده از آن‌ها هشدار صادر می‌شود. .TP .B \f[CB]\-\-illegal\-access=\f[R]\f[I]parameter\f[R] گزینه \f[I]کپسوله‌سازی قوی ملایم (relaxed strong encapsulation)\f[R] را همان‌طور که در \f[B]JEP 261\f[R] [https://openjdk.java.net/jeps/261#Relaxed\-strong\-encapsulation] تعریف شده، کنترل می‌کرد. این گزینه در JDK 16 توسط \f[B]JEP 396\f[R] [https://openjdk.java.net/jeps/396] منسوخ شد و در JDK 17 توسط \f[B]JEP 403\f[R] [https://openjdk.java.net/jeps/403] به عنوان متروکه تعیین گردید. .RS .RE .SH "گزینه‌های حذف‌شده جاوا (REMOVED JAVA OPTIONS)" .PP این گزینه‌های \f[CB]java\f[R] در JDK 17 حذف شده‌اند و استفاده از آن‌ها منجر به این خطا می‌شود: .RS .PP \f[CB]Unrecognized\ VM\ option\f[R] \f[I]option\-name\f[R] .RE .TP .B \f[CB]\-XX:+UseMembar\f[R] صدور موانع حافظه (membar) را در هنگام تغییر وضعیت نخ‌ها فعال می‌کرد. این گزینه به صورت پیش‌فرض روی همه پلتفرم‌ها به جز سرورهای ARM (که روی آن‌ها فعال بود) غیرفعال بود. .RS .RE .TP .B \f[CB]\-XX:MaxPermSize=\f[R]\f[I]size\f[R] حداکثر اندازه فضای نسل دائمی (permanent generation) را (به بایت) تنظیم می‌کند. این گزینه در JDK 8 منسوخ شد و گزینه \f[CB]\-XX:MaxMetaspaceSize\f[R] جایگزین آن گردید. .RS .RE .TP .B \f[CB]\-XX:PermSize=\f[R]\f[I]size\f[R] فضای تخصیص‌یافته به نسل دائمی را (به بایت) تنظیم می‌کند که فراتر رفتن از آن، زباله‌روبی را تحریک می‌کند. این گزینه در JDK 8 منسوخ شد و گزینه \f[CB]\-XX:MetaspaceSize\f[R] جایگزین آن گردید. .RS .RE .TP .B \f[CB]\-XX:+TraceClassLoading\f[R] ردیابی کلاس‌ها را هنگام بارگذاری فعال می‌کند. به صورت پیش‌فرض، این گزینه غیرفعال است و کلاس‌ها ردیابی نمی‌شوند. .RS .PP سینتکس جایگزین ثبت وقایع یکپارچه (Unified Logging) عبارت است از: \f[CB]\-Xlog:class+load=\f[R]\f[I]level\f[R]. بخش \f[B]فعال‌سازی ثبت وقایع با چارچوب ثبت وقایع یکپارچه JVM\f[R] را ببینید. .PP از \f[I]level\f[R]=\f[CB]info\f[R] برای اطلاعات عادی، یا \f[I]level\f[R]=\f[CB]debug\f[R] برای اطلاعات بیشتر استفاده کنید. در سینتکس Unified Logging، گزینه \f[CB]\-verbose:class\f[R] برابر است با \f[CB]\-Xlog:class+load=info,class+unload=info\f[R]. .RE .TP .B \f[CB]\-XX:+TraceClassLoadingPreorder\f[R] ردیابی تمامی کلاس‌های بارگذاری‌شده را به ترتیبی که به آن‌ها ارجاع داده شده، فعال می‌کند. به صورت پیش‌فرض، این گزینه غیرفعال است و کلاس‌ها ردیابی نمی‌شوند. .RS .PP سینتکس جایگزین ثبت وقایع یکپارچه (Unified Logging) عبارت است از: \f[CB]\-Xlog:class+preorder=debug\f[R]. بخش \f[B]فعال‌سازی ثبت وقایع با چارچوب ثبت وقایع یکپارچه JVM\f[R] را ببینید. .RE .TP .B \f[CB]\-XX:+TraceClassResolution\f[R] ردیابی حل‌وفصل استخر ثابت‌ها (constant pool resolutions) را فعال می‌کند. به صورت پیش‌فرض، این گزینه غیرفعال است و حل‌وفصل‌های استخر ثابت‌ها ردیابی نمی‌شوند. .RS .PP سینتکس جایگزین ثبت وقایع یکپارچه (Unified Logging) عبارت است از: \f[CB]\-Xlog:class+resolve=debug\f[R]. بخش \f[B]فعال‌سازی ثبت وقایع با چارچوب ثبت وقایع یکپارچه JVM\f[R] را ببینید. .RE .TP .B \f[CB]\-XX:+TraceLoaderConstraints\f[R] ردیابی ثبت محدودیت‌های بارگذار (loader constraints recording) را فعال می‌کند. به صورت پیش‌فرض، این گزینه غیرفعال است و ثبت محدودیت‌های بارگذار ردیابی نمی‌شود. .RS .PP سینتکس جایگزین ثبت وقایع یکپارچه (Unified Logging) عبارت است از: \f[CB]\-Xlog:class+loader+constraints=info\f[R]. بخش \f[B]فعال‌سازی ثبت وقایع با چارچوب ثبت وقایع یکپارچه JVM\f[R] را ببینید. .RE .PP برای مشاهده فهرست‌ها و توضیحات گزینه‌های حذف‌شده در نسخه‌های قبلی، بخش \f[I]Removed Java Options\f[R] را در اسناد زیر ببینید: .IP \[bu] 2 \f[B]Java Platform, Standard Edition Tools Reference, Release 16\f[R] [https://docs.oracle.com/en/java/javase/16/docs/specs/man/java.html] .IP \[bu] 2 \f[B]Java Platform, Standard Edition Tools Reference, Release 15\f[R] [https://docs.oracle.com/en/java/javase/15/docs/specs/man/java.html] .IP \[bu] 2 \f[B]Java Platform, Standard Edition Tools Reference, Release 14\f[R] [https://docs.oracle.com/en/java/javase/14/docs/specs/man/java.html] .IP \[bu] 2 \f[B]Java Platform, Standard Edition Tools Reference, Release 13\f[R] [https://docs.oracle.com/en/java/javase/13/docs/specs/man/java.html] .IP \[bu] 2 \f[B]Java Platform, Standard Edition Tools Reference, Release 12\f[R] [https://docs.oracle.com/en/java/javase/12/tools/java.html#GUID\-3B1CE181\-CD30\-4178\-9602\-230B800D4FAE] .IP \[bu] 2 \f[B]Java Platform, Standard Edition Tools Reference, Release 11\f[R] [https://docs.oracle.com/en/java/javase/11/tools/java.html#GUID\-741FC470\-AA3E\-494A\-8D2B\-1B1FE4A990D1] .IP \[bu] 2 \f[B]Java Platform, Standard Edition Tools Reference, Release 10\f[R] [https://docs.oracle.com/javase/10/tools/java.htm#JSWOR624] .IP \[bu] 2 \f[B]Java Platform, Standard Edition Tools Reference, Release 9\f[R] [https://docs.oracle.com/javase/9/tools/java.htm#JSWOR624] .IP \[bu] 2 \f[B]Java Platform, Standard Edition Tools Reference, Release 8 for Oracle JDK on Windows\f[R] [https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html#BGBCIEFC] .IP \[bu] 2 \f[B]Java Platform, Standard Edition Tools Reference, Release 8 for Oracle JDK on Solaris, Linux, and macOS\f[R] [https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BGBCIEFC] .SH "فایل‌های آرگومان خط فرمان جاوا (JAVA COMMAND\-LINE ARGUMENT FILES)" .PP شما می‌توانید با استفاده از فایل‌های آرگومان \f[CB]\@\f[R] برای مشخص کردن یک یا چند فایل متنی حاوی آرگومان‌ها (مانند گزینه‌ها و نام کلاس‌ها) که به دستور \f[CB]java\f[R] ارسال می‌شوند، دستور \f[CB]java\f[R] را کوتاه‌تر یا ساده‌تر کنید. این قابلیت به شما امکان می‌دهد در هر سیستم‌عاملی دستورات \f[CB]java\f[R] با هر طولی ایجاد کنید. .PP در خط فرمان، از پیشوند علامت اتساین (\f[CB]\@\f[R]) برای مشخص کردن یک فایل آرگومان حاوی گزینه‌ها و نام کلاس‌های \f[CB]java\f[R] استفاده کنید. هنگامی که دستور \f[CB]java\f[R] با فایلی مواجه می‌شود که با علامت اتساین (\f[CB]\@\f[R]) شروع می‌شود، محتوای آن فایل را دقیقاً همان‌گونه که در خط فرمان مشخص می‌شد، در یک لیست آرگومان باز (expand) می‌کند. .PP اجراکننده \f[CB]java\f[R] محتویات فایل آرگومان را تا زمانی که با گزینه \f[CB]\-\-disable\-\@files\f[R] مواجه شود باز می‌کند. شما می‌توانید از گزینه \f[CB]\-\-disable\-\@files\f[R] در هر کجای خط فرمان، از جمله در یک فایل آرگومان، برای متوقف کردن باز کردن فایل‌های آرگومان \f[CB]\@\f[R] استفاده کنید. .PP موارد زیر نحو و ساختار دستوری فایل‌های آرگومان \f[CB]java\f[R] را شرح می‌دهند: .IP \[bu] 2 فایل آرگومان باید فقط شامل کاراکترهای ASCII یا کاراکترهایی در کدگذاری پیش‌فرض سیستم باشد که با ASCII سازگار هستند، مانند UTF\-8. .IP \[bu] 2 حجم فایل آرگومان نباید از MAXINT (۲٬۱۴۷٬۴۸۳٬۶۴۷) بایت تجاوز کند. .IP \[bu] 2 اجراکننده کاراکترهای عمومی و الگوها (wildcards) را که درون یک فایل آرگومان وجود دارند باز نمی‌کند. .IP \[bu] 2 از کاراکترهای فاصله (white space) یا خط جدید برای جدا کردن آرگومان‌های موجود در فایل استفاده کنید. .IP \[bu] 2 فاصله خالی شامل کاراکتر فاصله، \f[CB]\\t\f[R]، \f[CB]\\n\f[R]، \f[CB]\\r\f[R] و \f[CB]\\f\f[R] است. .RS 2 .PP برای مثال، امکان دارد مسیری با فاصله داشته باشید، مانند \f[CB]c:\\Program\ Files\f[R] که می‌توان آن را به صورت \f[CB]"c:\\\\Program\ Files"\f[R] یا برای جلوگیری از اسکیپ کردن، به صورت \f[CB]c:\\Program"\ "Files\f[R] مشخص کرد. .RE .IP \[bu] 2 هر گزینه‌ای که حاوی فاصله باشد، مانند بخشی از یک مسیر، باید به طور کامل درون کاراکترهای نقل‌قول (\[aq]"\[aq]) قرار گیرد. .IP \[bu] 2 یک رشته درون علامت‌های نقل‌قول می‌تواند حاوی کاراکترهای \f[CB]\\n\f[R]، \f[CB]\\r\f[R]، \f[CB]\\t\f[R] و \f[CB]\\f\f[R] باشد. این کاراکترها به کدهای ASCII متناظر خود تبدیل می‌شوند. .IP \[bu] 2 اگر نام یک فایل حاوی فاصله‌های درونی است، کل نام فایل را در جفت نقل‌قول دوتایی قرار دهید. .IP \[bu] 2 نام‌های فایل در یک فایل آرگومان نسبت به دایرکتوری جاری سنجیده می‌شوند، نه نسبت به مکان قرارگیری خود فایل آرگومان. .IP \[bu] 2 از علامت هش یا نامبر ساین \f[CB]#\f[R] در فایل آرگومان برای مشخص کردن توضیحات (کامنت‌ها) استفاده کنید. تمام کاراکترهای پس از \f[CB]#\f[R] تا انتهای خط نادیده گرفته می‌شوند. .IP \[bu] 2 پیشوندهای اتساین \f[CB]\@\f[R] اضافی برای گزینه‌های دارای پیشوند \f[CB]\@\f[R] به عنوان اسکیپ عمل می‌کنند (اولین \f[CB]\@\f[R] حذف شده و بقیه آرگومان‌ها به صورت لغوی و بدون تغییر به اجراکننده تحویل داده می‌شوند). .IP \[bu] 2 خطوط را می‌توان با استفاده از کاراکتر ادامه (\f[CB]\\\f[R]) در انتهای خط ادامه داد. دو خط با حذف فاصله‌های خالی ابتدایی به یکدیگر متصل می‌شوند. برای جلوگیری از حذف فاصله‌های خالی ابتدایی، می‌توان یک کاراکتر ادامه (\f[CB]\\\f[R]) در ستون اول قرار داد. .IP \[bu] 2 از آنجا که بک‌اسلش (\\) یک کاراکتر اسکیپ است، یک کاراکتر بک‌اسلش باید با یک کاراکتر بک‌اسلش دیگر اسکیپ شود. .IP \[bu] 2 نقل‌قول ناقص یا باز مجاز است و با انتهای فایل (end\-of\-file) بسته می‌شود. .IP \[bu] 2 نقل‌قول باز در انتهای خط متوقف می‌شود مگر اینکه \f[CB]\\\f[R] آخرین کاراکتر باشد، که در این صورت با حذف تمام کاراکترهای فاصله ابتدایی به خط بعدی متصل می‌شود. .IP \[bu] 2 کاراکترهای الگو (*) در این لیست‌ها مجاز نیستند (مانند مشخص کردن \f[CB]*.java\f[R]). .IP \[bu] 2 استفاده بازگشتی از علامت اتساین (\f[CB]\@\f[R]) برای تفسیر فایل‌ها پشتیبانی نمی‌شود. .SS "مثال نقل‌قول‌های باز یا ناقص در فایل آرگومان (Example of Open or Partial Quotes in an Argument File)" .PP در فایل آرگومان، .IP .nf \f[CB] \-cp\ "lib/ cool/ app/ jars \f[R] .fi .PP این به صورت زیر تفسیر می‌شود: .RS .PP \f[CB]\-cp\ lib/cool/app/jars\f[R] .RE .SS "مثال کاراکتر بک‌اسلش اسکیپ‌شده با بک‌اسلش دیگر (Example of a Backslash Character Escaped with Another Backslash)" .PP برای تولید خروجی زیر: .RS .PP \f[CB]\-cp\ c:\\Program\ Files\ (x86)\\Java\\jre\\lib\\ext;c:\\Program\ Files\\Java\\jre9\\lib\\ext\f[R] .RE .PP کاراکتر بک‌اسلش باید در فایل آرگومان به صورت زیر مشخص شود: .RS .PP \f[CB]\-cp\ "c:\\\\Program\ Files\ (x86)\\\\Java\\\\jre\\\\lib\\\\ext;c:\\\\Program\ Files\\\\Java\\\\jre9\\\\lib\\\\ext"\f[R] .RE .SS "مثال اسکیپ EOL برای پیوستن خطوط در فایل آرگومان (Example of an EOL Escape Used to Force Concatenation of Lines in an Argument File)" .PP در فایل آرگومان، .IP .nf \f[CB] \-cp\ "/lib/cool\ app/jars:\\ \ \ \ \ /lib/another\ app/jars" \f[R] .fi .PP این به صورت زیر تفسیر می‌شود: .RS .PP \f[CB]\-cp\ /lib/cool\ app/jars:/lib/another\ app/jars\f[R] .RE .SS "مثال ادامه خط با فاصله‌های ابتدایی در فایل آرگومان (Example of Line Continuation with Leading Spaces in an Argument File)" .PP در فایل آرگومان، .IP .nf \f[CB] \-cp\ "/lib/cool\\ \\app/jars??? \f[R] .fi .PP این به صورت زیر تفسیر می‌شود: .PP \f[CB]\-cp\ /lib/cool\ app/jars\f[R] .SS "مثال‌های استفاده از فایل آرگومان تکی (Examples of Using Single Argument File)" .PP شما می‌توانید از یک فایل آرگومان تکی، مانند \f[CB]myargumentfile\f[R] در مثال زیر، برای نگهداری تمام آرگومان‌های مورد نیاز \f[CB]java\f[R] استفاده کنید: .RS .PP \f[CB]java\ \@myargumentfile\f[R] .RE .SS "مثال‌های استفاده از فایل‌های آرگومان دارای مسیر (Examples of Using Argument Files with Paths)" .PP شما می‌توانید مسیرهای نسبی را در فایل‌های آرگومان بگنجانید؛ با این حال، این مسیرها نسبت به دایرکتوری کاری جاری سنجیده می‌شوند و نه نسبت به مسیرهای خود فایل‌های آرگومان. در مثال زیر، \f[CB]path1/options\f[R] و \f[CB]path2/options\f[R] نمایانگر فایل‌های آرگومان با مسیرهای مختلف هستند. هر مسیر نسبی که در آن‌ها باشد نسبت به دایرکتوری کاری جاری سنجیده می‌شود و نه فایل‌های آرگومان: .RS .PP \f[CB]java\ \@path1/options\ \@path2/classes\f[R] .RE .SH "تحلیل وضعیت هیپ کد (CODE HEAP STATE ANALYTICS)" .SS "مرور کلی (Overview)" .PP گاهی اوقات داشتن بینش نسبت به وضعیت جاری هیپ کد (code heap) در JVM برای پاسخ به سوالاتی مانند موارد زیر مفید خواهد بود: .IP \[bu] 2 چرا JIT خاموش شد و سپس مکرراً روشن و خاموش شد؟ .IP \[bu] 2 تمام فضای هیپ کد کجا مصرف شده است؟ .IP \[bu] 2 چرا متد رُفتگر (method sweeper) به طور موثر کار نمی‌کند؟ .PP برای ارائه این بینش، قابلیت تحلیل وضعیت هیپ کد پیاده‌سازی شده است که امکان تحلیل درجا و همزمان (on\-the\-fly) هیپ کد را فراهم می‌کند. فرآیند تحلیل به دو بخش تقسیم می‌شود. بخش اول کل هیپ کد را بررسی کرده و تمام اطلاعاتی را که مفید یا مهم تلقی می‌شوند تجمیع می‌کند. بخش دوم شامل چندین مرحله مستقل است که اطلاعات جمع‌آوری‌شده را با تاکید بر جنبه‌های مختلف داده‌ها چاپ می‌کند. جمع‌آوری داده‌ها و چاپ به صورت «بر اساس تقاضا» (on request) انجام می‌شود. .SS "ساختار دستوری (Syntax)" .PP درخواست‌ها برای تحلیل بلادرنگ و همزمان را می‌توان با دستور زیر صادر کرد: .RS .PP \f[CB]jcmd\f[R] \f[I]pid\f[R] \f[CB]Compiler.CodeHeap_Analytics\f[R] [\f[I]function\f[R]] [\f[I]granularity\f[R]] .RE .PP اگر فقط به وضعیت هیپ کد پس از اجرای یک بار کاری نمونه علاقه‌مند هستید، می‌توانید از گزینه خط فرمان زیر استفاده کنید: .RS .PP \f[CB]\-Xlog:codecache=Trace\f[R] .RE .PP برای مشاهده وضعیت هیپ کد در زمان بروز وضعیت «CodeCache full» (پر شدن کش کد)، ماشین مجازی را با گزینه خط فرمان زیر راه‌اندازی کنید: .RS .PP \f[CB]\-Xlog:codecache=Debug\f[R] .RE .PP برای توضیحات دقیق درباره قابلیت تحلیل وضعیت هیپ کد، توابع پشتیبانی‌شده و گزینه‌های دانه‌بندی (granularity)، به \f[B]CodeHeap State Analytics (OpenJDK)\f[R] [https://bugs.openjdk.java.net/secure/attachment/75649/JVM_CodeHeap_StateAnalytics_V2.pdf] مراجعه کنید. .SH "فعال‌سازی لاگ با چارچوب لاگ یکپارچه JVM (ENABLE LOGGING WITH THE JVM UNIFIED LOGGING FRAMEWORK)" .PP شما از گزینه \f[CB]\-Xlog\f[R] برای پیکربندی یا فعال‌سازی لاگ با چارچوب لاگ یکپارچه ماشین مجازی جاوا (JVM) استفاده می‌کنید. .SS "خلاصه دستور (Synopsis)" .RS .PP \f[CB]\-Xlog\f[R][\f[CB]:\f[R][\f[I]what\f[R]][\f[CB]:\f[R][\f[I]output\f[R]][\f[CB]:\f[R][\f[I]decorators\f[R]][\f[CB]:\f[R]\f[I]output\-options\f[R][\f[CB],\f[R]...]]]]] .PP \f[CB]\-Xlog:\f[R]\f[I]directive\f[R] .RE .TP .B \f[I]what\f[R] ترکیبی از تگ‌ها و سطوح را به صورت \f[I]tag1\f[R][\f[CB]+\f[R]\f[I]tag2\f[R]...][\f[CB]*\f[R]][\f[CB]=\f[R]\f[I]level\f[R]][\f[CB],\f[R]...] مشخص می‌کند. مگر اینکه کاراکتر عمومی (\f[CB]*\f[R]) مشخص شده باشد، فقط پیام‌های لاگی که دقیقاً با تگ‌های مشخص‌شده برچسب خورده‌اند مطابقت داده می‌شوند. بخش \f[B]تگ‌ها و سطوح \-Xlog (\-Xlog Tags and Levels)\f[R] را ببینید. .RS .RE .TP .B \f[I]output\f[R] نوع خروجی را تنظیم می‌کند. در صورت حذف نوع \f[I]output\f[R]، مقدار پیش‌فرض \f[CB]stdout\f[R] خواهد بود. بخش \f[B]خروجی \-Xlog (\-Xlog Output)\f[R] را ببینید. .RS .RE .TP .B \f[I]decorators\f[R] خروجی را برای استفاده از یک مجموعه سفارشی از تزیین‌کننده‌ها پیکربندی می‌کند. حذف \f[I]decorators\f[R] به طور پیش‌فرض روی \f[CB]uptime\f[R]، \f[CB]level\f[R] و \f[CB]tags\f[R] تنظیم می‌شود. بخش \f[B]تزیینات و متادیتای لاگ (Decorations)\f[R] را ببینید. .RS .RE .TP .B \f[I]output\-options\f[R] گزینه‌های خروجی لاگ \f[CB]\-Xlog\f[R] را تنظیم می‌کند. .RS .RE .TP .B \f[I]directive\f[R] یک گزینه سراسری یا زیردستور: help، disable، async .RS .RE .SS "توضیحات (Description)" .PP چارچوب لاگ یکپارچه ماشین مجازی جاوا (JVM) یک سیستم لاگ مشترک را برای تمام اجزای JVM فراهم می‌کند. لاگ جمع‌آوری زباله (GC) برای JVM تغییر یافته است تا از چارچوب جدید لاگ استفاده کند. نگاشت فلگ‌های قدیمی GC به پیکربندی متناظر جدید Xlog در بخش \f[B]تبدیل فلگ‌های لاگ GC به Xlog\f[R] شرح داده شده است. علاوه بر این، لاگ زمان اجرا (runtime logging) نیز تغییر یافته است تا از چارچوب لاگ یکپارچه JVM استفاده کند. نگاشت فلگ‌های موروثی لاگ زمان اجرا به پیکربندی متناظر جدید Xlog در بخش \f[B]تبدیل فلگ‌های لاگ زمان اجرا به Xlog\f[R] توضیح داده شده است. .PP موارد زیر یک مرجع سریع برای دستور \f[CB]\-Xlog\f[R] و ساختار دستوری گزینه‌ها ارائه می‌دهد: .TP .B \f[CB]\-Xlog\f[R] لاگ JVM را در سطح \f[CB]info\f[R] فعال می‌کند. .RS .RE .TP .B \f[CB]\-Xlog:help\f[R] ساختار دستوری استفاده از \f[CB]\-Xlog\f[R] و تگ‌ها، سطوح و تزیین‌کننده‌های موجود را همراه با خطوط فرمان نمونه و توضیحات چاپ می‌کند. .RS .RE .TP .B \f[CB]\-Xlog:disable\f[R] تمام لاگ‌ها را خاموش کرده و تمام پیکربندی چارچوب لاگ از جمله پیکربندی پیش‌فرض برای هشدارها و خطاها را پاک می‌کند. .RS .RE .TP .B \f[CB]\-Xlog\f[R][\f[CB]:\f[R]\f[I]option\f[R]] چندین آرگومان را به ترتیبی که در خط فرمان ظاهر می‌شوند اعمال می‌کند. چندین آرگومان \f[CB]\-Xlog\f[R] برای یک خروجی یکسان، یکدیگر را به ترتیب مشخص‌شده بازنویسی (override) می‌کنند. .RS .PP گزینه \f[I]option\f[R] به صورت زیر تنظیم می‌شود: .RS .PP [\f[I]tag\-selection\f[R]][\f[CB]:\f[R][\f[I]output\f[R]][\f[CB]:\f[R][\f[I]decorators\f[R]][\f[CB]:\f[R]\f[I]output\-options\f[R]]]] .RE .PP حذف \f[I]tag\-selection\f[R] به طور پیش‌فرض روی مجموعه تگ \f[CB]all\f[R] و سطح \f[CB]info\f[R] تنظیم می‌شود. .RS .PP \f[I]tag\f[R][\f[CB]+\f[R]...] \f[CB]all\f[R] .RE .PP تگ \f[CB]all\f[R] یک متاتگ متشکل از تمام مجموعه‌های تگ موجود است. ستاره \f[CB]*\f[R] در تعریف مجموعه تگ نشان‌دهنده تطابق الگوی عام (wildcard) است. تطابق با کاراکتر عام تمام مجموعه‌های تگی را که \f[I]حداقل\f[R] شامل تگ‌های مشخص‌شده هستند انتخاب می‌کند. بدون کاراکتر عام، فقط تطابق‌های دقیق از مجموعه‌های تگ مشخص‌شده انتخاب می‌شوند. .PP \f[I]output\-options\f[R] عبارت است از .RS .PP \f[CB]filecount=\f[R]\f[I]file\-count\f[R] \f[CB]filesize=\f[R]\f[I]حجم فایل با پسوند اختیاری K، M یا G\f[R] .RE .RE .SS "پیکربندی پیش‌فرض (Default Configuration)" .PP هنگامی که گزینه \f[CB]\-Xlog\f[R] و هیچ چیز دیگری در خط فرمان مشخص نشده باشد، از پیکربندی پیش‌فرض استفاده می‌شود. پیکربندی پیش‌فرض تمام پیام‌هایی را که سطح آن‌ها با warning یا error مطابقت دارد، صرف‌نظر از اینکه پیام با چه تگ‌هایی مرتبط است، ثبت می‌کند. پیکربندی پیش‌فرض معادل وارد کردن دستور زیر در خط فرمان است: .RS .PP \f[CB]\-Xlog:all=warning:stdout:uptime,level,tags\f[R] .RE .SS "کنترل لاگ در زمان اجرا (Controlling Logging at Runtime)" .PP لاگ را می‌توان در زمان اجرا از طریق دستورات تشخیصی (با ابزار \f[B]jcmd\f[R]) نیز کنترل کرد. هر چیزی را که بتوان در خط فرمان مشخص کرد، می‌توان به صورت پویا با دستور \f[CB]VM.log\f[R] نیز مشخص نمود. از آنجا که دستورات تشخیصی به طور خودکار به عنوان MBeanها در معرض نمایش قرار می‌گیرند، می‌توانید از JMX برای تغییر پیکربندی لاگ در زمان اجرا استفاده کنید. .SS "تگ‌ها و سطوح \-Xlog (\-Xlog Tags and Levels)" .PP هر پیام لاگ دارای یک سطح و یک مجموعه تگ مرتبط با خود است. سطح پیام متناظر با جزئیات آن است و مجموعه تگ متناظر با محتوای پیام یا اینکه کدام جزء JVM را در بر می‌گیرد (مانند \f[CB]gc\f[R]، \f[CB]jit\f[R] یا \f[CB]os\f[R]) می‌باشد. نگاشت فلگ‌های GC به پیکربندی Xlog در بخش \f[B]تبدیل فلگ‌های لاگ GC به Xlog\f[R] شرح داده شده است. نگاشت فلگ‌های موروثی لاگ زمان اجرا به پیکربندی متناظر Xlog در بخش \f[B]تبدیل فلگ‌های لاگ زمان اجرا به Xlog\f[R] توضیح داده شده است. .PP \f[B]سطوح لاگ موجود:\f[R] .IP \[bu] 2 \f[CB]off\f[R] .IP \[bu] 2 \f[CB]trace\f[R] .IP \[bu] 2 \f[CB]debug\f[R] .IP \[bu] 2 \f[CB]info\f[R] .IP \[bu] 2 \f[CB]warning\f[R] .IP \[bu] 2 \f[CB]error\f[R] .PP \f[B]تگ‌های لاگ موجود:\f[R] .PP به معنای واقعی کلمه ده‌ها تگ لاگ وجود دارد که در ترکیب‌های مناسب، طیف وسیعی از خروجی‌های لاگ را فعال می‌کنند. مجموعه کامل تگ‌های لاگ موجود را می‌توان با استفاده از \f[CB]\-Xlog:help\f[R] مشاهده کرد. مشخص کردن \f[CB]all\f[R] به جای یک ترکیب تگ با تمام ترکیب‌های تگ مطابقت پیدا می‌کند. .SS "خروجی \-Xlog (\-Xlog Output)" .PP گزینه \f[CB]\-Xlog\f[R] از انواع خروجی‌های زیر پشتیبانی می‌کند: .IP \[bu] 2 \f[CB]stdout\f[R] \-\-\- خروجی را به خروجی استاندارد (stdout) ارسال می‌کند .IP \[bu] 2 \f[CB]stderr\f[R] \-\-\- خروجی را به خطای استاندارد (stderr) ارسال می‌کند .IP \[bu] 2 \f[CB]file=\f[R]\f[I]filename\f[R] \-\-\- خروجی را به فایل(های) متنی ارسال می‌کند. .PP هنگام استفاده از \f[CB]file=\f[R]\f[I]filename\f[R]، مشخص کردن \f[CB]%p\f[R] و/یا \f[CB]%t\f[R] در نام فایل به ترتیب به PID مربوط به JVM و برچسب زمانی راه‌اندازی باز می‌شود. همچنین می‌توانید فایل‌های متنی را برای مدیریت چرخش فایل (file rotation) بر اساس اندازه فایل و تعداد فایل‌های در چرخش پیکربندی کنید. برای مثال، برای چرخش فایل لاگ در هر ۱۰ مگابایت و نگهداری ۵ فایل در چرخش، گزینه‌های \f[CB]filesize=10M,\ filecount=5\f[R] را مشخص کنید. اندازه هدف فایل‌ها تضمین نمی‌شود که دقیق باشد و صرفاً یک مقدار تقریبی است. فایل‌ها به طور پیش‌فرض با حداکثر ۵ فایل چرخشی با اندازه هدف ۲۰ مگابایت چرخش می‌یابند، مگر اینکه خلاف آن پیکربندی شود. مشخص کردن \f[CB]filecount=0\f[R] به این معنی است که فایل لاگ نباید چرخش یابد. احتمال بازنویسی روی فایل لاگ از پیش موجود وجود دارد. .SS "حالت خروجی \-Xlog (\-Xlog Output Mode)" .PP به طور پیش‌فرض پیام‌های لاگ به صورت همگام (synchronously) خروجی داده می‌شوند؛ یعنی هر پیام لاگ هنگام فراخوانی لاگ در خروجی تعیین‌شده نوشته می‌شود. اما می‌توانید به جای آن با مشخص کردن گزینه زیر از حالت لاگ ناهمگام (asynchronous) استفاده کنید: .TP .B \f[CB]\-Xlog:async\f[R] تمام لاگ‌ها را به صورت ناهمگام می‌نویسد. .RS .RE .PP در حالت لاگ ناهمگام، محل‌های ثبت لاگ تمام پیام‌های لاگ را در یک بافر میانی صف‌بندی می‌کنند و یک رشته (thread) مستقل مسئول تخلیه (flush) آن‌ها به خروجی‌های مربوطه است. بافر میانی محدود (bounded) است و در صورت پر شدن بافر، پیامی که در حال صف‌بندی است دور انداخته می‌شود. عملیات نوشتن ورودی‌های لاگ تضمین شده است که غیرمسدودکننده (non\-blocking) باشد. .PP گزینه \f[CB]\-XX:AsyncLogBufferSize=N\f[R] بودجه حافظه را بر حسب بایت برای بافر میانی مشخص می‌کند. مقدار پیش‌فرض باید به اندازه کافی بزرگ باشد تا پاسخگوی اکثر موارد باشد. کاربران در صورت نیاز می‌توانند یک مقدار سفارشی ارائه دهند تا سربار حافظه را فدای دقت لاگ یا برعکس نمایند. .SS "تزیینات و متادیتای لاگ (Decorations)" .PP پیام‌های لاگ با اطلاعاتی درباره پیام تزیین می‌شوند. می‌توانید هر خروجی را برای استفاده از یک مجموعه سفارشی از تزیین‌کننده‌ها پیکربندی کنید. ترتیب خروجی همیشه همان ترتیبی است که در جدول فهرست شده است. می‌توانید تزییناتی را که قرار است در زمان اجرا استفاده شوند پیکربندی کنید. تزیینات به ابتدای پیام لاگ الحاق می‌شوند. برای مثال: .IP .nf \f[CB] [6.567s][info][gc,old]\ Old\ collection\ complete \f[R] .fi .PP حذف \f[CB]decorators\f[R] به طور پیش‌فرض روی \f[CB]uptime\f[R]، \f[CB]level\f[R] و \f[CB]tags\f[R] تنظیم می‌شود. تزیین‌کننده \f[CB]none\f[R] خاص است و برای خاموش کردن تمام تزیینات استفاده می‌شود. .PP تزیین‌کننده‌های \f[CB]time\f[R] (\f[CB]t\f[R])، \f[CB]utctime\f[R] (\f[CB]utc\f[R])، \f[CB]uptime\f[R] (\f[CB]u\f[R])، \f[CB]timemillis\f[R] (\f[CB]tm\f[R])، \f[CB]uptimemillis\f[R] (\f[CB]um\f[R])، \f[CB]timenanos\f[R] (\f[CB]tn\f[R])، \f[CB]uptimenanos\f[R] (\f[CB]un\f[R])، \f[CB]hostname\f[R] (\f[CB]hn\f[R])، \f[CB]pid\f[R] (\f[CB]p\f[R])، \f[CB]tid\f[R] (\f[CB]ti\f[R])، \f[CB]level\f[R] (\f[CB]l\f[R]) و \f[CB]tags\f[R] (\f[CB]tg\f[R]) را نیز می‌توان به عنوان \f[CB]none\f[R] برای نداشتن هیچ تزیینی مشخص کرد. .PP .TS tab(@); lw(14.9n) lw(55.1n). T{ تزیینات T}@T{ توضیحات T} _ T{ \f[CB]time\f[R] یا \f[CB]t\f[R] T}@T{ زمان و تاریخ جاری در قالب ISO\-8601. T} T{ \f[CB]utctime\f[R] یا \f[CB]utc\f[R] T}@T{ زمان هماهنگ جهانی (UTC). T} T{ \f[CB]uptime\f[R] یا \f[CB]u\f[R] T}@T{ زمان سپری‌شده از زمان شروع JVM بر حسب ثانیه و میلی‌ثانیه. برای مثال، 6.567s. T} T{ \f[CB]timemillis\f[R] یا \f[CB]tm\f[R] T}@T{ همان مقداری که توسط \f[CB]System.currentTimeMillis()\f[R] تولید می‌شود. T} T{ \f[CB]uptimemillis\f[R] یا \f[CB]um\f[R] T}@T{ میلی‌ثانیه‌های سپری‌شده از زمان راه‌اندازی JVM. T} T{ \f[CB]timenanos\f[R] یا \f[CB]tn\f[R] T}@T{ همان مقداری که توسط \f[CB]System.nanoTime()\f[R] تولید می‌شود. T} T{ \f[CB]uptimenanos\f[R] یا \f[CB]un\f[R] T}@T{ نانوثانیه‌های سپری‌شده از زمان راه‌اندازی JVM. T} T{ \f[CB]hostname\f[R] یا \f[CB]hn\f[R] T}@T{ نام میزبان (hostname). T} T{ \f[CB]pid\f[R] یا \f[CB]p\f[R] T}@T{ شناسه فرآیند (process identifier). T} T{ \f[CB]tid\f[R] یا \f[CB]ti\f[R] T}@T{ شناسه رشته (thread identifier). T} T{ \f[CB]level\f[R] یا \f[CB]l\f[R] T}@T{ سطح مرتبط با پیام لاگ. T} T{ \f[CB]tags\f[R] یا \f[CB]tg\f[R] T}@T{ مجموعه تگ‌های مرتبط با پیام لاگ. T} .TE .SS "تبدیل پرچم‌های لاگ جمع‌آوری زباله به Xlog (Convert GC Logging Flags to Xlog)" .PP .TS tab(@); lw(22.4n) lw(16.5n) lw(31.2n). T{ پرچم قدیمی جمع‌آوری زباله (GC) T}@T{ پیکربندی Xlog T}@T{ توضیحات T} _ T{ \f[CB]G1PrintHeapRegions\f[R] T}@T{ \f[CB]\-Xlog:gc+region=trace\f[R] T}@T{ قابل اعمال نیست T} T{ \f[CB]GCLogFileSize\f[R] T}@T{ پیکربندی در دسترس نیست T}@T{ چرخش فایل‌های لاگ توسط چارچوب مدیریت می‌شود. T} T{ \f[CB]NumberOfGCLogFiles\f[R] T}@T{ قابل اعمال نیست T}@T{ چرخش فایل‌های لاگ توسط چارچوب مدیریت می‌شود. T} T{ \f[CB]PrintAdaptiveSizePolicy\f[R] T}@T{ \f[CB]\-Xlog:gc+ergo*=\f[R]\f[I]level\f[R] T}@T{ برای اکثر اطلاعات از \f[I]level\f[R] برابر با \f[CB]debug\f[R] استفاده کنید، یا از \f[I]level\f[R] برابر با \f[CB]trace\f[R] برای تمام مواردی که برای \f[CB]PrintAdaptiveSizePolicy\f[R] لاگ می‌شد استفاده نمایید. T} T{ \f[CB]PrintGC\f[R] T}@T{ \f[CB]\-Xlog:gc\f[R] T}@T{ قابل اعمال نیست T} T{ \f[CB]PrintGCApplicationConcurrentTime\f[R] T}@T{ \f[CB]\-Xlog:safepoint\f[R] T}@T{ توجه داشته باشید که \f[CB]PrintGCApplicationConcurrentTime\f[R] و \f[CB]PrintGCApplicationStoppedTime\f[R] با همان تگ لاگ می‌شوند و در سیستم لاگ جدید از یکدیگر تفکیک نشده‌اند. T} T{ \f[CB]PrintGCApplicationStoppedTime\f[R] T}@T{ \f[CB]\-Xlog:safepoint\f[R] T}@T{ توجه داشته باشید که \f[CB]PrintGCApplicationConcurrentTime\f[R] و \f[CB]PrintGCApplicationStoppedTime\f[R] با همان تگ لاگ می‌شوند و در سیستم لاگ جدید تفکیک نشده‌اند. T} T{ \f[CB]PrintGCCause\f[R] T}@T{ قابل اعمال نیست T}@T{ علت GC اکنون همیشه لاگ می‌شود. T} T{ \f[CB]PrintGCDateStamps\f[R] T}@T{ قابل اعمال نیست T}@T{ برچسب‌های تاریخ توسط چارچوب لاگ می‌شوند. T} T{ \f[CB]PrintGCDetails\f[R] T}@T{ \f[CB]\-Xlog:gc*\f[R] T}@T{ قابل اعمال نیست T} T{ \f[CB]PrintGCID\f[R] T}@T{ قابل اعمال نیست T}@T{ شناسه GC اکنون همیشه لاگ می‌شود. T} T{ \f[CB]PrintGCTaskTimeStamps\f[R] T}@T{ \f[CB]\-Xlog:gc+task*=debug\f[R] T}@T{ قابل اعمال نیست T} T{ \f[CB]PrintGCTimeStamps\f[R] T}@T{ قابل اعمال نیست T}@T{ برچسب‌های زمان توسط چارچوب لاگ می‌شوند. T} T{ \f[CB]PrintHeapAtGC\f[R] T}@T{ \f[CB]\-Xlog:gc+heap=trace\f[R] T}@T{ قابل اعمال نیست T} T{ \f[CB]PrintReferenceGC\f[R] T}@T{ \f[CB]\-Xlog:gc+ref*=debug\f[R] T}@T{ توجه داشته باشید که در سیستم لاگ قدیمی، \f[CB]PrintReferenceGC\f[R] تنها در صورتی اثر داشت که \f[CB]PrintGCDetails\f[R] نیز فعال شده باشد. T} T{ \f[CB]PrintStringDeduplicationStatistics\f[R] T}@T{ \f[CB]\-Xlog:gc+stringdedup*=debug\f[R] T}@T{ قابل اعمال نیست T} T{ \f[CB]PrintTenuringDistribution\f[R] T}@T{ \f[CB]\-Xlog:gc+age*=\f[R]\f[I]level\f[R] T}@T{ برای مرتبط‌ترین اطلاعات از \f[I]level\f[R] برابر با \f[CB]debug\f[R] استفاده کنید، یا از \f[I]level\f[R] برابر با \f[CB]trace\f[R] برای تمام مواردی که برای \f[CB]PrintTenuringDistribution\f[R] لاگ می‌شد استفاده نمایید. T} T{ \f[CB]UseGCLogFileRotation\f[R] T}@T{ قابل اعمال نیست T}@T{ چرخش فایل‌های لاگ توسط چارچوب مدیریت می‌شود. T} .TE .SS "تبدیل پرچم‌های لاگ زمان اجرا به Xlog (Convert Runtime Logging Flags to Xlog)" .PP این پرچم‌های قدیمی دیگر شناسایی نمی‌شوند و در صورت استفاده مستقیم باعث بروز خطا خواهند شد. به‌جای آن‌ها از معادل لاگ یکپارچه (Unified Logging) آن‌ها استفاده کنید. .PP .TS tab(@); lw(15.0n) lw(20.2n) lw(34.7n). T{ پرچم قدیمی زمان اجرا T}@T{ پیکربندی Xlog T}@T{ توضیحات T} _ T{ \f[CB]TraceExceptions\f[R] T}@T{ \f[CB]\-Xlog:exceptions=info\f[R] T}@T{ قابل اعمال نیست T} T{ \f[CB]TraceClassLoading\f[R] T}@T{ \f[CB]\-Xlog:class+load=\f[R]\f[I]level\f[R] T}@T{ از \f[I]level\f[R]=\f[CB]info\f[R] برای اطلاعات عادی، یا از \f[I]level\f[R]=\f[CB]debug\f[R] برای اطلاعات تکمیلی استفاده کنید. در نحو لاگ یکپارچه، \f[CB]\-verbose:class\f[R] معادل \f[CB]\-Xlog:class+load=info,class+unload=info\f[R] است. T} T{ \f[CB]TraceClassLoadingPreorder\f[R] T}@T{ \f[CB]\-Xlog:class+preorder=debug\f[R] T}@T{ قابل اعمال نیست T} T{ \f[CB]TraceClassUnloading\f[R] T}@T{ \f[CB]\-Xlog:class+unload=\f[R]\f[I]level\f[R] T}@T{ از \f[I]level\f[R]=\f[CB]info\f[R] برای اطلاعات عادی، یا از \f[I]level\f[R]=\f[CB]trace\f[R] برای اطلاعات تکمیلی استفاده کنید. در نحو لاگ یکپارچه، \f[CB]\-verbose:class\f[R] معادل \f[CB]\-Xlog:class+load=info,class+unload=info\f[R] است. T} T{ \f[CB]VerboseVerification\f[R] T}@T{ \f[CB]\-Xlog:verification=info\f[R] T}@T{ قابل اعمال نیست T} T{ \f[CB]TraceClassPaths\f[R] T}@T{ \f[CB]\-Xlog:class+path=info\f[R] T}@T{ قابل اعمال نیست T} T{ \f[CB]TraceClassResolution\f[R] T}@T{ \f[CB]\-Xlog:class+resolve=debug\f[R] T}@T{ قابل اعمال نیست T} T{ \f[CB]TraceClassInitialization\f[R] T}@T{ \f[CB]\-Xlog:class+init=info\f[R] T}@T{ قابل اعمال نیست T} T{ \f[CB]TraceLoaderConstraints\f[R] T}@T{ \f[CB]\-Xlog:class+loader+constraints=info\f[R] T}@T{ قابل اعمال نیست T} T{ \f[CB]TraceClassLoaderData\f[R] T}@T{ \f[CB]\-Xlog:class+loader+data=\f[R]\f[I]level\f[R] T}@T{ از \f[I]level\f[R]=\f[CB]debug\f[R] برای اطلاعات عادی یا از \f[I]level\f[R]=\f[CB]trace\f[R] برای اطلاعات تکمیلی استفاده کنید. T} T{ \f[CB]TraceSafepointCleanupTime\f[R] T}@T{ \f[CB]\-Xlog:safepoint+cleanup=info\f[R] T}@T{ قابل اعمال نیست T} T{ \f[CB]TraceSafepoint\f[R] T}@T{ \f[CB]\-Xlog:safepoint=debug\f[R] T}@T{ قابل اعمال نیست T} T{ \f[CB]TraceMonitorInflation\f[R] T}@T{ \f[CB]\-Xlog:monitorinflation=debug\f[R] T}@T{ قابل اعمال نیست T} T{ \f[CB]TraceBiasedLocking\f[R] T}@T{ \f[CB]\-Xlog:biasedlocking=\f[R]\f[I]level\f[R] T}@T{ از \f[I]level\f[R]=\f[CB]info\f[R] برای اطلاعات عادی، یا از \f[I]level\f[R]=\f[CB]trace\f[R] برای اطلاعات تکمیلی استفاده کنید. T} T{ \f[CB]TraceRedefineClasses\f[R] T}@T{ \f[CB]\-Xlog:redefine+class*=\f[R]\f[I]level\f[R] T}@T{ سطوح \f[I]level\f[R]=\f[CB]info\f[R]، \f[CB]debug\f[R] و \f[CB]trace\f[R] مقادیر فزاینده‌ای از اطلاعات را ارائه می‌دهند. T} .TE .SS "مثال‌های استفاده از \-Xlog (\-Xlog Usage Examples)" .PP در ادامه مثال‌هایی از \f[CB]\-Xlog\f[R] آورده شده است. .TP .B \f[CB]\-Xlog\f[R] تمام پیام‌ها را با استفاده از سطح \f[CB]info\f[R] به \f[CB]stdout\f[R] همراه با تزئینات \f[CB]uptime\f[R]، \f[CB]levels\f[R] و \f[CB]tags\f[R] لاگ می‌کند. این معادل استفاده از دستور زیر است: .RS .RS .PP \f[CB]\-Xlog:all=info:stdout:uptime,levels,tags\f[R] .RE .RE .TP .B \f[CB]\-Xlog:gc\f[R] پیام‌های برچسب‌خورده با تگ \f[CB]gc\f[R] را با استفاده از سطح \f[CB]info\f[R] به \f[CB]stdout\f[R] لاگ می‌کند. پیکربندی پیش‌فرض برای سایر پیام‌ها در سطح \f[CB]warning\f[R] برقرار است. .RS .RE .TP .B \f[CB]\-Xlog:gc,safepoint\f[R] پیام‌های برچسب‌خورده با تگ‌های \f[CB]gc\f[R] یا \f[CB]safepoint\f[R] را، هر دو با استفاده از سطح \f[CB]info\f[R]، به \f[CB]stdout\f[R] همراه با تزئینات پیش‌فرض لاگ می‌کند. پیام‌های برچسب‌خورده با هر دو تگ \f[CB]gc\f[R] و \f[CB]safepoint\f[R] لاگ نخواهند شد. .RS .RE .TP .B \f[CB]\-Xlog:gc+ref=debug\f[R] پیام‌های برچسب‌خورده با هر دو تگ \f[CB]gc\f[R] و \f[CB]ref\f[R] را با استفاده از سطح \f[CB]debug\f[R] به \f[CB]stdout\f[R] همراه با تزئینات پیش‌فرض لاگ می‌کند. پیام‌هایی که تنها با یکی از این دو تگ برچسب خورده‌اند لاگ نخواهند شد. .RS .RE .TP .B \f[CB]\-Xlog:gc=debug:file=gc.txt:none\f[R] پیام‌های برچسب‌خورده با تگ \f[CB]gc\f[R] را با استفاده از سطح \f[CB]debug\f[R] در فایلی به نام \f[CB]gc.txt\f[R] بدون هیچ تزئینی لاگ می‌کند. پیکربندی پیش‌فرض برای سایر پیام‌ها در سطح \f[CB]warning\f[R] همچنان برقرار است. .RS .RE .TP .B \f[CB]\-Xlog:gc=trace:file=gctrace.txt:uptimemillis,pids:filecount=5,filesize=1024\f[R] پیام‌های برچسب‌خورده با تگ \f[CB]gc\f[R] را با استفاده از سطح \f[CB]trace\f[R] در مجموعه‌ای چرخشی از ۵ فایل با اندازه ۱ مگابایت با نام پایه \f[CB]gctrace.txt\f[R] لاگ کرده و از تزئینات \f[CB]uptimemillis\f[R] و \f[CB]pid\f[R] استفاده می‌کند. .RS .PP پیکربندی پیش‌فرض برای سایر پیام‌ها در سطح \f[CB]warning\f[R] همچنان برقرار است. .RE .TP .B \f[CB]\-Xlog:gc::uptime,tid\f[R] پیام‌های برچسب‌خورده با تگ \f[CB]gc\f[R] را با استفاده از سطح پیش‌فرض \[aq]info\[aq] به خروجی پیش‌فرض \f[CB]stdout\f[R] لاگ کرده و از تزئینات \f[CB]uptime\f[R] و \f[CB]tid\f[R] استفاده می‌کند. پیکربندی پیش‌فرض برای سایر پیام‌ها در سطح \f[CB]warning\f[R] همچنان برقرار است. .RS .RE .TP .B \f[CB]\-Xlog:gc*=info,safepoint*=off\f[R] پیام‌های برچسب‌خورده با حداقل تگ \f[CB]gc\f[R] را با استفاده از سطح \f[CB]info\f[R] لاگ می‌کند، اما لاگ پیام‌های برچسب‌خورده با \f[CB]safepoint\f[R] را خاموش می‌نماید. پیام‌های برچسب‌خورده با هر دو تگ \f[CB]gc\f[R] و \f[CB]safepoint\f[R] لاگ نخواهند شد. .RS .RE .TP .B \f[CB]\-Xlog:disable\ \-Xlog:safepoint=trace:safepointtrace.txt\f[R] تمام لاگ‌ها، شامل هشدارها و خطاها را غیرفعال کرده و سپس پیام‌های برچسب‌خورده با \f[CB]safepoint\f[R] را با استفاده از سطح \f[CB]trace\f[R] در فایل \f[CB]safepointtrace.txt\f[R] فعال می‌کند. پیکربندی پیش‌فرض اعمال نمی‌شود، زیرا خط فرمان با \f[CB]\-Xlog:disable\f[R] شروع شده است. .RS .RE .SS "مثال‌های پیچیده استفاده از \-Xlog (Complex \-Xlog Usage Examples)" .PP در ادامه چند مثال پیچیده از استفاده از گزینه \f[CB]\-Xlog\f[R] شرح داده شده است. .TP .B \f[CB]\-Xlog:gc+class*=debug\f[R] پیام‌های برچسب‌خورده با حداقل تگ‌های \f[CB]gc\f[R] و \f[CB]class\f[R] را با استفاده از سطح \f[CB]debug\f[R] به \f[CB]stdout\f[R] لاگ می‌کند. پیکربندی پیش‌فرض برای سایر پیام‌ها در سطح \f[CB]warning\f[R] همچنان برقرار است. .RS .RE .TP .B \f[CB]\-Xlog:gc+meta*=trace,class*=off:file=gcmetatrace.txt\f[R] پیام‌های برچسب‌خورده با حداقل تگ‌های \f[CB]gc\f[R] و \f[CB]meta\f[R] را با استفاده از سطح \f[CB]trace\f[R] در فایل \f[CB]metatrace.txt\f[R] لاگ می‌کند، اما تمام پیام‌های برچسب‌خورده با \f[CB]class\f[R] را خاموش می‌نماید. پیام‌های برچسب‌خورده با \f[CB]gc\f[R]، \f[CB]meta\f[R] و \f[CB]class\f[R] لاگ نخواهند شد چرا که \f[CB]class*\f[R] روی خاموش تنظیم شده است. پیکربندی پیش‌فرض برای سایر پیام‌ها در سطح \f[CB]warning\f[R] برقرار است به جز مواردی که شامل \f[CB]class\f[R] هستند. .RS .RE .TP .B \f[CB]\-Xlog:gc+meta=trace\f[R] پیام‌های برچسب‌خورده با دقیقاً تگ‌های \f[CB]gc\f[R] و \f[CB]meta\f[R] را با استفاده از سطح \f[CB]trace\f[R] به \f[CB]stdout\f[R] لاگ می‌کند. پیکربندی پیش‌فرض برای سایر پیام‌ها در سطح \f[CB]warning\f[R] همچنان برقرار است. .RS .RE .TP .B \f[CB]\-Xlog:gc+class+heap*=debug,meta*=warning,threads*=off\f[R] پیام‌های برچسب‌خورده با حداقل تگ‌های \f[CB]gc\f[R]، \f[CB]class\f[R] و \f[CB]heap\f[R] را با استفاده از سطح \f[CB]trace\f[R] به \f[CB]stdout\f[R] لاگ می‌کند، اما فقط پیام‌های برچسب‌خورده با \f[CB]meta\f[R] را با سطح مربوطه لاگ می‌نماید. پیکربندی پیش‌فرض برای سایر پیام‌ها در سطح \f[CB]warning\f[R] برقرار است به جز مواردی که شامل \f[CB]threads\f[R] هستند. .RS .RE .SH "اعتبارسنجی آرگومان‌های پرچم ماشین مجازی جاوا (VALIDATE JAVA VIRTUAL MACHINE FLAG ARGUMENTS)" .PP شما از مقادیر ارائه‌شده به تمام پرچم‌های خط فرمان ماشین مجازی جاوا (JVM) برای اعتبارسنجی استفاده می‌کنید و اگر مقدار ورودی نامعتبر یا خارج از محدوده باشد، پیام خطای مناسبی نمایش داده می‌شود. .PP چه به‌صورت ارگونومیک، در خط فرمان، توسط یک ابزار ورودی یا از طریق APIها (به‌عنوان مثال، کلاس‌های موجود در بسته \f[CB]java.lang.management\f[R]) تنظیم شده باشند، مقادیر ارائه‌شده به تمام پرچم‌های خط فرمان ماشین مجازی جاوا (JVM) اعتبارسنجی می‌شوند. ارگونومی در راهنمای تنظیم جمع‌آوری زباله ماشین مجازی HotSpot ویرایش استاندارد پلتفرم جاوا شرح داده شده است. .PP محدوده و محدودیت‌ها یا زمانی که تمام پرچم‌ها مقادیر خود را در طول مقداردهی اولیه JVM تنظیم می‌کنند و یا زمانی که مقدار یک پرچم در زمان اجرا تغییر می‌کند (به‌عنوان مثال با استفاده از ابزار \f[CB]jcmd\f[R]) اعتبارسنجی می‌شوند. اگر مقداری بررسی محدوده یا محدودیت را نقض کند، JVM خاتمه می‌یابد و پیام خطای مناسبی در جریان خطا چاپ می‌شود. .PP به‌عنوان مثال، اگر یک پرچم بررسی محدوده یا محدودیت را نقض کند، JVM با خطا خارج می‌شود: .IP .nf \f[CB] java \-XX:AllocatePrefetchStyle=5 \-version intx AllocatePrefetchStyle=5 is outside the allowed range [ 0 ... 3 ] Improperly specified VM option \[aq]AllocatePrefetchStyle=5\[aq] Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit. \f[R] .fi .PP پرچم \f[CB]\-XX:+PrintFlagsRanges\f[R] محدوده تمام پرچم‌ها را چاپ می‌کند. این پرچم امکان آزمایش خودکار پرچم‌ها را بر اساس مقادیر ارائه‌شده توسط محدوده‌ها فراهم می‌کند. برای پرچم‌هایی که محدوده‌های آن‌ها مشخص شده است، نوع، نام و محدوده واقعی در خروجی چاپ می‌شود. .PP به‌عنوان مثال: .IP .nf \f[CB] intx ThreadStackSize [ 0 ... 9007199254740987 ] {pd product} \f[R] .fi .PP برای پرچم‌هایی که محدوده آن‌ها مشخص نشده است، مقادیر در خروجی نمایش داده نمی‌شوند. به‌عنوان مثال: .IP .nf \f[CB] size_t NewSize [ ... ] {product} \f[R] .fi .PP این امر به شناسایی پرچم‌هایی که نیاز به پیاده‌سازی دارند کمک می‌کند. چارچوب آزمایش خودکار می‌تواند پرچم‌هایی را که فاقد مقدار هستند و پیاده‌سازی نشده‌اند نادیده بگیرد. .SH "صفحات بزرگ حافظه (LARGE PAGES)" .PP شما از صفحات بزرگ (Large Pages) که به عنوان صفحات غول‌پیکر (Huge Pages) نیز شناخته می‌شوند، به‌عنوان صفحات حافظه‌ای استفاده می‌کنید که به‌طور قابل توجهی بزرگتر از اندازه استاندارد صفحه حافظه هستند (که بسته به پردازنده و سیستم‌عامل متفاوت است). صفحات بزرگ بافرهای ترجمه آدرس (Translation\-Lookaside Buffers / TLB) پردازنده را بهینه‌سازی می‌کنند. .PP یک بافر ترجمه آدرس (TLB) یک کش ترجمه صفحه است که ترجمه‌های آدرس مجازی به فیزیکی اخیراً استفاده‌شده را نگه می‌دارد. بافر TLB یک منبع سیستمی کمیاب است. نبود داده در TLB (اصطلاحاً TLB miss) می‌تواند پرهزینه باشد زیرا پردازنده باید از جدول صفحه سلسله‌مراتبی بخواند که ممکن است نیاز به چندین دسترسی به حافظه داشته باشد. با استفاده از اندازه صفحه حافظه بزرگتر، یک ورودی TLB می‌تواند محدوده حافظه بزرگتری را نشان دهد. این امر منجر به فشار کمتر بر روی TLB می‌شود و برنامه‌های پرمصرف از نظر حافظه ممکن است کارایی بهتری داشته باشند. .PP با این حال، استفاده از صفحات بزرگ می‌تواند بر کارایی سیستم تأثیر منفی بگذارد. به‌عنوان مثال، هنگامی که مقدار زیادی از حافظه توسط یک برنامه پین (Pin) می‌شود، ممکن است کمبود حافظه معمولی ایجاد کند و باعث صفحه‌بندی (Paging) بیش از حد در سایر برنامه‌ها شده و کل سیستم را کند کند. همچنین، سیستمی که برای مدت طولانی روشن بوده است می‌تواند تکه‌تکه‌شدگی (Fragmentation) بیش از حد ایجاد کند که ممکن است رزرو حافظه کافی برای صفحات بزرگ را غیرممکن سازد. هنگامی که این اتفاق می‌افتد، سیستم‌عامل یا JVM به استفاده از صفحات معمولی برمی‌گردند. .PP لینوکس و ویندوز از صفحات بزرگ پشتیبانی می‌کنند. .SS "پشتیبانی از صفحات بزرگ در لینوکس (Large Pages Support for Linux)" .PP لینوکس از نسخه 2.6 از صفحات بزرگ پشتیبانی می‌کند. برای بررسی اینکه آیا محیط شما از صفحات بزرگ پشتیبانی می‌کند، دستور زیر را امتحان کنید: .IP .nf \f[CB] # cat /proc/meminfo | grep Huge HugePages_Total: 0 HugePages_Free: 0 \&... Hugepagesize: 2048 kB \f[R] .fi .PP اگر خروجی شامل مواردی با پیشوند "Huge" باشد، سیستم شما از صفحات بزرگ پشتیبانی می‌کند. مقادیر ممکن است بسته به محیط متفاوت باشد. فیلد \f[CB]Hugepagesize\f[R] اندازه پیش‌فرض صفحه بزرگ را در محیط شما نشان می‌دهد و سایر فیلدها جزئیات صفحات بزرگ با این اندازه را نمایش می‌دهند. هسته‌های جدیدتر از چندین اندازه صفحه بزرگ پشتیبانی می‌کنند. برای فهرست کردن اندازه‌های پشتیبانی‌شده، دستور زیر را اجرا کنید: .IP .nf \f[CB] # ls /sys/kernel/mm/hugepages/ hugepages\-1048576kB hugepages\-2048kB \f[R] .fi .PP محیط بالا از صفحات بزرگ 2 مگابایت و 1 گیگابایت پشتیبانی می‌کند، اما باید پیکربندی شوند تا JVM بتواند از آن‌ها استفاده کند. هنگام استفاده از صفحات بزرگ و عدم فعال‌سازی صفحات بزرگ شفاف (گزینه \f[CB]\-XX:+UseTransparentHugePages\f[R])، تعداد صفحات بزرگ باید از قبل تخصیص یابد. به‌عنوان مثال، برای فعال کردن 8 گیگابایت حافظه با صفحات بزرگ 2 مگابایتی، با کاربر \f[CB]root\f[R] وارد شوید و دستور زیر را اجرا کنید: .RS .PP \f[CB]# echo 4096 > /sys/kernel/mm/hugepages/hugepages\-2048kB/nr_hugepages\f[R] .RE .PP همیشه توصیه می‌شود پس از درخواست، مقدار \f[CB]nr_hugepages\f[R] را بررسی کنید تا مطمئن شوید هسته توانسته تعداد صفحات بزرگ درخواستی را تخصیص دهد. .PP هنگام استفاده از گزینه \f[CB]\-XX:+UseSHM\f[R] برای فعال‌سازی صفحات بزرگ، همچنین باید مطمئن شوید که پارامتر \f[CB]SHMMAX\f[R] به‌گونه‌ای پیکربندی شده است که اجازه تخصیص قطعات حافظه مشترک به اندازه کافی بزرگ را می‌دهد. برای مجاز ساختن حداکثر قطعه اشتراکی 8 گیگابایت، با کاربر \f[CB]root\f[R] وارد شوید و دستور زیر را اجرا کنید: .RS .PP \f[CB]# echo 8589934592 > /proc/sys/kernel/shmmax\f[R] .RE .PP در برخی محیط‌ها این کار لازم نیست زیرا مقدار پیش‌فرض به اندازه کافی بزرگ است، اما مهم است که اطمینان حاصل کنید مقدار آن به اندازه کافی بزرگ است تا مقدار حافظه در نظر گرفته شده برای صفحات بزرگ را در خود جای دهد. .RS .PP \f[B]نکته:\f[R] مقادیر موجود در \f[CB]/proc\f[R] و \f[CB]/sys\f[R] پس از راه‌اندازی مجدد سیستم بازنشانی می‌شوند، بنابراین ممکن است بخواهید آن‌ها را در یک اسکریپت مقداردهی اولیه (به‌عنوان مثال \f[CB]rc.local\f[R] یا \f[CB]sysctl.conf\f[R]) تنظیم کنید. .RE .PP اگر پارامترهای هسته سیستم‌عامل را برای فعال‌سازی استفاده از صفحات بزرگ پیکربندی کنید، فرایندهای جاوا ممکن است صفحات بزرگ را برای هیپ جاوا و همچنین سایر نواحی داخلی تخصیص دهند، به‌عنوان مثال: .IP \[bu] 2 کش کد (Code cache) .IP \[bu] 2 بیت‌مپ‌های نشانه‌گذاری (Marking bitmaps) .PP در نتیجه، اگر پارامتر \f[CB]nr_hugepages\f[R] را برابر با اندازه هیپ جاوا پیکربندی کنید، ممکن است JVM همچنان در تخصیص هیپ با استفاده از صفحات بزرگ شکست بخورد زیرا سایر نواحی مانند کش کد ممکن است قبلاً بخشی از صفحات بزرگ پیکربندی‌شده را مصرف کرده باشند. .SS "پشتیبانی از صفحات بزرگ در ویندوز (Large Pages Support for Windows)" .PP برای استفاده از پشتیبانی صفحات بزرگ در ویندوز، مدیر سیستم ابتدا باید امتیازات اضافی را به کاربری که برنامه را اجرا می‌کند اختصاص دهد: .IP "1." 3 گزینه \f[B]Control Panel\f[R]، سپس \f[B]Administrative Tools\f[R] و سپس \f[B]Local Security Policy\f[R] را انتخاب کنید. .IP "2." 3 گزینه \f[B]Local Policies\f[R] و سپس \f[B]User Rights Assignment\f[R] را انتخاب کنید. .IP "3." 3 روی \f[B]Lock pages in memory\f[R] دوبار کلیک کرده و کاربران یا گروه‌ها را اضافه کنید. .IP "4." 3 سیستم خود را مجدداً راه‌اندازی (Reboot) کنید. .PP توجه داشته باشید که این مراحل حتی اگر مدیر سیستم برنامه را اجرا کند نیز الزامی است، زیرا مدیران سیستم به‌طور پیش‌فرض امتیاز قفل کردن صفحات در حافظه را ندارند. .SH "اشتراک‌گذاری داده‌های کلاس برنامه (APPLICATION CLASS DATA SHARING)" .PP قابلیت اشتراک‌گذاری داده‌های کلاس برنامه (AppCDS) کلاس‌های مورد استفاده برنامه‌های شما را در یک فایل آرشیو ذخیره می‌کند. از آنجا که این کلاس‌ها در قالبی ذخیره می‌شوند که می‌توانند بسیار سریع بارگذاری شوند (در مقایسه با کلاس‌های ذخیره‌شده در یک فایل JAR)، AppCDS می‌تواند زمان راه‌اندازی برنامه‌های شما را بهبود بخشد. علاوه بر این، AppCDS می‌تواند با به اشتراک گذاشتن بخش‌هایی از این کلاس‌ها در چندین فرایند، ردپای حافظه زمان اجرا را کاهش دهد. .PP کلاس‌ها در آرشیو CDS در قالبی بهینه‌سازی‌شده ذخیره می‌شوند که حدود 2 تا 5 برابر بزرگتر از کلاس‌های ذخیره‌شده در فایل‌های JAR یا ایمیج زمان اجرای JDK است. بنابراین، ایده خوبی است که فقط کلاس‌هایی را که واقعاً توسط برنامه شما استفاده می‌شوند آرشیو کنید. این کلاس‌ها معمولاً تنها بخش کوچکی از تمام کلاس‌های موجود هستند. به‌عنوان مثال، برنامه شما ممکن است تنها از چند API ارائه‌شده توسط یک کتابخانه بزرگ استفاده کند. .SS "استفاده از آرشیوهای CDS (Using CDS Archives)" .PP به‌طور پیش‌فرض در بیشتر توزیع‌های JDK، مگر اینکه \f[CB]\-Xshare:off\f[R] مشخص شده باشد، JVM با یک آرشیو CDS پیش‌فرض راه‌اندازی می‌شود که معمولاً در مسیر \f[CB]JAVA_HOME/lib/server/classes.jsa\f[R] (یا \f[CB]JAVA_HOME\\bin\\server\\classes.jsa\f[R] در ویندوز) قرار دارد. این آرشیو حاوی حدود 1300 کلاس کتابخانه اصلی است که توسط بیشتر برنامه‌ها استفاده می‌شوند. .PP برای استفاده از CDS برای مجموعه دقیق کلاس‌های استفاده‌شده توسط برنامه خود، می‌توانید از گزینه \f[CB]\-XX:SharedArchiveFile\f[R] استفاده کنید که ساختار کلی زیر را دارد: .RS .PP \f[CB]\-XX:SharedArchiveFile=:\f[R] .RE .IP \[bu] 2 بخش \f[CB]\f[R] آرشیو پیش‌فرض CDS را بازنویسی می‌کند. .IP \[bu] 2 بخش \f[CB]\f[R] کلاس‌های اضافی را فراهم می‌کند که می‌توانند علاوه بر کلاس‌های موجود در \f[CB]\f[R] بارگذاری شوند. .IP \[bu] 2 در ویندوز، جداکننده مسیر فوق \f[CB]:\f[R] باید با \f[CB];\f[R] جایگزین شود. .PP (نام‌های "ایستا" و "پویا" به دلایل تاریخی استفاده می‌شوند. تنها اهمیت آن‌ها این است که آرشیو "ایستا" ابتدا بارگذاری می‌شود و آرشیو "پویا" در مرتبه دوم بارگذاری می‌شود). .PP ماشین مجازی JVM می‌تواند حداکثر از دو آرشیو استفاده کند. برای استفاده از تنها یک آرشیو تکی \f[CB]\f[R]، می‌توانید بخش \f[CB]\f[R] را حذف کنید: .RS .PP \f[CB]\-XX:SharedArchiveFile=\f[R] .RE .PP برای راحتی، \f[CB]\f[R] مکان \f[CB]\f[R] را ضبط می‌کند. بنابراین، می‌توانید \f[CB]\f[R] را فقط با دستور زیر حذف کنید: .RS .PP \f[CB]\-XX:SharedArchiveFile=\f[R] .RE .SS "ایجاد آرشیوهای CDS (Creating CDS Archives)" .PP آرشیوهای CDS را می‌توان با چندین روش ایجاد کرد: .IP \[bu] 2 \f[CB]\-Xshare:dump\f[R] .IP \[bu] 2 \f[CB]\-XX:ArchiveClassesAtExit\f[R] .IP \[bu] 2 \f[CB]jcmd VM.cds\f[R] .PP یک عملیات مشترک در تمام این روش‌ها یک "اجرای آزمایشی" است که در آن برنامه را یک بار اجرا می‌کنید تا کلاس‌هایی که باید در آرشیو ذخیره شوند تعیین شوند. .SS "ایجاد فایل آرشیو ایستای CDS با \-Xshare:dump (Creating a Static CDS Archive File with \-Xshare:dump)" .PP مراحل زیر یک فایل آرشیو ایستای CDS ایجاد می‌کند که حاوی تمام کلاس‌های استفاده‌شده توسط برنامه \f[CB]test.Hello\f[R] است. .IP "1." 3 فهرستی از تمام کلاس‌های استفاده‌شده توسط برنامه \f[CB]test.Hello\f[R] ایجاد کنید. دستور زیر فایلی به نام \f[CB]hello.classlist\f[R] ایجاد می‌کند که حاوی فهرستی از تمام کلاس‌های استفاده‌شده توسط این برنامه است: .RS 4 .RS .PP \f[CB]java \-Xshare:off \-XX:DumpLoadedClassList=hello.classlist \-cp hello.jar test.Hello\f[R] .RE .PP مسیر کلاسی که با پارامتر \f[CB]\-cp\f[R] مشخص می‌شود باید فقط شامل فایل‌های JAR باشد. .RE .IP "2." 3 یک آرشیو ایستا به نام \f[CB]hello.jsa\f[R] ایجاد کنید که حاوی تمام کلاس‌های موجود در \f[CB]hello.classlist\f[R] باشد: .RS 4 .RS .PP \f[CB]java \-Xshare:dump \-XX:SharedArchiveFile=hello.jsa \-XX:SharedClassListFile=hello.classlist \-cp hello.jar\f[R] .RE .RE .IP "3." 3 برنامه \f[CB]test.Hello\f[R] را با آرشیو \f[CB]hello.jsa\f[R] اجرا کنید: .RS 4 .RS .PP \f[CB]java \-XX:SharedArchiveFile=hello.jsa \-cp hello.jar test.Hello\f[R] .RE .RE .IP "4." 3 \f[B]اختیاری:\f[R] بررسی کنید که برنامه \f[CB]test.Hello\f[R] از کلاس موجود در آرشیو مشترک \f[CB]hello.jsa\f[R] استفاده می‌کند: .RS 4 .RS .PP \f[CB]java \-XX:SharedArchiveFile=hello.jsa \-cp hello.jar \-Xlog:class+load test.Hello\f[R] .RE .PP خروجی این دستور باید شامل متن زیر باشد: .RS .PP \f[CB][info][class,load] test.Hello source: shared objects file\f[R] .RE .RE .SS "ایجاد فایل آرشیو پویای CDS با \-XX:SharedArchiveFile (Creating a Dynamic CDS Archive File with \-XX:SharedArchiveFile)" .PP مزایای آرشیوهای پویای CDS عبارتند از: .IP \[bu] 2 آن‌ها معمولاً از فضای دیسک کمتری استفاده می‌کنند، زیرا نیازی به ذخیره کلاس‌هایی که قبلاً در آرشیو ایستا وجود دارند ندارند. .IP \[bu] 2 آن‌ها با یک مرحله کمتر نسبت به آرشیو ایستای مشابه ایجاد می‌شوند. .PP مراحل زیر یک فایل آرشیو پویای CDS ایجاد می‌کند که حاوی کلاس‌های استفاده‌شده توسط برنامه \f[CB]test.Hello\f[R] است، به استثنای کلاس‌هایی که قبلاً در آرشیو پیش‌فرض CDS قرار دارند. .IP "1." 3 یک آرشیو پویای CDS به نام \f[CB]hello.jsa\f[R] ایجاد کنید که شامل تمام کلاس‌های موجود در \f[CB]hello.jar\f[R] باشد که توسط برنامه \f[CB]test.Hello\f[R] بارگذاری شده‌اند: .RS 4 .RS .PP \f[CB]java \-XX:ArchiveClassesAtExit=hello.jsa \-cp hello.jar Hello\f[R] .RE .RE .IP "2." 3 برنامه \f[CB]test.Hello\f[R] را با آرشیو مشترک \f[CB]hello.jsa\f[R] اجرا کنید: .RS 4 .RS .PP \f[CB]java \-XX:SharedArchiveFile=hello.jsa \-cp hello.jar test.Hello\f[R] .RE .RE .IP "3." 3 \f[B]اختیاری:\f[R] مرحله 4 بخش قبل را تکرار کنید تا مطمئن شوید برنامه \f[CB]test.Hello\f[R] از کلاس موجود در آرشیو مشترک \f[CB]hello.jsa\f[R] استفاده می‌کند. .PP همچنین امکان ایجاد یک آرشیو پویای CDS با یک آرشیو ایستای غیرپیش‌فرض وجود دارد. به‌عنوان مثال: .RS .PP \f[CB]java \-XX:SharedArchiveFile=base.jsa \-XX:ArchiveClassesAtExit=hello.jsa \-cp hello.jar Hello\f[R] .RE .PP برای اجرای برنامه با استفاده از این آرشیو پویای CDS: .RS .PP \f[CB]java \-XX:SharedArchiveFile=base.jsa:hello.jsa \-cp hello.jar Hello\f[R] .RE .PP (در ویندوز، جداکننده مسیر فوق \f[CB]:\f[R] باید با \f[CB];\f[R] جایگزین شود) .PP همان‌طور که در بالا ذکر شد، نام آرشیو ایستا می‌تواند حذف شود: .RS .PP \f[CB]java \-XX:SharedArchiveFile=hello.jsa \-cp hello.jar Hello\f[R] .RE .SS "ایجاد فایل‌های آرشیو CDS با jcmd (Creating CDS Archive Files with jcmd)" .PP دو بخش قبلی نیازمند تغییر اسکریپت راه‌اندازی برنامه برای ایجاد یک آرشیو CDS بودند. گاهی اوقات این کار می‌تواند دشوار باشد، به‌عنوان مثال اگر مسیر کلاس برنامه توسط روال‌های پیچیده‌ای تنظیم شده باشد. .PP دستور \f[CB]jcmd VM.cds\f[R] با اتصال به یک فرایند JVM در حال اجرا، روشی کم‌تهاجم‌تر برای ایجاد آرشیو CDS فراهم می‌کند. می‌توانید یک آرشیو ایستا ایجاد کنید: .RS .PP \f[CB]jcmd VM.cds static_dump my_static_archive.jsa\f[R] .RE .PP یا یک آرشیو پویا: .RS .PP \f[CB]jcmd VM.cds dynamic_dump my_dynamic_archive.jsa\f[R] .RE .PP برای استفاده از فایل آرشیو حاصل در اجرای بعدی برنامه بدون تغییر اسکریپت راه‌اندازی برنامه، می‌توانید از تکنیک زیر استفاده کنید: .RS .PP \f[CB]env JAVA_TOOL_OPTIONS=\-XX:SharedArchiveFile=my_static_archive.jsa bash app_start.sh\f[R] .RE .PP نکته: برای استفاده از \f[CB]jcmd VM.cds dynamic_dump\f[R]، فرایند JVM شناسایی‌شده با \f[CB]\f[R] باید با \f[CB]\-XX:+RecordDynamicDumpInfo\f[R] راه‌اندازی شده باشد، که می‌توان آن را با همان تکنیک به اسکریپت راه‌اندازی برنامه منتقل کرد: .RS .PP \f[CB]env JAVA_TOOL_OPTIONS=\-XX:+RecordDynamicDumpInfo bash app_start.sh\f[R] .RE .SS "محدودیت‌های مسیر کلاس و مسیر ماژول (Restrictions on Class Path and Module Path)" .IP \[bu] 2 نه مسیر کلاس (\f[CB]\-classpath\f[R] و \f[CB]\-Xbootclasspath/a\f[R]) و نه مسیر ماژول (\f[CB]\-\-module\-path\f[R]) نمی‌توانند حاوی دایرکتوری‌های غیرخالی باشند. .IP \[bu] 2 فقط فایل‌های JAR ماژولار در \f[CB]\-\-module\-path\f[R] پشتیبانی می‌شوند. ماژول‌های منفجرشده (Exploded modules) پشتیبانی نمی‌شوند. .IP \[bu] 2 مسیر کلاس استفاده‌شده در زمان ایجاد آرشیو باید مشابه (یا پیشوندی از) مسیر کلاس استفاده‌شده در زمان اجرا باشد. (چنین الزامی برای مسیر ماژول وجود ندارد). .IP \[bu] 2 اگر پس از تولید آرشیو، هر یک از فایل‌های JAR در مسیر کلاس یا مسیر ماژول تغییر کنند، آرشیو CDS نمی‌تواند بارگذاری شود. .IP \[bu] 2 اگر هر یک از گزینه‌های VM شامل \f[CB]\-\-upgrade\-module\-path\f[R]، \f[CB]\-\-patch\-module\f[R] یا \f[CB]\-\-limit\-modules\f[R] مشخص شوند، CDS غیرفعال می‌شود. این بدان معناست که JVM بدون بارگذاری هیچ آرشیو CDS اجرا خواهد شد. علاوه بر این، اگر تلاش کنید با مشخص کردن هر یک از این 3 گزینه یک آرشیو CDS ایجاد کنید، JVM خطا گزارش خواهد داد. .SH "مثال‌های تنظیم کارایی (PERFORMANCE TUNING EXAMPLES)" .PP می‌توانید از گزینه‌های پیشرفته زمان اجرای جاوا برای بهینه‌سازی کارایی برنامه‌های خود استفاده کنید. .SS "تنظیم برای توان پردازشی بالاتر (Tuning for Higher Throughput)" .PP از دستورات و گزینه‌های پیشرفته زیر برای دستیابی به توان پردازشی بالاتر در برنامه خود استفاده کنید: .RS .PP \f[CB]java \-server \-XX:+UseParallelGC \-XX:+UseLargePages \-Xmn10g \-Xms26g \-Xmx26g\f[R] .RE .SS "تنظیم برای زمان پاسخ‌دهی کوتاه‌تر (Tuning for Lower Response Time)" .PP از دستورات و گزینه‌های پیشرفته زیر برای دستیابی به زمان‌های پاسخ‌دهی کوتاه‌تر در برنامه خود استفاده کنید: .RS .PP \f[CB]java \-XX:+UseG1GC \-XX:MaxGCPauseMillis=100\f[R] .RE .SS "کوچک نگه داشتن هیپ جاوا و کاهش ردپای پویای حافظه برنامه‌های تعبیه‌شده (Keeping the Java Heap Small and Reducing the Dynamic Footprint of Embedded Applications)" .PP از گزینه‌های پیشرفته زمان اجرای زیر برای کوچک نگه داشتن هیپ جاوا و کاهش ردپای پویای برنامه‌های تعبیه‌شده استفاده کنید: .RS .PP \f[CB]\-XX:MaxHeapFreeRatio=10 \-XX:MinHeapFreeRatio=5\f[R] .RE .RS .PP \f[B]نکته:\f[R] مقادیر پیش‌فرض برای این دو گزینه به ترتیب 70٪ و 40٪ است. از آنجا که ممکن است هنگام استفاده از این تنظیمات کوچک افت کارایی رخ دهد، باید با کاهش این تنظیمات تا حد امکان بدون ایجاد افت کارایی غیرقابل قبول، برای ردپای حافظه کوچک بهینه‌سازی کنید. .RE .SH "وضعیت خروج (EXIT STATUS)" .PP مقادیر خروج زیر معمولاً توسط راه‌انداز در هنگامی که راه‌انداز با آرگومان‌های نادرست فراخوانی می‌شود، خطاهای جدی رخ می‌دهد یا استثناهایی توسط JVM پرتاب می‌شود بازگردانده می‌شوند. با این حال، یک برنامه جاوا ممکن است با استفاده از فراخوانی API به‌صورت \f[CB]System.exit(exitValue)\f[R] تصمیم بگیرد هر مقداری را بازگرداند. مقادیر عبارتند از: .IP \[bu] 2 \f[CB]0\f[R]: اجرای موفقیت‌آمیز .IP \[bu] 2 \f[CB]>0\f[R]: خطایی رخ داده است