.\" 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.19.2 .\" .\" Define V font for inline verbatim, using C font in formats .\" that render this, and otherwise B font. .ie "\f[CB]x\f[R]"x" \{\ . ftr V B . ftr VI BI . ftr VB B . ftr VBI BI .\} .el \{\ . ftr V CR . ftr VI CI . ftr VB CB . ftr VBI CBI .\} .TH "JAVA" "1" "2023" "JDK 21" "JDK Commands" .hy .SH "نام (NAME)" .PP java \- اجرای یک برنامه جاوا .SH "خلاصه دستور (SYNOPSIS)" .PP برای اجرای یک فایل کلاس: .PP \f[V]java\f[R] [\f[I]options\f[R]] \f[I]mainclass\f[R] [\f[I]args\f[R] \&...] .PP برای اجرای کلاس اصلی در یک فایل JAR: .PP \f[V]java\f[R] [\f[I]options\f[R]] \f[V]-jar\f[R] \f[I]jarfile\f[R] [\f[I]args\f[R] ...] .PP برای اجرای کلاس اصلی در یک ماژول: .PP \f[V]java\f[R] [\f[I]options\f[R]] \f[V]-m\f[R] \f[I]module\f[R][\f[V]/\f[R]\f[I]mainclass\f[R]] [\f[I]args\f[R] ...] .PP یا .PP \f[V]java\f[R] [\f[I]options\f[R]] \f[V]--module\f[R] \f[I]module\f[R][\f[V]/\f[R]\f[I]mainclass\f[R]] [\f[I]args\f[R] ...] .PP برای اجرای یک برنامه تک‌فایلی کد منبع: .PP \f[V]java\f[R] [\f[I]options\f[R]] \f[I]source-file\f[R] [\f[I]args\f[R] \&...] .TP \f[I]options\f[R] اختیاری: گزینه‌های خط فرمان را مشخص می‌کند که با فاصله از هم جدا شده‌اند. برای شرح گزینه‌های موجود، به \f[B]Overview of Java Options\f[R] مراجعه کنید. .TP \f[I]mainclass\f[R] نام کلاسی را که باید اجرا شود مشخص می‌کند. ورودی‌های خط فرمان پس از \f[V]classname\f[R]، آرگومان‌های متد اصلی (\f[V]main\f[R]) هستند. .TP \f[V]-jar\f[R] \f[I]jarfile\f[R] برنامه‌ای را که درون یک فایل JAR بسته‌بندی شده است اجرا می‌کند. آرگومان \f[I]jarfile\f[R] نام یک فایل JAR به همراه مانیفستی است که شامل خطی به شکل \f[V]Main-Class:\f[R]\f[I]classname\f[R] است و کلاسی را که دارای متد \f[V]public static void main(String[] args)\f[R] به عنوان نقطه شروع برنامه شماست، تعریف می‌کند. هنگام استفاده از \f[V]-jar\f[R]، فایل JAR مشخص‌شده منبع تمامی کلاس‌های کاربر است و سایر تنظیمات مسیر کلاس (class path) نادیده گرفته می‌شوند. اگر از فایل‌های JAR استفاده می‌کنید، \f[B]jar\f[R] را ببینید. .TP \f[V]-m\f[R] یا \f[V]--module\f[R] \f[I]module\f[R][\f[V]/\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 \f[I]source-file\f[R] تنها برای اجرای یک برنامه تک‌فایلی کد منبع استفاده می‌شود. فایل منبعی را مشخص می‌کند که در هنگام استفاده از حالت فایل منبع (source-file mode) شامل کلاس اصلی است. به \f[B]Using Source-File Mode to Launch Single-File Source-Code Programs\f[R] مراجعه کنید. .TP \f[I]args\f[R] ... اختیاری: آرگومان‌های پس از \f[I]mainclass\f[R]، \f[I]source-file\f[R]، \f[V]-jar\f[R] \f[I]jarfile\f[R]، و \f[V]-m\f[R] یا \f[V]--module\f[R] \f[I]module\f[R]\f[V]/\f[R]\f[I]mainclass\f[R] به عنوان آرگومان به کلاس اصلی فرستاده می‌شوند. .SH "توضیحات (DESCRIPTION)" .PP دستور \f[V]java\f[R] یک برنامه جاوا را آغاز می‌کند. این کار با راه‌اندازی ماشین مجازی جاوا (JVM)، بارگذاری کلاس مشخص‌شده و فراخوانی متد \f[V]main()\f[R] آن کلاس انجام می‌شود. این متد باید به صورت \f[V]public\f[R] و \f[V]static\f[R] تعریف شده باشد، نباید هیچ مقداری را بازگرداند و باید یک آرایه \f[V]String\f[R] را به عنوان پارامتر بپذیرد. تعریف متد ساختار زیر را دارد: .RS .PP \f[V]public static void main(String[] args)\f[R] .RE .PP در حالت فایل منبع، دستور \f[V]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[V]JDK_JAVA_OPTIONS\f[R] برای افزودن محتوای آن به ابتدای خط فرمان واقعی راه‌انداز \f[V]java\f[R] استفاده کنید. به \f[B]Using the JDK_JAVA_OPTIONS Launcher Environment Variable\f[R] مراجعه کنید. .RE .PP به‌طور پیش‌فرض، نخستین آرگومانی که جزو گزینه‌های دستور \f[V]java\f[R] نباشد، نام کامل واجد شرایط (fully qualified name) کلاسی است که باید فراخوانی شود. اگر \f[V]-jar\f[R] مشخص شده باشد، آرگومان آن نام فایل JAR حاوی کلاس‌ها و فایل‌های منابع برنامه خواهد بود. کلاس راه‌انداز باید توسط سرآیند مانیفست \f[V]Main-Class\f[R] در فایل مانیفست آن مشخص شده باشد. .PP آرگومان‌های پس از نام فایل کلاس یا نام فایل JAR به متد \f[V]main()\f[R] ارسال می‌شوند..SS \f[V]javaw\f[R] .PP \f[B]ویندوز:\f[R] دستور \f[V]javaw\f[R] مشابه \f[V]java\f[R] است، با این تفاوت که در \f[V]javaw\f[R] هیچ پنجرهٔ کنسول مرتبطی وجود ندارد. هنگامی که نمی‌خواهید پنجرهٔ خط فرمان ظاهر شود، از \f[V]javaw\f[R] استفاده کنید. با این حال، اجراکنندهٔ \f[V]javaw\f[R] در صورت شکست در راه‌اندازی، یک کادر محاوره‌ای حاوی اطلاعات خطا نمایش خواهد داد. .SH "استفاده از حالت فایل منبع برای اجرای برنامه‌های تک‌فایل کد منبع (USING SOURCE-FILE MODE TO LAUNCH SINGLE-FILE SOURCE-CODE PROGRAMS)" .PP برای اجرای کلاسی که در یک فایل منبع اعلان شده است، اجراکنندهٔ \f[V]java\f[R] را در حالت فایل منبع اجرا کنید. ورود به حالت فایل منبع بر اساس دو مورد در خط فرمان \f[V]java\f[R] تعیین می‌شود: .IP \[bu] 2 نخستین مورد در خط فرمان که یک گزینه یا بخشی از یک گزینه نباشد. به عبارت دیگر، موردی در خط فرمان که در حالت عادی نام کلاس اصلی می‌بود. .IP \[bu] 2 گزینهٔ \f[V]--source\f[R] \f[I]version\f[R]، در صورت وجود. .PP اگر کلاس، یک فایل موجود با پسوند \f[V].java\f[R] را مشخص کند، یا اگر گزینهٔ \f[V]--source\f[R] تعیین شده باشد، حالت فایل منبع انتخاب می‌شود. سپس فایل منبع کامپایل و اجرا می‌گردد. گزینهٔ \f[V]--source\f[R] می‌تواند برای تعیین نسخهٔ منبع (\f[I]version\f[R]) یا \f[I]N\f[R] کد منبع استفاده شود. این کار API قابل استفاده را مشخص می‌کند. هنگامی که \f[V]--source\f[R] \f[I]N\f[R] را تنظیم می‌کنید، تنها می‌توانید از API عمومی که در JDK \f[I]N\f[R] تعریف شده است استفاده نمایید. .RS .PP \f[B]نکته:\f[R] مقادیر معتبر \f[I]N\f[R] برای هر انتشار تغییر می‌کند؛ مقادیر جدید اضافه شده و مقادیر قدیمی حذف می‌شوند. اگر از مقداری برای \f[I]N\f[R] استفاده کنید که دیگر پشتیبانی نمی‌شود، یک پیام خطا دریافت خواهید کرد. مقادیر پشتیبانی‌شده برای \f[I]N\f[R] عبارتند از انتشار جاری Java SE (\f[V]21\f[R]) و تعداد محدودی از انتشار‌های قبلی، که جزئیات آن‌ها در راهنمای خط فرمان \f[V]javac\f[R]، ذیل گزینه‌های \f[V]--source\f[R] و \f[V]--release\f[R] آورده شده است. .RE .PP اگر فایل فاقد پسوند \f[V].java\f[R] باشد، باید از گزینهٔ \f[V]--source\f[R] استفاده شود تا به دستور \f[V]java\f[R] اعلام کند از حالت فایل منبع استفاده نماید. گزینهٔ \f[V]--source\f[R] برای مواردی به کار می‌رود که فایل منبع یک \[dq]اسکریپت\[dq] برای اجرا باشد و نام فایل منبع از قواعد نام‌گذاری معمول فایل‌های منبع Java پیروی نکند. .PP در حالت فایل منبع، عملکرد به گونه‌ای است که گویی فایل منبع در حافظه کامپایل شده و نخستین کلاسِ یافت‌شده در فایل منبع اجرا می‌شود. هرگونه آرگومانی که پس از نام فایل منبع در خط فرمان اصلی قرار گیرد، هنگام اجرا به کلاس کامپایل‌شده فرستاده می‌شود. .PP به عنوان مثال، اگر فایلی با نام \f[V]HelloWorld.java\f[R] وجود داشته باشد و شامل کلاسی به نام \f[V]hello.World\f[R] باشد، دستور حالت فایل منبع برای اجرای این کلاس به صورت زیر خواهد بود: .RS .PP \f[V]java HelloWorld.java\f[R] .RE .PP این مثال نشان می‌دهد که کلاس می‌تواند در یک بستهٔ نام‌دار (named package) باشد و نیازی نیست حتماً در بستهٔ بی‌نام (unnamed package) قرار داشته باشد. این استفاده از حالت فایل منبع به صورت غیررسمی معادل اجرای دو دستور زیر است که در آن‌ها \f[V]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[V]--class-path\f[R]، \f[V]--module-path\f[R]، \f[V]--add-exports\f[R]، \f[V]--add-modules\f[R]، \f[V]--limit-modules\f[R]، \f[V]--patch-module\f[R]، \f[V]--upgrade-module-path\f[R] و هرگونه اشکال مختلف این گزینه‌ها. همچنین شامل گزینهٔ جدید \f[V]--enable-preview\f[R] است که در JEP 12 توضیح داده شده است. .RE .IP \[bu] 2 هیچ تمهیدی برای ارسال گزینه‌های اضافی به کامپایلر، مانند \f[V]-processor\f[R] یا \f[V]-Werror\f[R] در نظر گرفته نشده است. .IP \[bu] 2 فایل‌های آرگومان خط فرمان (\f[V]\[at]\f[R]-files) می‌توانند به شیوهٔ استاندارد استفاده شوند. فهرست‌های طولانی از آرگومان‌ها برای VM یا برنامهٔ در حال فراخوانی را می‌توان در فایل‌هایی قرار داد و با افزودن نویسهٔ \f[V]\[at]\f[R] در ابتدای نام فایل در خط فرمان مشخص کرد. .PP \f[B]در حالت فایل منبع، فرایند کامپایل به صورت زیر پیش می‌رود:\f[R] .IP \[bu] 2 هرگونه گزینهٔ خط فرمان که با محیط کامپایل مرتبط باشد در نظر گرفته می‌شود. .IP \[bu] 2 هیچ فایل منبع دیگری جستجو و کامپایل نمی‌شود، درست مانند اینکه مسیر منبع (source path) روی مقداری خالی تنظیم شده باشد. .IP \[bu] 2 پردازش حاشیه‌نویسی‌ها (Annotation processing) غیرفعال است، درست مانند اینکه \f[V]-proc:none\f[R] اعمال شده باشد. .IP \[bu] 2 اگر نسخه‌ای از طریق گزینهٔ \f[V]--source\f[R] مشخص شده باشد، این مقدار به عنوان آرگومان برای یک گزینهٔ ضمنی \f[V]--release\f[R] در کامپایل استفاده می‌شود. این کار هم نسخهٔ منبع پذیرفته‌شده توسط کامپایلر و هم API سامانه‌ای را که ممکن است توسط کد درون فایل منبع استفاده شود، تنظیم می‌کند. .IP \[bu] 2 فایل منبع در زمینهٔ یک ماژول بی‌نام کامپایل می‌شود. .IP \[bu] 2 فایل منبع باید شامل یک یا چند کلاس سطح بالا (top-level) باشد که نخستین کلاس به عنوان کلاس قابل اجرا در نظر گرفته می‌شود. .IP \[bu] 2 کامپایلر محدودیت اختیاری تعریف‌شده در انتهای JLS 7.6 را اعمال نمی‌کند؛ این محدودیت که نوع موجود در یک بستهٔ نام‌دار باید در فایلی قرار داشته باشد که نام آن از نام همان نوع همراه با پسوند \f[V].java\f[R] تشکیل شده باشد. .IP \[bu] 2 اگر فایل منبع حاوی خطا باشد، پیام‌های خطای مناسب در جریان خطای استاندارد نوشته می‌شوند و اجراکننده با یک کد خروج غیرصفر خارج می‌شود. .PP \f[B]در حالت فایل منبع، فرایند اجرا به صورت زیر پیش می‌رود:\f[R] .IP \[bu] 2 کلاس قابل اجرا، نخستین کلاس سطح بالایی است که در فایل منبع یافت می‌شود. این کلاس باید حاوی اعلان متد استاندارد \f[V]public static void main(String[])\f[R] باشد. .IP \[bu] 2 کلاس‌های کامپایل‌شده توسط یک بارگذار کلاس سفارشی بارگذاری می‌شوند که وظیفه را به بارگذار کلاس برنامه (application class loader) واگذار می‌کند. این بدان معناست که کلاس‌های حاضر در مسیر کلاس برنامه (application class path) نمی‌توانند به هیچ کلاسی که در فایل منبع اعلان شده است ارجاع دهند. .IP \[bu] 2 کلاس‌های کامپایل‌شده در زمینهٔ یک ماژول بی‌نام اجرا می‌شوند، گویی که \f[V]--add-modules=ALL-DEFAULT\f[R] اعمال شده است. این مورد علاوه بر هر گزینهٔ \f[V]--add-module\f[R] دیگری است که ممکن است در خط فرمان تعیین شده باشد. .IP \[bu] 2 هرگونه آرگومانی که در خط فرمان پس از نام فایل ظاهر شود، به شیوهٔ معمول به متد استاندارد main فرستاده می‌شود. .IP \[bu] 2 اگر کلاسی در مسیر کلاس برنامه وجود داشته باشد که نام آن هم‌نام با کلاسِ در حال اجرا باشد، یک خطا رخ خواهد داد. .PP برای جزئیات کامل، \f[B]JEP 330: Launch Single-File Source-Code Programs\f[R] به نشانی [https://openjdk.org/jeps/330] را ببینید..SH "استفاده از متغیر محیطی راه‌انداز JDK_JAVA_OPTIONS (USING THE JDK_JAVA_OPTIONS LAUNCHER ENVIRONMENT VARIABLE)" .PP متغیر \f[V]JDK_JAVA_OPTIONS\f[R] محتوای خود را به ابتدای گزینه‌های تجزیه‌شده از خط فرمان اضافه می‌کند. محتوای متغیر محیطی \f[V]JDK_JAVA_OPTIONS\f[R] فهرستی از آرگومان‌ها است که با نویسه‌های فاصله خالی (طبق تعریف \f[V]isspace()\f[R]) از یکدیگر جدا شده‌اند. این موارد به ابتدای آرگومان‌های خط فرمان که به راه‌انداز \f[V]java\f[R] ارسال شده‌اند، افزوده می‌شوند. الزامات کدگذاری (encoding) برای متغیر محیطی مشابه خط فرمان \f[V]java\f[R] در سیستم است. با محتوای متغیر محیطی \f[V]JDK_JAVA_OPTIONS\f[R] دقیقاً مانند آنچه در خط فرمان مشخص شده است رفتار می‌شود. .PP می‌توان از نقل‌قول تکی (\f[V]\[aq]\f[R]) یا دوگانه (\f[V]\[dq]\f[R]) برای در بر گرفتن آرگومان‌هایی که حاوی نویسه‌های فاصله خالی هستند استفاده کرد. تمام محتوای بین نقل‌قول باز و اولین نقل‌قول منطبق بسته، با حذف جفت نقل‌قول‌ها حفظ می‌شود. در صورتی که نقل‌قول منطبق پیدا نشود، راه‌انداز با یک پیام خطا متوقف خواهد شد. فایل‌های \f[V]\[at]\f[R] دقیقاً همان‌طور که در خط فرمان مشخص می‌شوند پشتیبانی می‌گردند. با این حال، همانند فایل‌های \f[V]\[at]\f[R]، استفاده از نویسه‌های عمومی (wildcard) پشتیبانی نمی‌شود. به منظور کاهش سوءاستفاده‌های بالقوه از رفتار \f[V]JDK_JAVA_OPTIONS\f[R]، گزینه‌هایی که کلاس اصلی را تعیین می‌کنند (مانند \f[V]-jar\f[R]) یا باعث خروج راه‌انداز \f[V]java\f[R] بدون اجرای کلاس اصلی می‌شوند (مانند \f[V]-h\f[R])، در این متغیر محیطی مجاز نیستند. اگر هر یک از این گزینه‌ها در متغیر محیطی ظاهر شوند، راه‌انداز با یک پیام خطا متوقف خواهد شد. هنگامی که \f[V]JDK_JAVA_OPTIONS\f[R] تنظیم شده باشد، راه‌انداز پیامی را به عنوان یادآوری در stderr چاپ می‌کند. .PP \f[B]مثال:\f[R] .IP .nf \f[CB] $ export JDK_JAVA_OPTIONS=\[aq]-g \[at]file1 -Dprop=value \[at]file2 -Dws.prop=\[dq]white spaces\[dq]\[aq] $ java -Xint \[at]file3 \f[R] .fi .PP معادل خط فرمان زیر است: .IP .nf \f[CB] java -g \[at]file1 -Dprop=value \[at]file2 -Dws.prop=\[dq]white spaces\[dq] -Xint \[at]file3 \f[R] .fi .SH "بررسی اجمالی گزینه‌های جاوا (OVERVIEW OF JAVA OPTIONS)" .PP دستور \f[V]java\f[R] از طیف گسترده‌ای از گزینه‌ها در دسته‌بندی‌های زیر پشتیبانی می‌کند: .IP \[bu] 2 \f[B]گزینه‌های استاندارد جاوا (Standard Options for Java)\f[R]: گزینه‌هایی که پشتیبانی از آن‌ها در تمام پیاده‌سازی‌های ماشین مجازی جاوا (JVM) تضمین شده است. آن‌ها برای اقدامات معمول مانند بررسی نسخه JRE، تنظیم مسیر کلاس (class path)، فعال‌سازی خروجی پرگو (verbose) و غیره استفاده می‌شوند. .IP \[bu] 2 \f[B]گزینه‌های اضافی جاوا (Extra Options for Java)\f[R]: گزینه‌های عمومی که مختص ماشین مجازی Java HotSpot هستند. پشتیبانی از آن‌ها در تمام پیاده‌سازی‌های JVM تضمین نشده است و در معرض تغییر هستند. این گزینه‌ها با \f[V]-X\f[R] آغاز می‌شوند. .PP استفاده از گزینه‌های پیشرفته برای مصارف عادی توصیه نمی‌شود. این‌ها گزینه‌های توسعه‌دهنده هستند که برای تنظیم بخش‌های خاصی از عملکرد ماشین مجازی Java HotSpot به کار می‌روند که معمولاً نیازمندی‌های سیستمی خاصی داشته و ممکن است به دسترسی ممتاز به پارامترهای پیکربندی سیستم نیاز داشته باشند. چندین نمونه از تنظیم عملکرد در \f[B]نمونه‌های بهینه‌سازی عملکرد (Performance Tuning Examples)\f[R] ارائه شده است. پشتیبانی از این گزینه‌ها در تمامی پیاده‌سازی‌های JVM تضمین نشده است و در معرض تغییر هستند. گزینه‌های پیشرفته با \f[V]-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[V]-XX\f[R] با استفاده از علامت بعلاوه (\f[V]-XX:+\f[R]\f[I]OptionName\f[R]) فعال و با استفاده از علامت منها (\f[V]-XX:-\f[R]\f[I]OptionName\f[R]) غیرفعال می‌شوند. .PP برای گزینه‌هایی که به یک آرگومان نیاز دارند، آرگومان ممکن است با یک فاصله، یک دو نقطه (:)، یا یک علامت مساوی (=) از نام گزینه جدا شود، یا ممکن است آرگومان مستقیماً پس از گزینه قرار گیرد (نحو دقیق برای هر گزینه متفاوت است). اگر انتظار می‌رود اندازه را بر حسب بایت مشخص کنید، می‌توانید بدون پسوند، یا با استفاده از پسوند \f[V]k\f[R] یا \f[V]K\f[R] برای کیلوبایت (KB)، \f[V]m\f[R] یا \f[V]M\f[R] برای مگابایت (MB)، یا \f[V]g\f[R] یا \f[V]G\f[R] برای گیگابایت (GB) مقداردهی کنید. به عنوان مثال، برای تنظیم اندازه روی ۸ گیگابایت، می‌توانید مقدار \f[V]8g\f[R]، \f[V]8192m\f[R]، \f[V]8388608k\f[R]، یا \f[V]8589934592\f[R] را به عنوان آرگومان تعیین کنید. اگر انتظار می‌رود درصد را مشخص کنید، از یک عدد از 0 تا 1 استفاده کنید. برای مثال، مقدار \f[V]0.25\f[R] را برای ۲۵٪ تعیین کنید. .PP بخش‌های زیر گزینه‌های منسوخ‌شده، متروک و حذف‌شده را شرح می‌دهند: .IP \[bu] 2 \f[B]گزینه‌های منسوخ‌شده جاوا (Deprecated Java Options)\f[R]: پذیرفته شده و طبق آن‌ها عمل می‌شود \(em هنگام استفاده از آن‌ها یک هشدار صادر می‌شود. .IP \[bu] 2 \f[B]گزینه‌های متروک جاوا (Obsolete Java Options)\f[R]: پذیرفته می‌شوند اما نادیده گرفته می‌شوند \(em هنگام استفاده از آن‌ها یک هشدار صادر می‌شود. .IP \[bu] 2 \f[B]گزینه‌های حذف‌شده جاوا (Removed Java Options)\f[R]: حذف شده‌اند \(em استفاده از آن‌ها منجر به خطا می‌شود..SH "گزینه‌های استاندارد جاوا (STANDARD OPTIONS FOR JAVA)" .PP این‌ها پرکاربردترین گزینه‌هایی هستند که توسط تمام پیاده‌سازی‌های JVM پشتیبانی می‌شوند. .RS .PP \f[B]نکته:\f[R] برای مشخص کردن یک آرگومان برای یک گزینه بلند، می‌توانید از \f[V]--\f[R]\f[I]name\f[R]\f[V]=\f[R]\f[I]value\f[R] یا \f[V]--\f[R]\f[I]name\f[R] \f[I]value\f[R] استفاده کنید. .RE .TP \f[V]-agentlib:\f[R]\f[I]libname\f[R][\f[V]=\f[R]\f[I]options\f[R]] کتابخانه محلی عامل (native agent) مشخص‌شده را بارگذاری می‌کند. پس از نام کتابخانه، می‌توان از فهرستی از گزینه‌های اختصاصی کتابخانه که با کاما از هم جدا شده‌اند استفاده کرد. اگر گزینه \f[V]-agentlib:foo\f[R] مشخص شده باشد، JVM تلاش می‌کند کتابخانه‌ای با نام \f[V]foo\f[R] را با استفاده از قواعد نام‌گذاری و مکان‌های خاص هر پلتفرم بارگذاری کند: .RS .IP \[bu] 2 \f[B]لینوکس و سایر پلتفرم‌های شبه‌پازیکس (POSIX-like):\f[R] ماشین مجازی JVM تلاش می‌کند کتابخانه‌ای به نام \f[V]libfoo.so\f[R] را در مکان مشخص‌شده توسط متغیر سیستمی \f[V]LD_LIBRARY_PATH\f[R] بارگذاری کند. .IP \[bu] 2 \f[B]مک‌اواس (macOS):\f[R] ماشین مجازی JVM تلاش می‌کند کتابخانه‌ای به نام \f[V]libfoo.dylib\f[R] را در مکان مشخص‌شده توسط متغیر سیستمی \f[V]DYLD_LIBRARY_PATH\f[R] بارگذاری کند. .IP \[bu] 2 \f[B]ویندوز (Windows):\f[R] ماشین مجازی JVM تلاش می‌کند کتابخانه‌ای به نام \f[V]foo.dll\f[R] را در مکان مشخص‌شده توسط متغیر سیستمی \f[V]PATH\f[R] بارگذاری کند. .RS 2 .PP مثال زیر نحوه بارگذاری کتابخانه پروتکل اشکال‌زدایی سیم جاوا (JDWP) و گوش دادن به اتصال سوکت روی پورت ۸۰۰۰ را نشان می‌دهد، که JVM را پیش از بارگذاری کلاس اصلی معلق می‌کند: .RS .PP \f[V]-agentlib:jdwp=transport=dt_socket,server=y,address=8000\f[R] .RE .RE .RE .TP \f[V]-agentpath:\f[R]\f[I]pathname\f[R][\f[V]=\f[R]\f[I]options\f[R]] کتابخانه محلی عامل را با استفاده از نام مسیر مطلق مشخص‌شده بارگذاری می‌کند. این گزینه معادل \f[V]-agentlib\f[R] است اما از مسیر کامل و نام فایل کتابخانه استفاده می‌کند. .TP \f[V]--class-path\f[R] \f[I]classpath\f[R]، \f[V]-classpath\f[R] \f[I]classpath\f[R]، یا \f[V]-cp\f[R] \f[I]classpath\f[R] فهرستی از دایرکتوری‌ها، فایل‌های JAR و آرشیوهای ZIP را برای جستجوی فایل‌های کلاس مشخص می‌کند. .RS .PP در ویندوز، نقطه ویرگول (\f[V];\f[R]) موجودیت‌ها را در این فهرست جدا می‌کند؛ در سایر پلتفرم‌ها این کاراکتر دو نقطه (\f[V]:\f[R]) است. .PP مشخص کردن \f[I]classpath\f[R] هرگونه تنظیم متغیر محیطی \f[V]CLASSPATH\f[R] را نادیده می‌گیرد. اگر گزینه مسیر کلاس استفاده نشود و \f[I]classpath\f[R] تنظیم نشده باشد، مسیر کلاس کاربر شامل دایرکتوری جاری (.) خواهد بود. .PP به‌عنوان یک تسهیل ویژه، یک عنصر مسیر کلاس که نام پایه آن ستاره (*) است، معادل مشخص کردن فهرستی از تمام فایل‌های موجود در دایرکتوری با پسوند \f[V].jar\f[R] یا \f[V].JAR\f[R] در نظر گرفته می‌شود. یک برنامه جاوا نمی‌تواند تفاوت بین این دو فراخوانی را تشخیص دهد. برای مثال، اگر دایرکتوری mydir شامل \f[V]a.jar\f[R] و \f[V]b.JAR\f[R] باشد، عنصر مسیر کلاس mydir/* به \f[V]A.jar:b.JAR\f[R] بسط می‌یابد، به جز اینکه ترتیب فایل‌های JAR نامشخص است. تمام فایل‌های \f[V].jar\f[R] در دایرکتوری مشخص‌شده، حتی فایل‌های پنهان، در فهرست گنجانده می‌شوند. یک ورودی مسیر کلاس متشکل از یک ستاره (*) به فهرستی از تمام فایل‌های jar در دایرکتوری جاری بسط می‌یابد. متغیر محیطی \f[V]CLASSPATH\f[R] نیز، در صورت تعریف، به طور مشابه بسط می‌یابد. هرگونه بسط نویسه عمومی (wildcard) مسیر کلاس پیش از شروع Java VM رخ می‌دهد. برنامه‌های جاوا هرگز نویسه‌های عمومی بسط‌نیافته را نمی‌بینند، مگر از طریق پرس‌وجو از محیط، مانند فراخوانی \f[V]System.getenv(\[dq]CLASSPATH\[dq])\f[R]. .RE .TP \f[V]--disable-\[at]files\f[R] می‌تواند در هر جایی از خط فرمان، از جمله درون یک فایل آرگومان استفاده شود تا از بسط بیشتر \f[V]\[at]filename\f[R] جلوگیری کند. این گزینه بسط فایل‌های آرگومان \f[V]\[at]\f[R] را پس از این گزینه متوقف می‌کند. .TP \f[V]--enable-preview\f[R] به کلاس‌ها اجازه می‌دهد به \f[B]ویژگی‌های پیش‌نمایش\f[R] [https://docs.oracle.com/en/java/javase/12/language/index.html#JSLAN-GUID-5A82FE0E-0CA4-4F1F-B075-564874FE2823] این نسخه وابسته باشند. .TP \f[V]--finalization=\f[R]\f[I]value\f[R] کنترل می‌کند که آیا JVM نهایی‌سازی (finalization) اشیاء را انجام دهد یا خیر. مقادیر معتبر عبارتند از \[dq]enabled\[dq] و \[dq]disabled\[dq]. نهایی‌سازی به‌طور پیش‌فرض فعال است، بنابراین مقدار \[dq]enabled\[dq] کاری انجام نمی‌دهد. مقدار \[dq]disabled\[dq] نهایی‌سازی را غیرفعال می‌کند، به‌طوری که هیچ نهایی‌سازی فراخوانی نمی‌شود. .TP \f[V]--module-path\f[R] \f[I]modulepath\f[R]... یا \f[V]-p\f[R] \f[I]modulepath\f[R] مکان یافتن ماژول‌های برنامه را با فهرستی از عناصر مسیر مشخص می‌کند. عناصر مسیر ماژول می‌توانند یک مسیر فایل به یک ماژول یا دایرکتوری حاوی ماژول‌ها باشند. هر ماژول یا یک JAR ماژولار است یا یک دایرکتوری ماژول بازشده (exploded-module). .RS .PP در ویندوز، نقطه ویرگول (\f[V];\f[R]) عناصر مسیر را در این فهرست جدا می‌کند؛ در سایر پلتفرم‌ها این کاراکتر دو نقطه (\f[V]:\f[R]) است. .RE .TP \f[V]--upgrade-module-path\f[R] \f[I]modulepath\f[R]... مکان یافتن ماژول‌های جایگزین برای ماژول‌های قابل ارتقا در تصویر زمان اجرا را با فهرستی از عناصر مسیر مشخص می‌کند. عناصر مسیر ماژول می‌توانند یک مسیر فایل به یک ماژول یا دایرکتوری حاوی ماژول‌ها باشند. هر ماژول یا یک JAR ماژولار است یا یک دایرکتوری ماژول بازشده (exploded-module). .RS .PP در ویندوز، نقطه ویرگول (\f[V];\f[R]) عناصر مسیر را در این فهرست جدا می‌کند؛ در سایر پلتفرم‌ها این کاراکتر دو نقطه (\f[V]:\f[R]) است. .RE .TP \f[V]--add-modules\f[R] \f[I]module\f[R][\f[V],\f[R]\f[I]module\f[R]...] ماژول‌های ریشه را علاوه بر ماژول اولیه برای حل وابستگی مشخص می‌کند. \f[I]module\f[R] همچنین می‌تواند \f[V]ALL-DEFAULT\f[R]، \f[V]ALL-SYSTEM\f[R] و \f[V]ALL-MODULE-PATH\f[R] باشد. .TP \f[V]--list-modules\f[R] ماژول‌های قابل مشاهده را فهرست کرده و سپس خارج می‌شود. .TP \f[V]-d\f[R] \f[I]module_name\f[R] یا \f[V]--describe-module\f[R] \f[I]module_name\f[R] یک ماژول مشخص‌شده را توصیف کرده و سپس خارج می‌شود. .TP \f[V]--dry-run\f[R] ماشین مجازی (VM) را ایجاد می‌کند اما متد اصلی (main) را اجرا نمی‌کند. این گزینه \f[V]--dry-run\f[R] ممکن است برای اعتبارسنجی گزینه‌های خط فرمان مانند پیکربندی سیستم ماژول مفید باشد. .TP \f[V]--validate-modules\f[R] تمام ماژول‌ها را اعتبارسنجی کرده و خارج می‌شود. این گزینه برای یافتن تداخل‌ها و خطاهای دیگر با ماژول‌های موجود در مسیر ماژول مفید است. .TP \f[V]-D\f[R]\f[I]property\f[R]\f[V]=\f[R]\f[I]value\f[R] مقدار یک ویژگی سیستمی را تنظیم می‌کند. متغیر \f[I]property\f[R] رشته‌ای بدون فاصله است که نام ویژگی را نشان می‌دهد. متغیر \f[I]value\f[R] رشته‌ای است که مقدار ویژگی را نشان می‌دهد. اگر \f[I]value\f[R] رشته‌ای حاوی فاصله است، آن را داخل علامت نقل قول قرار دهید (برای مثال \f[V]-Dfoo=\[dq]foo bar\[dq]\f[R]). .TP \f[V]-disableassertions\f[R][\f[V]:\f[R][\f[I]packagename\f[R]]...|\f[V]:\f[R]\f[I]classname\f[R]] یا \f[V]-da\f[R][\f[V]:\f[R][\f[I]packagename\f[R]]...|\f[V]:\f[R]\f[I]classname\f[R]] ادعاها (assertions) را غیرفعال می‌کند. به‌طور پیش‌فرض، ادعاها در تمام بسته‌ها و کلاس‌ها غیرفعال هستند. بدون آرگومان، \f[V]-disableassertions\f[R] (\f[V]-da\f[R]) ادعاها را در تمام بسته‌ها و کلاس‌ها غیرفعال می‌کند. با آرگومان \f[I]packagename\f[R] که به \f[V]...\f[R] ختم می‌شود، این سوییچ ادعاها را در بسته مشخص‌شده و هر زیربسته‌ای از آن غیرفعال می‌کند. اگر آرگومان صرفاً \f[V]...\f[R] باشد، سوییچ ادعاها را در بسته بدون نام در دایرکتوری کاری جاری غیرفعال می‌کند. با آرگومان \f[I]classname\f[R]، این سوییچ ادعاها را در کلاس مشخص‌شده غیرفعال می‌کند. .RS .PP گزینه \f[V]-disableassertions\f[R] (\f[V]-da\f[R]) برای تمام بارگذارهای کلاس و کلاس‌های سیستمی (که بارگذار کلاس ندارند) اعمال می‌شود. یک استثنا برای این قاعده وجود دارد: اگر گزینه بدون آرگومان ارائه شود، برای کلاس‌های سیستمی اعمال نخواهد شد. این امر غیرفعال کردن ادعاها را در تمام کلاس‌ها به جز کلاس‌های سیستمی آسان می‌کند. گزینه \f[V]-disablesystemassertions\f[R] شما را قادر می‌سازد ادعاها را در تمام کلاس‌های سیستمی غیرفعال کنید. برای فعال‌سازی صریح ادعاها در بسته‌ها یا کلاس‌های مشخص، از گزینه \f[V]-enableassertions\f[R] (\f[V]-ea\f[R]) استفاده کنید. هر دو گزینه می‌توانند هم‌زمان استفاده شوند. برای مثال، برای اجرای برنامه \f[V]MyClass\f[R] با ادعاهای فعال در بسته \f[V]com.wombat.fruitbat\f[R] (و هر زیربسته‌ای از آن) اما غیرفعال در کلاس \f[V]com.wombat.fruitbat.Brickbat\f[R]، از دستور زیر استفاده کنید: .RS .PP \f[V]java -ea:com.wombat.fruitbat... -da:com.wombat.fruitbat.Brickbat MyClass\f[R] .RE .RE .TP \f[V]-disablesystemassertions\f[R] یا \f[V]-dsa\f[R] ادعاها را در تمام کلاس‌های سیستمی غیرفعال می‌کند. .TP \f[V]-enableassertions\f[R][\f[V]:\f[R][\f[I]packagename\f[R]]...|\f[V]:\f[R]\f[I]classname\f[R]] یا \f[V]-ea\f[R][\f[V]:\f[R][\f[I]packagename\f[R]]...|\f[V]:\f[R]\f[I]classname\f[R]] ادعاها را فعال می‌کند. به‌طور پیش‌فرض، ادعاها در تمام بسته‌ها و کلاس‌ها غیرفعال هستند. بدون آرگومان، \f[V]-enableassertions\f[R] (\f[V]-ea\f[R]) ادعاها را در تمام بسته‌ها و کلاس‌ها فعال می‌کند. با آرگومان \f[I]packagename\f[R] که به \f[V]...\f[R] ختم می‌شود، این سوییچ ادعاها را در بسته مشخص‌شده و هر زیربسته‌ای از آن فعال می‌کند. اگر آرگومان صرفاً \f[V]...\f[R] باشد، سوییچ ادعاها را در بسته بدون نام در دایرکتوری کاری جاری فعال می‌کند. با آرگومان \f[I]classname\f[R]، این سوییچ ادعاها را در کلاس مشخص‌شده فعال می‌کند. .RS.PP گزینهٔ \f[V]-enableassertions\f[R] (\f[V]-ea\f[R]) بر تمام بارگذارهای کلاس (class loaders) و کلاس‌های سیستمی (که فاقد بارگذار کلاس هستند) اعمال می‌شود. یک استثنا برای این قاعده وجود دارد: اگر این گزینه بدون هیچ آرگومانی ارائه شود، بر کلاس‌های سیستمی اعمال نخواهد شد. این امر فعال‌سازی ادعاها (assertions) را در تمام کلاس‌ها به‌جز کلاس‌های سیستمی آسان می‌کند. گزینهٔ \f[V]-enablesystemassertions\f[R] سوییچ جداگانه‌ای برای فعال‌سازی ادعاها در تمام کلاس‌های سیستمی فراهم می‌کند. برای غیرفعال‌سازی صریح ادعاها در بسته‌ها یا کلاس‌های مشخص، از گزینهٔ \f[V]-disableassertions\f[R] (\f[V]-da\f[R]) استفاده کنید. اگر یک دستور حاوی چندین نمونه از این سوییچ‌ها باشد، آن‌ها به همان ترتیبِ مشخص‌شده، پیش از بارگذاری هر کلاسی پردازش می‌شوند. برای نمونه، جهت اجرای برنامهٔ \f[V]MyClass\f[R] در حالی که ادعاها تنها در بستهٔ \f[V]com.wombat.fruitbat\f[R] (و هریک از زیربسته‌های آن) فعال و در کلاس \f[V]com.wombat.fruitbat.Brickbat\f[R] غیرفعال باشند، از دستور زیر استفاده کنید: .RS .PP \f[V]java -ea:com.wombat.fruitbat... -da:com.wombat.fruitbat.Brickbat MyClass\f[R] .RE .RE .TP \f[V]-enablesystemassertions\f[R] یا \f[V]-esa\f[R] ادعاها (assertions) را در تمام کلاس‌های سیستمی فعال می‌کند. .TP \f[V]-help\f[R]، \f[V]-h\f[R] یا \f[V]-?\f[R] پیام راهنما را در جریان خطا (error stream) چاپ می‌کند. .TP \f[V]--help\f[R] پیام راهنما را در جریان خروجی (output stream) چاپ می‌کند. .TP \f[V]-javaagent:\f[R]\f[I]jarpath\f[R][\f[V]=\f[R]\f[I]options\f[R]] عامل (agent) مشخص‌شدهٔ زبان برنامه‌نویسی جاوا را بارگذاری می‌کند. بخش \f[V]java.lang.instrument\f[R] را ببینید. .TP \f[V]--show-version\f[R] نسخهٔ محصول را در جریان خروجی چاپ کرده و به اجرا ادامه می‌دهد. .TP \f[V]-showversion\f[R] نسخهٔ محصول را در جریان خطا چاپ کرده و به اجرا ادامه می‌دهد. .TP \f[V]--show-module-resolution\f[R] خروجی تفکیک ماژول‌ها (module resolution) را هنگام راه‌اندازی نمایش می‌دهد. .TP \f[V]-splash:\f[R]\f[I]imagepath\f[R] صفحهٔ آغازین (splash screen) را با تصویر مشخص‌شده توسط \f[I]imagepath\f[R] نمایش می‌دهد. تصاویر مقیاس‌بندی‌شدهٔ HiDPI به‌طور خودکار پشتیبانی شده و در صورت دردسترس بودن مورد استفاده قرار می‌گیرند. نام فایل تصویرِ بدون مقیاس، مانند \f[V]image.ext\f[R]، همیشه باید به‌عنوان آرگومان به گزینهٔ \f[V]-splash\f[R] داده شود. مناسب‌ترین تصویر مقیاس‌بندی‌شدهٔ ارائه‌شده به‌طور خودکار انتخاب می‌شود. .RS .PP برای نمونه، جهت نمایش فایل \f[V]splash.gif\f[R] از پوشهٔ \f[V]images\f[R] هنگام راه‌اندازی برنامه، از گزینهٔ زیر استفاده کنید: .RS .PP \f[V]-splash:images/splash.gif\f[R] .RE .PP برای اطلاعات بیشتر، مستندات SplashScreen API را ببینید. .RE .TP \f[V]-verbose:class\f[R] اطلاعات مربوط به هر کلاس بارگذاری‌شده را نمایش می‌دهد. .TP \f[V]-verbose:gc\f[R] اطلاعات مربوط به هر رویداد بازیافت حافظه (GC) را نمایش می‌دهد. .TP \f[V]-verbose:jni\f[R] اطلاعات مربوط به استفاده از متدهای بومی و سایر فعالیت‌های رابط بومی جاوا (JNI) را نمایش می‌دهد. .TP \f[V]-verbose:module\f[R] اطلاعات مربوط به ماژول‌های در حال استفاده را نمایش می‌دهد. .TP \f[V]--version\f[R] نسخهٔ محصول را در جریان خروجی چاپ کرده و خارج می‌شود. .TP \f[V]-version\f[R] نسخهٔ محصول را در جریان خطا چاپ کرده و خارج می‌شود. .TP \f[V]-X\f[R] راهنمای گزینه‌های اضافی را در جریان خطا چاپ می‌کند. .TP \f[V]--help-extra\f[R] راهنمای گزینه‌های اضافی را در جریان خروجی چاپ می‌کند. .TP \f[V]\[at]\f[R]\f[I]argfile\f[R] یک یا چند فایل آرگومان را که با پیشوند \f[V]\[at]\f[R] مشخص می‌شوند برای استفاده توسط دستور \f[V]java\f[R] تعیین می‌کند. به‌دلیل فایل‌های \f[V].jar\f[R] متعددی که در classpath مورد نیاز است، طولانی شدن خط فرمان \f[V]java\f[R] امری نامعمول نیست. گزینهٔ \f[V]\[at]\f[R]\f[I]argfile\f[R] با فراهم آوردن امکان بسط محتوای فایل‌های آرگومان پس از بسط پوسته، اما پیش از پردازش آرگومان‌ها توسط راه‌انداز، بر محدودیت‌های طول خط فرمان غلبه می‌کند. محتویات فایل‌های آرگومان بسط داده می‌شوند؛ در غیر این صورت تا پیش از رسیدن به گزینهٔ \f[V]--disable-\[at]files\f[R]، عیناً روی خط فرمان مشخص می‌شدند. .RS .PP فایل‌های آرگومان می‌توانند شامل نام کلاس اصلی و تمام گزینه‌ها نیز باشند. اگر یک فایل آرگومان شامل همهٔ گزینه‌های مورد نیاز دستور \f[V]java\f[R] باشد، خط فرمان می‌تواند به‌سادگی به این صورت باشد: .RS .PP \f[V]java \[at]\f[R]\f[I]argfile\f[R] .RE .PP برای توضیحات و مثال‌هایی از کاربرد \f[V]\[at]\f[R]-argfileها، به بخش \f[B]java Command-Line Argument Files\f[R] مراجعه کنید. .RE .SH "گزینه‌های اضافی برای جاوا (EXTRA OPTIONS FOR JAVA)" .PP گزینه‌های \f[V]java\f[R] زیر، گزینه‌هایی با کاربرد عمومی هستند که مختص ماشین مجازی Java HotSpot می‌باشند. .TP \f[V]-Xbatch\f[R] کامپایل پس‌زمینه را غیرفعال می‌کند. به‌طور پیش‌فرض، JVM متد را به‌عنوان یک وظیفهٔ پس‌زمینه کامپایل کرده و تا زمان پایان کامپایل پس‌زمینه، متد را در حالت تفسیری (interpreter mode) اجرا می‌کند. پرچم \f[V]-Xbatch\f[R] کامپایل پس‌زمینه را غیرفعال می‌سازد تا کامپایل همهٔ متدها به‌عنوان یک وظیفهٔ پیش‌زمینه تا زمان تکمیل ادامه یابد. این گزینه معادل \f[V]-XX:-BackgroundCompilation\f[R] است. .TP \f[V]-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 در Windows، نقطه‌ویرگول (\f[V];\f[R]) موارد موجود در این فهرست را جدا می‌کند؛ در سایر پلتفرم‌ها این کار با دونقطه (\f[V]:\f[R]) انجام می‌شود. .RE .TP \f[V]-Xcheck:jni\f[R] بررسی‌های تکمیلی را برای توابع رابط بومی جاوا (JNI) انجام می‌دهد. .RS .PP بررسی‌های زیر نشان‌دهندهٔ مشکلات اساسی در کد بومی در نظر گرفته می‌شوند و JVM در چنین مواردی با یک خطای جبران‌ناپذیر متوقف می‌شود: .IP \[bu] 2 نخی که فراخوانی را انجام می‌دهد به JVM متصل نشده است. .IP \[bu] 2 نخی که فراخوانی را انجام می‌دهد از \f[V]JNIEnv\f[R] متعلق به نخی دیگر استفاده می‌کند. .IP \[bu] 2 یک بررسی اعتبارسنجی پارامتر با شکست مواجه شود: .RS 2 .IP \[bu] 2 یک \f[V]jfieldID\f[R] یا \f[V]jmethodID\f[R] نامعتبر تشخیص داده شود. برای نمونه: .RS 2 .IP \[bu] 2 از نوع نادرست باشد .IP \[bu] 2 به کلاس نادرستی مرتبط باشد .RE .IP \[bu] 2 پارامتری با نوع نادرست تشخیص داده شود. .IP \[bu] 2 یک مقدار پارامتر نامعتبر تشخیص داده شود. برای نمونه: .RS 2 .IP \[bu] 2 مقدار \f[V]NULL\f[R] در جایی که مجاز نیست .IP \[bu] 2 اندیس خارج از محدودهٔ آرایه، یا ظرفیت فریم نادرست .IP \[bu] 2 رشته‌ای غیر از UTF-8 .IP \[bu] 2 یک ارجاع نامعتبر JNI .IP \[bu] 2 تلاش برای استفاده از تابع \f[V]ReleaseXXX\f[R] روی پارامتری که توسط تابع متناظر \f[V]GetXXX\f[R] تولید نشده است .RE .RE .PP بررسی‌های زیر تنها منجر به چاپ هشدار می‌شوند: .IP \[bu] 2 یک فراخوانی JNI بدون بررسی استثنای معلق از فراخوانی قبلی JNI انجام شده است، و فراخوانی فعلی هنگام وجود یک استثنای معلق ایمن نیست. .IP \[bu] 2 توصیف‌کنندهٔ کلاس در قالب آراسته (\f[V]Lname;\f[R]) است، در حالی که نباید باشد. .IP \[bu] 2 پارامتر \f[V]NULL\f[R] مجاز است، اما استفاده از آن مشکوک است. .IP \[bu] 2 فراخوانی سایر توابع JNI در محدودهٔ \f[V]Get/ReleasePrimitiveArrayCritical\f[R] یا \f[V]Get/ReleaseStringCritical\f[R] .PP هنگام استفاده از این گزینه، انتظار افت کارایی را داشته باشید. .RE.TP \f[V]-Xcomp\f[R] حالت آزمایشی برای محک زدن کامپایلرهای JIT. این گزینه نباید در محیط‌های عملیاتی استفاده شود. .TP \f[V]-Xdebug\f[R] کاری انجام نمی‌دهد. تنها جهت سازگاری با نسخه‌های پیشین ارائه شده است. .TP \f[V]-Xdiag\f[R] پیام‌های تشخیصی اضافی را نمایش می‌دهد. .TP \f[V]-Xint\f[R] برنامه را فقط در حالت مفسری اجرا می‌کند. کامپایل به کد بومی غیرفعال شده و تمام بایت‌کدها توسط مفسر اجرا می‌شوند. مزایای کارایی ارائه‌شده توسط کامپایلر درجا (JIT) در این حالت وجود ندارند. .TP \f[V]-Xinternalversion\f[R] اطلاعات دقیق‌تری از نسخهٔ JVM را نسبت به گزینهٔ \f[V]-version\f[R] نمایش داده و سپس خارج می‌شود. .TP \f[V]-Xlog:\f[R]\f[I]option\f[R] پیکربندی یا فعال‌سازی ثبت وقایع (لاگ‌گیری) با چارچوب یکپارچهٔ لاگ‌گیری ماشین مجازی جاوا (JVM). بخش \f[B]Enable Logging with the JVM Unified Logging Framework\f[R] را ببینید. .TP \f[V]-Xmixed\f[R] همهٔ بایت‌کدها را توسط مفسر اجرا می‌کند، به‌جز متدهای پرکاربرد (hot methods) که به کد بومی کامپایل می‌شوند. به‌طور پیش‌فرض فعال است. برای غیرفعال کردن از \f[V]-Xint\f[R] استفاده کنید. .TP \f[V]-Xmn\f[R] \f[I]size\f[R] اندازهٔ اولیه و بیشینه (به بایت) هیپ را برای نسل جوان (nursery) در زباله‌روب‌های نسلی تنظیم می‌کند. حرف \f[V]k\f[R] یا \f[V]K\f[R] را برای مشخص کردن کیلوبایت، \f[V]m\f[R] یا \f[V]M\f[R] را برای مگابایت، یا \f[V]g\f[R] یا \f[V]G\f[R] را برای گیگابایت اضافه کنید. ناحیهٔ نسل جوان در هیپ برای اشیاء جدید استفاده می‌شود. عملیات زباله‌روبی (GC) در این ناحیه بیشتر از سایر نواحی انجام می‌گیرد. اگر اندازهٔ نسل جوان بیش از حد کوچک باشد، زباله‌روبی‌های جزئی (minor) متعددی انجام خواهد شد. اگر اندازه بیش از حد بزرگ باشد، تنها زباله‌روبی‌های کامل انجام می‌شوند که تکمیل آن‌ها می‌تواند زمان زیادی ببرد. توصیه می‌شود که اندازهٔ نسل جوان را برای زباله‌روب G1 تعیین نکنید، و برای سایر زباله‌روب‌ها اندازهٔ نسل جوان را بیشتر از ۲۵٪ و کمتر از ۵۰٪ کل اندازهٔ هیپ نگه دارید. مثال‌های زیر نحوهٔ تنظیم اندازهٔ اولیه و بیشینهٔ نسل جوان را روی 256 MB با استفاده از واحدهای مختلف نشان می‌دهند: .RS .IP .nf \f[CB] -Xmn256m -Xmn262144k -Xmn268435456 \f[R] .fi .PP به‌جای استفاده از گزینهٔ \f[V]-Xmn\f[R] جهت تنظیم توأم اندازهٔ اولیه و بیشینهٔ هیپ برای نسل جوان، می‌توانید از \f[V]-XX:NewSize\f[R] برای تنظیم اندازهٔ اولیه و از \f[V]-XX:MaxNewSize\f[R] برای تنظیم اندازهٔ بیشینه استفاده کنید. .RE .TP \f[V]-Xms\f[R] \f[I]size\f[R] کمینه و اندازهٔ اولیهٔ هیپ (به بایت) را تنظیم می‌کند. این مقدار باید مضربی از 1024 و بزرگ‌تر از 1 MB باشد. حرف \f[V]k\f[R] یا \f[V]K\f[R] را برای مشخص کردن کیلوبایت، \f[V]m\f[R] یا \f[V]M\f[R] را برای مگابایت، یا \f[V]g\f[R] یا \f[V]G\f[R] را برای گیگابایت اضافه کنید. مثال‌های زیر نحوهٔ تنظیم اندازهٔ حافظهٔ تخصیص‌یافته را روی 6 MB با استفاده از واحدهای مختلف نشان می‌دهند: .RS .IP .nf \f[CB] -Xms6291456 -Xms6144k -Xms6m \f[R] .fi .PP اگر این گزینه را تنظیم نکنید، اندازهٔ اولیه برابر با مجموع اندازه‌های تخصیص‌یافته به نسل قدیم (old generation) و نسل جوان تنظیم خواهد شد. اندازهٔ اولیهٔ هیپ برای نسل جوان را می‌توان با استفاده از گزینهٔ \f[V]-Xmn\f[R] یا گزینهٔ \f[V]-XX:NewSize\f[R] تعیین کرد. .PP توجه داشته باشید که از گزینهٔ \f[V]-XX:InitialHeapSize\f[R] نیز می‌توان برای تنظیم اندازهٔ اولیهٔ هیپ استفاده کرد. چنانچه این گزینه پس از \f[V]-Xms\f[R] در خط فرمان بیاید، اندازهٔ اولیهٔ هیپ روی مقدار مشخص‌شده با \f[V]-XX:InitialHeapSize\f[R] تنظیم می‌شود. .RE .TP \f[V]-Xmx\f[R] \f[I]size\f[R] بیشینهٔ اندازهٔ هیپ (به بایت) را مشخص می‌کند. این مقدار باید مضربی از 1024 و بزرگ‌تر از 2 MB باشد. حرف \f[V]k\f[R] یا \f[V]K\f[R] را برای مشخص کردن کیلوبایت، \f[V]m\f[R] یا \f[V]M\f[R] را برای مگابایت، یا \f[V]g\f[R] یا \f[V]G\f[R] را برای گیگابایت اضافه کنید. مقدار پیش‌فرض در زمان اجرا بر اساس پیکربندی سیستم تعیین می‌شود. در استقرارهای سرور، معمولاً مقادیر \f[V]-Xms\f[R] و \f[V]-Xmx\f[R] روی مقداری یکسان تنظیم می‌شوند. مثال‌های زیر نحوهٔ تنظیم بیشینهٔ اندازهٔ مجاز حافظهٔ تخصیص‌یافته را روی 80 MB با استفاده از واحدهای مختلف نشان می‌دهند: .RS .IP .nf \f[CB] -Xmx83886080 -Xmx81920k -Xmx80m \f[R] .fi .PP گزینهٔ \f[V]-Xmx\f[R] معادل \f[V]-XX:MaxHeapSize\f[R] است. .RE .TP \f[V]-Xnoclassgc\f[R] زباله‌روبی (GC) کلاس‌ها را غیرفعال می‌کند. این کار می‌تواند مقداری از زمان GC را ذخیره کرده و وقفه‌ها در طول اجرای برنامه را کوتاه‌تر کند. هنگامی که هنگام راه‌اندازی گزینهٔ \f[V]-Xnoclassgc\f[R] را مشخص می‌کنید، اشیاء مربوط به کلاس‌ها در طول زباله‌روبی دست‌نخورده باقی می‌مانند و همواره زنده تلقی می‌شوند. این امر می‌تواند باعث اشغال دائمی حافظهٔ بیشتری شود که در صورت عدم دقت در مصرف، خطای کمبود حافظه (out-of-memory) ایجاد خواهد کرد. .TP \f[V]-Xrs\f[R] استفاده از سیگنال‌های سیستم‌عامل توسط JVM را کاهش می‌دهد. قلاب‌های خروج (shutdown hooks) با اجرای کدهای پاک‌سازی کاربر (نظیر بستن اتصالات پایگاه داده) در هنگام خروج، امکان خاموش شدن منظم برنامهٔ جاوا را فراهم می‌سازند، حتی اگر JVM به‌طور ناگهانی خاتمه یابد. .RS .IP \[bu] 2 \f[B]سیستم‌های غیر ویندوزی (Non-Windows):\f[R] .RS 2 .IP \[bu] 2 ماشین JVM برای پیاده‌سازی قلاب‌های خروج در هنگام خاتمه‌های نامنتظره، سیگنال‌ها را دریافت می‌کند. ماشین JVM از \f[V]SIGHUP\f[R]، \f[V]SIGINT\f[R] و \f[V]SIGTERM\f[R] برای آغاز اجرای قلاب‌های خروج استفاده می‌کند. .IP \[bu] 2 برنامه‌هایی که JVM را درون خود تعبیه می‌کنند، معمولاً نیاز به دریافت سیگنال‌هایی چون \f[V]SIGINT\f[R] یا \f[V]SIGTERM\f[R] دارند که می‌تواند منجر به تداخل با گرداننده‌های سیگنال JVM شود. گزینهٔ \f[V]-Xrs\f[R] برای رسیدگی به این مسئله تدارک دیده شده است. هنگامی که \f[V]-Xrs\f[R] استفاده می‌شود، ماسک سیگنال‌ها برای \f[V]SIGINT\f[R]، \f[V]SIGTERM\f[R]، \f[V]SIGHUP\f[R] و \f[V]SIGQUIT\f[R] توسط JVM تغییر داده نمی‌شود و هیچ گرداننده‌ای برای این سیگنال‌ها نصب نخواهد شد. .RE .IP \[bu] 2 \f[B]ویندوز (Windows):\f[R] .RS 2 .IP \[bu] 2 ماشین JVM رویدادهای کنترلی کنسول را برای پیاده‌سازی قلاب‌های خروج در شرایط خاتمهٔ نامنتظره زیر نظر می‌گیرد. به‌ویژه، JVM یک گردانندهٔ کنترل کنسول ثبت می‌کند که پردازش قلاب خروج را آغاز کرده و برای رویدادهای \f[V]CTRL_C_EVENT\f[R]، \f[V]CTRL_CLOSE_EVENT\f[R]، \f[V]CTRL_LOGOFF_EVENT\f[R] و \f[V]CTRL_SHUTDOWN_EVENT\f[R] مقدار \f[V]TRUE\f[R] بازمی‌گرداند. .IP \[bu] 2 ماشین JVM سازوکار مشابهی را برای پیاده‌سازی قابلیت تخلیهٔ پشتهٔ ریسه‌ها (thread dumps) جهت مقاصد اشکال‌زدایی به‌کار می‌برد. ماشین JVM از \f[V]CTRL_BREAK_EVENT\f[R] برای تخلیهٔ پشتهٔ ریسه‌ها استفاده می‌کند. .IP \[bu] 2 اگر JVM به‌صورت یک سرویس اجرا شود (به‌عنوان نمونه، به‌عنوان یک موتور سرولت برای یک وب‌سرور)، ممکن است \f[V]CTRL_LOGOFF_EVENT\f[R] را دریافت کند اما نباید فرایند خاموش شدن را آغاز نماید، چرا که سیستم‌عامل در عمل فرایند را خاتمه نمی‌دهد. جهت پیشگیری از چنین تداخلات احتمالی، می‌توان از گزینهٔ \f[V]-Xrs\f[R] استفاده کرد. زمانی که گزینهٔ \f[V]-Xrs\f[R] به‌کار رود، JVM هیچ گردانندهٔ کنترل کنسولی نصب نمی‌کند که این بدان معناست رویدادهای \f[V]CTRL_C_EVENT\f[R]، \f[V]CTRL_CLOSE_EVENT\f[R]، \f[V]CTRL_LOGOFF_EVENT\f[R] یا \f[V]CTRL_SHUTDOWN_EVENT\f[R] زیر نظر گرفته یا پردازش نمی‌شوند. .RE .PP مشخص کردن گزینهٔ \f[V]-Xrs\f[R] دو پیامد در پی دارد: .IP \[bu] 2 \f[B]سیستم‌های غیر ویندوزی:\f[R] تخلیهٔ پشتهٔ ریسه‌ها با سیگنال \f[V]SIGQUIT\f[R] در دسترس نخواهد بود. .IP \[bu] 2 \f[B]ویندوز:\f[R] تخلیهٔ پشتهٔ ریسه‌ها با کلیدهای میانبر Ctrl + Break در دسترس نخواهد بود. .PP کد کاربر وظیفه دارد اجرای قلاب‌های خروج را سبب شود؛ برای مثال با صدا زدن متد \f[V]System.exit()\f[R] در زمانی که قرار است JVM خاتمه یابد. .RE .TP \f[V]-Xshare:\f[R]\f[I]mode\f[R] حالت اشتراک‌گذاری داده‌های کلاس (CDS) را تنظیم می‌کند. .RS .PP آرگومان‌های ممکن برای \f[I]mode\f[R] در این گزینه شامل موارد زیر است:.TP \f[V]auto\f[R] در صورت امکان از داده‌های کلاس مشترک استفاده می‌کند (پیش‌فرض). .TP \f[V]on\f[R] استفاده از داده‌های کلاس مشترک را الزامی می‌کند، در غیر این صورت با شکست مواجه می‌شود. .RS .PP \f[B]نکته:\f[R] گزینه \f[V]-Xshare:on\f[R] صرفاً برای مقاصد آزمایشی استفاده می‌شود. این گزینه در صورتی که آرشیو CDS قابل استفاده نباشد (برای مثال، هنگامی که پارامترهای مشخصی از VM تغییر کرده باشند، یا هنگامی که از یک JDK دیگر استفاده شود) ممکن است باعث خروج غیرمنتظره VM در زمان راه‌اندازی گردد. این گزینه نباید در محیط‌های عملیاتی استفاده شود. .RE .TP \f[V]off\f[R] تلاشی برای استفاده از داده‌های کلاس مشترک نمی‌کند. .RE .TP \f[V]-XshowSettings\f[R] تمام تنظیمات را نمایش داده و سپس ادامه می‌دهد. .TP \f[V]-XshowSettings:\f[R]\f[I]category\f[R] تنظیمات را نمایش داده و ادامه می‌دهد. آرگومان‌های ممکن \f[I]category\f[R] برای این گزینه شامل موارد زیر هستند: .RS .TP \f[V]all\f[R] تمام دسته‌بندی‌های تنظیمات را نمایش می‌دهد. این مقدار پیش‌فرض است. .TP \f[V]locale\f[R] تنظیمات مربوط به locale را نمایش می‌دهد. .TP \f[V]properties\f[R] تنظیمات مربوط به ویژگی‌های سیستم (system properties) را نمایش می‌دهد. .TP \f[V]vm\f[R] تنظیمات JVM را نمایش می‌دهد. .TP \f[V]system\f[R] \f[B]فقط لینوکس:\f[R] پیکربندی سیستم میزبان یا کانتینر را نمایش داده و ادامه می‌دهد. .RE .TP \f[V]-Xss\f[R] \f[I]size\f[R] اندازه پشته ریسه (thread stack size) را (به بایت) تنظیم می‌کند. حرف \f[V]k\f[R] یا \f[V]K\f[R] را برای مشخص کردن کیلوبایت، \f[V]m\f[R] یا \f[V]M\f[R] را برای مشخص کردن مگابایت، یا \f[V]g\f[R] یا \f[V]G\f[R] را برای مشخص کردن گیگابایت اضافه کنید. اندازه واقعی ممکن است بر اساس نیاز سیستم‌عامل به مضربی از اندازه صفحه سیستم (system page size) گرد شود. مقدار پیش‌فرض به سیستم‌عامل و پلتفرم بستگی دارد. به عنوان مثال: .RS .IP \[bu] 2 Linux/x64: 1024 KB .IP \[bu] 2 Linux/Aarch64: 2048 KB .IP \[bu] 2 macOS/x64: 1024 KB .IP \[bu] 2 macOS/Aarch64: 2048 KB .IP \[bu] 2 Windows: مقدار پیش‌فرض به حافظه مجازی بستگی دارد .PP مثال‌های زیر اندازه پشته ریسه را با واحدهای مختلف بر روی 1024 KB تنظیم می‌کنند: .IP .nf \f[CB] -Xss1m -Xss1024k -Xss1048576 \f[R] .fi .PP این گزینه مشابه با \f[V]-XX:ThreadStackSize\f[R] است. .RE .TP \f[V]--add-reads\f[R] \f[I]module\f[R]\f[V]=\f[R]\f[I]target-module\f[R](\f[V],\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 باشد تا تمام ماژول‌های بدون نام را بخواند. .TP \f[V]--add-exports\f[R] \f[I]module\f[R]\f[V]/\f[R]\f[I]package\f[R]\f[V]=\f[R]\f[I]target-module\f[R](\f[V],\f[R]\f[I]target-module\f[R])* ماژول \f[I]module\f[R] را به‌روزرسانی می‌کند تا بدون در نظر گرفتن اعلان ماژول، \f[I]package\f[R] را به \f[I]target-module\f[R] صادر کند. مقدار \f[I]target-module\f[R] می‌تواند all unnamed باشد تا به تمام ماژول‌های بدون نام صادر شود. .TP \f[V]--add-opens\f[R] \f[I]module\f[R]\f[V]/\f[R]\f[I]package\f[R]\f[V]=\f[R]\f[I]target-module\f[R](\f[V],\f[R]\f[I]target-module\f[R])* ماژول \f[I]module\f[R] را به‌روزرسانی می‌کند تا بدون در نظر گرفتن اعلان ماژول، \f[I]package\f[R] را برای \f[I]target-module\f[R] باز کند. .TP \f[V]--limit-modules\f[R] \f[I]module\f[R][\f[V],\f[R]\f[I]module\f[R]...] محدوده جهان ماژول‌های قابل مشاهده را تعیین می‌کند. .TP \f[V]--patch-module\f[R] \f[I]module\f[R]\f[V]=\f[R]\f[I]file\f[R](\f[V];\f[R]\f[I]file\f[R])* یک ماژول را با کلاس‌ها و منابع موجود در فایل‌های JAR یا دایرکتوری‌ها جایگزین یا تقویت می‌کند. .TP \f[V]--source\f[R] \f[I]version\f[R] نسخه سورس (source) را در حالت فایل سورس (source-file mode) تنظیم می‌کند. .SH "گزینه‌های اضافی برای MACOS (EXTRA OPTIONS FOR MACOS)" .PP گزینه‌های اضافی زیر مختص macOS هستند. .TP \f[V]-XstartOnFirstThread\f[R] متد \f[V]main()\f[R] را در اولین ریسه (AppKit) اجرا می‌کند. .TP \f[V]-Xdock:name=\f[R]\f[I]application_name\f[R] نام پیش‌فرض برنامه که در dock نمایش داده می‌شود را بازنویسی می‌کند. .TP \f[V]-Xdock:icon=\f[R]\f[I]path_to_icon_file\f[R] آیکون پیش‌فرض نمایش داده‌شده در dock را بازنویسی می‌کند. .SH "گزینه‌های پیشرفته برای JAVA (ADVANCED OPTIONS FOR JAVA)" .PP این گزینه‌های \f[V]java\f[R] می‌توانند برای فعال کردن سایر گزینه‌های پیشرفته استفاده شوند. .TP \f[V]-XX:+UnlockDiagnosticVMOptions\f[R] گزینه‌های در نظر گرفته شده برای عیب‌یابی JVM را قفل‌گشایی می‌کند. به طور پیش‌فرض، این گزینه غیرفعال است و گزینه‌های عیب‌یابی در دسترس نیستند. .RS .PP گزینه‌های خط فرمانی که با استفاده از این گزینه فعال می‌شوند، پشتیبانی نمی‌شوند. اگر در حین استفاده از هر یک از این گزینه‌ها با مشکلی مواجه شدید، بسیار محتمل است که پیش از کمک Oracle Support در بررسی موضوع، لازم باشد مشکل را بدون استفاده از هر یک از این گزینه‌های پشتیبانی‌نشده بازتولید کنید. همچنین این احتمال وجود دارد که هر یک از این گزینه‌ها بدون اطلاع قبلی حذف شده یا رفتار آن‌ها تغییر کند. .RE .TP \f[V]-XX:+UnlockExperimentalVMOptions\f[R] گزینه‌هایی که ویژگی‌های آزمایشی را در JVM ارائه می‌دهند قفل‌گشایی می‌کند. به طور پیش‌فرض، این گزینه غیرفعال است و ویژگی‌های آزمایشی در دسترس نیستند..SH "گزینه‌های پیشرفته زمان اجرا برای جاوا (ADVANCED RUNTIME OPTIONS FOR JAVA)" .PP این گزینه‌های \f[V]java\f[R] رفتار زمان اجرای Java HotSpot VM را کنترل می‌کنند. .TP \f[V]-XX:ActiveProcessorCount=\f[R]\f[I]x\f[R] تعداد CPUهایی را بازنویسی می‌کند که VM برای محاسبه اندازه استخرهای ریسه (thread pools) جهت عملیات‌های گوناگون مانند Garbage Collection و ForkJoinPool استفاده خواهد کرد. .RS .PP به‌طور معمول VM تعداد پردازنده‌های در دسترس را از سیستم‌عامل تعیین می‌کند. این پرچم می‌تواند برای افرازش (partitioning) منابع CPU هنگام اجرای چندین فرایند جاوا در کانتینرهای docker مفید باشد. این پرچم حتی در صورت فعال نبودن \f[V]UseContainerSupport\f[R] نیز اعمال می‌شود. برای شرح فعال‌سازی و غیرفعال‌سازی پشتیبانی از کانتینر، \f[V]-XX:-UseContainerSupport\f[R] را ببینید. .RE .TP \f[V]-XX:AllocateHeapAt=\f[R]\f[I]path\f[R] مسیری به سیستم فایل را دریافت کرده و از نگاشت حافظه برای تخصیص هیپ اشیاء (object heap) روی دستگاه حافظه استفاده می‌کند. استفاده از این گزینه HotSpot VM را قادر می‌سازد تا هیپ اشیاء جاوا را روی یک دستگاه حافظه جایگزین که توسط کاربر مشخص شده است، مانند یک NV-DIMM، تخصیص دهد. .RS .PP دستگاه‌های حافظه جایگزین که معناشناسی یکسانی با DRAM دارند، از جمله معناشناسی عملیات‌های اتمیک (atomic)، می‌توانند بدون تغییر کد برنامه موجود به جای DRAM برای هیپ اشیاء استفاده شوند. سایر ساختارهای حافظه (مانند code heap، metaspace و پشته‌های ریسه) همچنان در DRAM باقی می‌مانند. .PP برخی از سیستم‌عامل‌ها حافظه غیر-DRAM را از طریق سیستم فایل ارائه می‌دهند. فایل‌های نگاشت‌شده در حافظه (memory-mapped) در این سیستم‌فایل‌ها حافظه پنهان صفحه (page cache) را دور می‌زنند و نگاشت مستقیمی از حافظه مجازی به حافظه فیزیکی روی دستگاه فراهم می‌کنند. پرچم‌های موجود مربوط به هیپ (مانند \f[V]-Xmx\f[R] و \f[V]-Xms\f[R]) و پرچم‌های مربوط به garbage collection همچنان مانند گذشته کار می‌کنند. .RE .TP \f[V]-XX:-CompactStrings\f[R] ویژگی رشته‌های فشرده (Compact Strings) را غیرفعال می‌کند. به‌طور پیش‌فرض، این گزینه فعال است. هنگامی که این گزینه فعال باشد، رشته‌های جاوا که تنها شامل نویسه‌های تک‌بایتی هستند، به‌صورت درونی با استفاده از کدگذاری ISO-8859-1 / Latin-1 به عنوان رشته‌های تک‌بایت-به‌ازای-نویسه نمایش داده شده و ذخیره می‌شوند. این کار میزان فضای مورد نیاز برای رشته‌هایی که فقط نویسه‌های تک‌بایتی دارند را تا ۵۰٪ کاهش می‌دهد. برای رشته‌های جاوا شامل حداقل یک نویسه چندبایتی: این رشته‌ها با استفاده از کدگذاری UTF-16 به‌صورت ۲ بایت به‌ازای هر نویسه نمایش داده شده و ذخیره می‌شوند. غیرفعال کردن ویژگی Compact Strings استفاده از کدگذاری UTF-16 را به عنوان نمایش درونی برای تمام رشته‌های جاوا اجباری می‌کند. .RS .PP مواردی که در آنها غیرفعال کردن Compact Strings ممکن است سودمند باشد شامل موارد زیر است: .IP \[bu] 2 هنگامی که مشخص باشد یک برنامه به‌طور عمده در حال تخصیص رشته‌های با نویسه‌های چندبایتی خواهد بود .IP \[bu] 2 در رویداد غیرمنتظره‌ای که افت کارایی در مهاجرت از Java SE 8 به Java SE 9 مشاهده شود و تحلیل‌ها نشان دهند که Compact Strings مسبب این افت کارایی است .PP در هر دوی این سناریوها، غیرفعال کردن Compact Strings منطقی است. .RE .TP \f[V]-XX:ErrorFile=\f[R]\f[I]filename\f[R] مسیر و نام فایلی را مشخص می‌کند که داده‌های خطا در صورت بروز خطای جبران‌ناپذیر در آن نوشته می‌شوند. به‌طور پیش‌فرض، این فایل در دایرکتوری کاری فعلی ایجاد می‌شود و با نام \f[V]hs_err_pid\f[R]\f[I]pid\f[R]\f[V].log\f[R] ذخیره می‌گردد که در آن \f[I]pid\f[R] شناسه فرایندی است که با خطا مواجه شده است. .RS .PP مثال زیر نحوه تنظیم فایل لاگ پیش‌فرض را نشان می‌دهد (توجه داشته باشید که شناسه فرایند به‌صورت \f[V]%p\f[R] مشخص می‌شود): .RS .PP \f[V]-XX:ErrorFile=./hs_err_pid%p.log\f[R] .RE .IP \[bu] 2 \f[B]غیر ویندوز (Non-Windows):\f[R] مثال زیر نحوه تنظیم لاگ خطا روی \f[V]/var/log/java/java_error.log\f[R] را نشان می‌دهد: .RS 2 .RS .PP \f[V]-XX:ErrorFile=/var/log/java/java_error.log\f[R] .RE .RE .IP \[bu] 2 \f[B]ویندوز (Windows):\f[R] مثال زیر نحوه تنظیم فایل لاگ خطا روی \f[V]C:/log/java/java_error.log\f[R] را نشان می‌دهد: .RS 2 .RS .PP \f[V]-XX:ErrorFile=C:/log/java/java_error.log\f[R] .RE .RE .PP اگر فایل وجود داشته باشد و قابل نوشتن باشد، رونویسی خواهد شد. در غیر این صورت، اگر امکان ایجاد فایل در دایرکتوری مشخص‌شده نباشد (به‌دلیل کمبود فضا، مشکل دسترسی، یا مسئله‌ای دیگر)، فایل در دایرکتوری موقت سیستم‌عامل ایجاد می‌شود: .IP \[bu] 2 \f[B]غیر ویندوز (Non-Windows):\f[R] دایرکتوری موقت \f[V]/tmp\f[R] است. .IP \[bu] 2 \f[B]ویندوز (Windows):\f[R] دایرکتوری موقت توسط مقدار متغیر محیطی \f[V]TMP\f[R] مشخص می‌شود؛ اگر این متغیر محیطی تعریف نشده باشد، از مقدار متغیر محیطی \f[V]TEMP\f[R] استفاده می‌شود. .RE .TP \f[V]-XX:+ExtensiveErrorReports\f[R] گزارش‌دهی اطلاعات خطای گسترده‌تر را در \f[V]ErrorFile\f[R] فعال می‌کند. این گزینه می‌تواند در محیط‌هایی فعال شود که حداکثر اطلاعات مورد نیاز است \- حتی اگر لاگ‌های حاصل بسیار حجیم باشند و/یا حاوی اطلاعاتی باشند که حساس تلقی شوند. اطلاعات می‌تواند از نگارشی به نگارش دیگر و در بسترهای مختلف متفاوت باشد. به‌طور پیش‌فرض این گزینه غیرفعال است. .TP \f[V]-XX:FlightRecorderOptions=\f[R]\f[I]parameter\f[R]\f[V]=\f[R]\f[I]value\f[R] (یا) \f[V]-XX:FlightRecorderOptions:\f[R]\f[I]parameter\f[R]\f[V]=\f[R]\f[I]value\f[R] پارامترهایی را تعیین می‌کند که رفتار JFR را کنترل می‌کنند. چندین پارامتر را می‌توان با جدا کردن آنها توسط کاما مشخص کرد. .RS .PP فهرست زیر شامل ورودی‌های موجود \f[I]parameter\f[R]\f[V]=\f[R]\f[I]value\f[R] برای JFR است: .TP \f[V]globalbuffersize=\f[R]\f[I]size\f[R] مقدار کل حافظه اصلی استفاده‌شده برای نگهداری داده‌ها را مشخص می‌کند. مقدار پیش‌فرض بر اساس مقدار مشخص‌شده برای \f[V]memorysize\f[R] است. برای تغییر اندازه بافرهای سراسری، پارامتر \f[V]memorysize\f[R] را تغییر دهید. .TP \f[V]maxchunksize=\f[R]\f[I]size\f[R] حداکثر اندازه (به بایت) تکه‌داده‌ها در یک ضبط را مشخص می‌کند. برای مشخص کردن اندازه بر حسب مگابایت (MB) حرف \f[V]m\f[R] یا \f[V]M\f[R]، یا برای گیگابایت (GB) حرف \f[V]g\f[R] یا \f[V]G\f[R] را پیوست کنید. به‌طور پیش‌فرض، حداکثر اندازه تکه‌داده‌ها روی 12 مگابایت تنظیم شده است. حداقل مقدار مجاز 1 مگابایت است. .TP \f[V]memorysize=\f[R]\f[I]size\f[R] تعیین می‌کند چه مقدار حافظه بافر باید استفاده شود، و پارامترهای \f[V]globalbuffersize\f[R] و \f[V]numglobalbuffers\f[R] را بر اساس اندازه مشخص‌شده تنظیم می‌کند. برای مشخص کردن اندازه بر حسب مگابایت (MB) حرف \f[V]m\f[R] یا \f[V]M\f[R]، یا برای گیگابایت (GB) حرف \f[V]g\f[R] یا \f[V]G\f[R] را پیوست کنید. به‌طور پیش‌فرض، اندازه حافظه روی 10 مگابایت تنظیم شده است. .TP \f[V]numglobalbuffers\f[R] تعداد بافرهای سراسری استفاده‌شده را مشخص می‌کند. مقدار پیش‌فرض بر اساس اندازه حافظه مشخص‌شده تعیین می‌شود. برای تغییر تعداد بافرهای سراسری، پارامتر \f[V]memorysize\f[R] را تغییر دهید. .TP \f[V]old-object-queue-size=number-of-objects\f[R] حداکثر تعداد اشیاء قدیمی (old objects) برای ردیابی. به‌طور پیش‌فرض، تعداد اشیاء روی ۲۵۶ تنظیم شده است. .TP \f[V]preserve-repository=\f[R]{\f[V]true\f[R]|\f[V]false\f[R]} مشخص می‌کند که آیا فایل‌های ذخیره‌شده در مخزن دیسک باید پس از خروج JVM نگه داشته شوند یا خیر. اگر false باشد، فایل‌ها حذف می‌شوند. به‌طور پیش‌فرض، این پارامتر غیرفعال است. .TP \f[V]repository=\f[R]\f[I]path\f[R] مخزن (یک دایرکتوری) را برای ذخیره‌سازی موقت دیسک مشخص می‌کند. به‌طور پیش‌فرض، از دایرکتوری موقت سیستم استفاده می‌شود. .TP \f[V]retransform=\f[R]{\f[V]true\f[R]|\f[V]false\f[R]} مشخص می‌کند که آیا کلاس‌های رویداد باید با استفاده از JVMTI بازدگرگون (retransform) شوند یا خیر. اگر false باشد، آماده‌سازی (instrumentation) هنگام بارگیری کلاس‌های رویداد اضافه می‌شود. به‌طور پیش‌فرض، این پارامتر فعال است. .TP \f[V]stackdepth=\f[R]\f[I]depth\f[R] عمق پشته برای ردگیری پشته (stack trace). به‌طور پیش‌فرض، عمق روی ۶۴ فراخوانی متد تنظیم شده است. حداکثر مقدار ۲۰۴۸ است. مقادیر بزرگ‌تر از ۶۴ می‌توانند سربار قابل توجهی ایجاد کرده و کارایی را کاهش دهند. .TP \f[V]threadbuffersize=\f[R]\f[I]size\f[R] اندازه بافر محلی به‌ازای هر ریسه را (به بایت) مشخص می‌کند. به‌طور پیش‌فرض، اندازه بافر محلی روی ۸ کیلوبایت با حداقل مقدار ۴ کیلوبایت تنظیم شده است. بازنویسی این پارامتر می‌تواند کارایی را کاهش دهد و توصیه نمی‌شود. .RE .TP \f[V]-XX:LargePageSizeInBytes=\f[R]\f[I]size\f[R] حداکثر اندازه صفحه بزرگ (large page size) استفاده‌شده توسط JVM را (به بایت) تنظیم می‌کند. آرگومان \f[I]size\f[R] باید اندازه صفحه معتبری باشد که توسط محیط پشتیبانی می‌شود تا تأثیری داشته باشد. برای تعیین کیلوبایت حرف \f[V]k\f[R] یا \f[V]K\f[R]، برای مگابایت \f[V]m\f[R] یا \f[V]M\f[R]، یا برای گیگابایت \f[V]g\f[R] یا \f[V]G\f[R] را پیوست کنید. به‌طور پیش‌فرض، اندازه روی 0 تنظیم شده است؛ به این معنی که JVM از اندازه پیش‌فرض صفحه بزرگ برای محیط به عنوان حداکثر اندازه برای صفحه‌های بزرگ استفاده خواهد کرد. بخش \f[B]Large Pages\f[R] را ببینید. .RS.PP مثال زیر نحوه تنظیم اندازه صفحه‌های بزرگ (large pages) روی ۱ گیگابایت (GB) را شرح می‌دهد: .RS .PP \f[V]-XX:LargePageSizeInBytes=1g\f[R] .RE .RE .TP \f[V]-XX:MaxDirectMemorySize=\f[R]\f[I]size\f[R] حداکثر اندازه کل (به بایت) تخصیص‌های بافر مستقیم (direct-buffer) در بسته \f[V]java.nio\f[R] را تعیین می‌کند. حرف \f[V]k\f[R] یا \f[V]K\f[R] را برای مشخص کردن کیلوبایت، \f[V]m\f[R] یا \f[V]M\f[R] را برای مگابایت و \f[V]g\f[R] یا \f[V]G\f[R] را برای گیگابایت به انتها اضافه کنید. اگر تنظیم نشود، پرچم نادیده گرفته شده و JVM اندازه تخصیص‌های بافر مستقیم NIO را به‌طور خودکار انتخاب می‌کند. .RS .PP مثال‌های زیر نحوه تعیین اندازه NIO روی ۱۰۲۴ کیلوبایت با واحدهای مختلف را نشان می‌دهند: .IP .nf \f[CB] -XX:MaxDirectMemorySize=1m -XX:MaxDirectMemorySize=1024k -XX:MaxDirectMemorySize=1048576 \f[R] .fi .RE .TP \f[V]-XX:-MaxFDLimit\f[R] تلاش برای تنظیم حد نرم (soft limit) تعداد توصیف‌کننده‌های فایل باز به حد سخت (hard limit) را غیرفعال می‌کند. به‌طور پیش‌فرض، این گزینه در تمام پلتفرم‌ها فعال است، اما در Windows نادیده گرفته می‌شود. تنها زمانی ممکن است به غیرفعال کردن آن نیاز داشته باشید که روی macOS باشید؛ جایی که استفاده از آن سقف ۱۰۲۴۰ را تحمیل می‌کند که از حداکثر واقعی سیستم کمتر است. .TP \f[V]-XX:NativeMemoryTracking=\f[R]\f[I]mode\f[R] حالت ردیابی مصرف حافظه بومی (native memory) ماشین مجازی جاوا (JVM) را مشخص می‌کند. آرگومان‌های ممکن \f[I]mode\f[R] برای این گزینه شامل موارد زیر است: .RS .TP \f[V]off\f[R] دستور می‌دهد که مصرف حافظه بومی JVM ردیابی نشود. اگر گزینه \f[V]-XX:NativeMemoryTracking\f[R] را مشخص نکنید، این رفتار پیش‌فرض است. .TP \f[V]summary\f[R] مصرف حافظه را فقط بر اساس زیرسیستم‌های JVM مانند هیپ (heap) جاوا، کلاس، کد و ریسه (thread) ردیابی می‌کند. .TP \f[V]detail\f[R] علاوه بر ردیابی مصرف حافظه بر اساس زیرسیستم‌های JVM، مصرف حافظه را به ازای هر \f[V]CallSite\f[R]، هر ناحیه حافظه مجازی مجزا و نواحی متعهدشده‌ی (committed) آن ردیابی می‌کند. .RE .TP \f[V]-XX:TrimNativeHeapInterval=\f[R]\f[I]millis\f[R] فاصله زمانی (به میلی‌ثانیه) که در آن JVM هیپ بومی را هرس (trim) می‌کند. مقادیر کمتر، حافظه را مشتاقانه‌تر بازپس‌گیری می‌کنند اما هزینه سربار بالاتری خواهند داشت. مقدار 0 (پیش‌فرض) هرس هیپ بومی را غیرفعال می‌کند. هرس هیپ بومی در یک ریسه (thread) اختصاصی انجام می‌شود. .RS .PP این گزینه فقط روی Linux با کتابخانه سی گنو (glibc) پشتیبانی می‌شود. .RE .TP \f[V]-XX:+NeverActAsServerClassMachine\f[R] حالت «شبیه‌سازی ماشین مجازی کلاینت» (\[dq]Client VM emulation\[dq]) را فعال می‌کند که فقط از کامپایلر C1 JIT، یک CodeCache با اندازه ۳۲ مگابایت و Serial GC استفاده می‌کند. حداکثر مقدار حافظه‌ای که JVM می‌تواند استفاده کند (کنترل‌شده توسط پرچم \f[V]-XX:MaxRAM=n\f[R]) به‌طور پیش‌فرض روی ۱ گیگابایت تنظیم شده است. رشته‌ی \[dq]emulated-client\[dq] به رشته نسخه JVM افزوده می‌شود. .RS .PP به‌طور پیش‌فرض این پرچم تنها در Windows در حالت ۳۲ بیتی روی \f[V]true\f[R] و در تمام موارد دیگر روی \f[V]false\f[R] تنظیم است. .PP در صورت استفاده از هر یک از پرچم‌های زیر در خط فرمان، حالت «Client VM emulation» فعال نخواهد شد: .IP .nf \f[CB] -XX:{+|-}TieredCompilation -XX:CompilationMode=mode -XX:TieredStopAtLevel=n -XX:{+|-}EnableJVMCI -XX:{+|-}UseJVMCICompiler \f[R] .fi .RE .TP \f[V]-XX:ObjectAlignmentInBytes=\f[R]\f[I]alignment\f[R] تراز حافظه (memory alignment) اشیاء جاوا را (به بایت) تنظیم می‌کند. به‌طور پیش‌فرض، مقدار روی ۸ بایت تنظیم شده است. مقدار مشخص‌شده باید توانی از ۲ و در محدوده بین ۸ و ۲۵۶ (شامل هر دو) باشد. این گزینه استفاده از اشاره‌گرهای فشرده (compressed pointers) با اندازه‌های بزرگ هیپ جاوا را امکان‌پذیر می‌سازد. .RS .PP حد اندازه هیپ بر حسب بایت به این صورت محاسبه می‌شود: .RS .PP \f[V]4GB * ObjectAlignmentInBytes\f[R] .RE .RS .PP \f[B]نکته:\f[R] با افزایش مقدار تراز، فضای بلااستفاده بین اشیاء نیز افزایش می‌یابد. در نتیجه، ممکن است هیچ مزیتی از استفاده از اشاره‌گرهای فشرده با اندازه‌های بزرگ هیپ جاوا حاصل نشود. .RE .RE .TP \f[V]-XX:OnError=\f[R]\f[I]string\f[R] یک دستور سفارشی یا مجموعه‌ای از دستورهای جداشده با نقطه‌ویرگول را برای اجرا در هنگام وقوع یک خطای غیرقابل جبران تنظیم می‌کند. اگر رشته حاوی فاصله باشد، باید درون علامت نقل‌قول قرار گیرد. .RS .IP \[bu] 2 \f[B]غیر ویندوز:\f[R] مثال زیر نشان می‌دهد چگونه می‌توان از گزینه \f[V]-XX:OnError\f[R] برای اجرای دستور \f[V]gcore\f[R] جهت ایجاد core image و اجرای دیباگر \f[V]gdb\f[R] برای اتصال به فرایند در هنگام وقوع خطای غیرقابل جبران استفاده کرد (عبارت \f[V]%p\f[R] نشان‌دهنده شناسه فرایند فعلی است): .RS 2 .RS .PP \f[V]-XX:OnError=\[dq]gcore %p;gdb -p %p\[dq]\f[R] .RE .RE .IP \[bu] 2 \f[B]ویندوز:\f[R] مثال زیر نشان می‌دهد چگونه می‌توان از گزینه \f[V]-XX:OnError\f[R] برای اجرای ابزار \f[V]userdump.exe\f[R] جهت دریافت یک crash dump در هنگام بروز خطای غیرقابل جبران استفاده کرد (عبارت \f[V]%p\f[R] نشان‌دهنده شناسه فرایند فعلی است). این مثال فرض می‌کند مسیر ابزار \f[V]userdump.exe\f[R] در متغیر محیطی \f[V]PATH\f[R] مشخص شده است: .RS 2 .RS .PP \f[V]-XX:OnError=\[dq]userdump.exe %p\[dq]\f[R] .RE .RE .RE .TP \f[V]-XX:OnOutOfMemoryError=\f[R]\f[I]string\f[R] یک دستور سفارشی یا مجموعه‌ای از دستورهای جداشده با نقطه‌ویرگول را برای اجرا در زمانی که استثنای \f[V]OutOfMemoryError\f[R] برای نخستین بار پرتاب می‌شود، تنظیم می‌کند. اگر رشته حاوی فاصله باشد، باید درون علامت نقل‌قول قرار گیرد. برای مشاهده مثالی از رشته دستور، به توضیحات گزینه \f[V]-XX:OnError\f[R] مراجعه کنید. .TP \f[V]-XX:+PrintCommandLineFlags\f[R] چاپ پرچم‌های ارگونومیک انتخاب‌شده JVM را که در خط فرمان ظاهر شده‌اند، فعال می‌کند. دانستن مقادیر ارگونومیک تعیین‌شده توسط JVM، مانند اندازه فضای هیپ و جمع‌آوری‌کننده زباله انتخاب‌شده، می‌تواند مفید باشد. به‌طور پیش‌فرض، این گزینه غیرفعال است و پرچم‌ها چاپ نمی‌شوند. .TP \f[V]-XX:+PreserveFramePointer\f[R] بین استفاده از ثبات RBP به عنوان یک ثبات عمومی (\f[V]-XX:-PreserveFramePointer\f[R]) و استفاده از ثبات RBP برای نگه‌داشتن frame pointer متدی که هم‌اکنون در حال اجراست (\f[V]-XX:+PreserveFramePointer\f[R] انتخاب می‌کند. اگر frame pointer در دسترس باشد، ابزارهای نمایه‌سازی (profiling) خارجی (برای نمونه، Linux perf) می‌توانند ردپای پشته (stack trace) دقیق‌تری بسازند. .TP \f[V]-XX:+PrintNMTStatistics\f[R] چاپ داده‌های جمع‌آوری‌شده ردیابی حافظه بومی هنگام خروج JVM را در زمانی که ردیابی حافظه بومی فعال است (نگاه کنید به \f[V]-XX:NativeMemoryTracking\f[R])، فعال می‌کند. به‌طور پیش‌فرض، این گزینه غیرفعال است و داده‌های ردیابی حافظه بومی چاپ نمی‌شوند. .TP \f[V]-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 \f[V]-XX:SharedArchiveConfigFile=\f[R]\f[I]shared_config_file\f[R] داده‌های اشتراکی اضافی افزوده‌شده به فایل آرشیو را مشخص می‌کند..TP \f[V]-XX:SharedClassListFile=\f[R]\f[I]file_name\f[R] فایل متنی حاوی نام کلاس‌هایی را مشخص می‌کند که باید در آرشیو اشتراک‌گذاری داده‌های کلاس (CDS) ذخیره شوند. این فایل شامل نام کامل یک کلاس در هر سطر است، با این تفاوت که اسلش‌ها (\f[V]/\f[R]) جایگزین نقطه‌ها (\f[V].\f[R]) می‌شوند. به عنوان مثال، برای مشخص کردن کلاس‌های \f[V]java.lang.Object\f[R] و \f[V]hello.Main\f[R]، یک فایل متنی حاوی دو سطر زیر ایجاد کنید: .RS .IP .nf \f[CB] java/lang/Object hello/Main \f[R] .fi .PP کلاس‌هایی که در این فایل متنی مشخص می‌کنید باید شامل کلاس‌هایی باشند که معمولاً توسط برنامه استفاده می‌شوند. آن‌ها می‌توانند شامل هر کلاسی از مسیرهای کلاس (class paths) برنامه، افزونه (extension) یا راه‌انداز (bootstrap) باشند. .PP بخش \f[B]Application Class Data Sharing\f[R] را ببینید. .RE .TP \f[V]-XX:+ShowCodeDetailsInExceptionMessages\f[R] چاپ پیام‌های بهبودیافته \f[V]NullPointerException\f[R] را فعال می‌کند. هنگامی که یک برنامه یک \f[V]NullPointerException\f[R] صادر می‌کند، این گزینه JVM را قادر می‌سازد تا دستورالعمل‌های بایت‌کد (bytecode) برنامه را تجزیه و تحلیل کرده و دقیقاً مشخص کند کدام مرجع \f[V]null\f[R] است، و منبع را با یک پیام جزئیات مقدار تهی (null-detail message) توصیف کند. پیام جزئیات مقدار تهی توسط \f[V]NullPointerException.getMessage()\f[R] محاسبه و بازگردانده می‌شود، و به همراه متد، نام فایل و شماره خط به عنوان پیام استثنا چاپ خواهد شد. به‌طور پیش‌فرض، این گزینه فعال است. .TP \f[V]-XX:+ShowMessageBoxOnError\f[R] نمایش یک کادر محاوره‌ای را در هنگام مواجهه JVM با یک خطای غیرقابل‌جبران فعال می‌کند. این کار مانع از خروج JVM شده و فرآیند را فعال نگه می‌دارد تا بتوانید یک دیباگر را برای بررسی علت خطا به آن متصل کنید. به‌طور پیش‌فرض، این گزینه غیرفعال است. .TP \f[V]-XX:StartFlightRecording=\f[R]\f[I]parameter\f[R]\f[V]=\f[R]\f[I]value\f[R] یک ضبط JFR را برای برنامه Java آغاز می‌کند. این گزینه معادل دستور تشخیصی \f[V]JFR.start\f[R] است که ضبط را در زمان اجرا آغاز می‌کند. هنگام آغاز یک ضبط JFR می‌توانید مدخل‌های \f[I]parameter\f[R]\f[V]=\f[R]\f[I]value\f[R] زیر را تنظیم کنید: .RS .TP \f[V]delay=\f[R]\f[I]time\f[R] میزان تاخیر بین زمان راه‌اندازی برنامه Java و آغاز ضبط را مشخص می‌کند. پسوند \f[V]s\f[R] را برای مشخص کردن زمان به ثانیه، \f[V]m\f[R] برای دقیقه، \f[V]h\f[R] برای ساعت، یا \f[V]d\f[R] برای روز اضافه کنید (برای مثال، مشخص کردن \f[V]10m\f[R] به معنای ۱۰ دقیقه است). به‌طور پیش‌فرض، هیچ تاخیری وجود ندارد و این پارامتر روی 0 تنظیم شده است. .TP \f[V]disk=\f[R]{\f[V]true\f[R]|\f[V]false\f[R]} مشخص می‌کند که آیا داده‌ها هنگام ضبط روی دیسک نوشته شوند یا خیر. به‌طور پیش‌فرض، این پارامتر فعال است. .TP \f[V]dumponexit=\f[R]{\f[V]true\f[R]|\f[V]false\f[R]} مشخص می‌کند که آیا ضبط در حال اجرا هنگام خاموش شدن JVM تخلیه (dump) شود یا خیر. اگر فعال باشد و \f[V]filename\f[R] وارد نشده باشد، فایل ضبط در دایرکتوری محل اجرای فرآیند ذخیره می‌شود. نام فایل یک نام تولیدشده توسط سیستم است که حاوی شناسه فرآیند (PID)، شناسه ضبط و برچسب زمانی فعلی است، شبیه به \f[V]hotspot-pid-47496-id-1-2018_01_25_19_10_41.jfr\f[R]. به‌طور پیش‌فرض، این پارامتر غیرفعال است. .TP \f[V]duration=\f[R]\f[I]time\f[R] مدت زمان ضبط را مشخص می‌کند. پسوند \f[V]s\f[R] را برای مشخص کردن زمان به ثانیه، \f[V]m\f[R] برای دقیقه، \f[V]h\f[R] برای ساعت، یا \f[V]d\f[R] برای روز اضافه کنید (برای مثال، مشخص کردن \f[V]5h\f[R] به معنای ۵ ساعت است). به‌طور پیش‌فرض، مدت زمان محدود نیست و این پارامتر روی 0 تنظیم شده است. .TP \f[V]filename=\f[R]\f[I]path\f[R] مسیر و نام فایلی را مشخص می‌کند که با متوقف شدن ضبط، اطلاعات در آن نوشته می‌شود، برای مثال: .RS .IP \[bu] 2 \f[V]recording.jfr\f[R] .IP \[bu] 2 \f[V]/home/user/recordings/recording.jfr\f[R] .IP \[bu] 2 \f[V]c:\[rs]recordings\[rs]recording.jfr\f[R] .PP اگر %p و/یا %t در نام فایل مشخص شده باشد، به ترتیب به PID مربوط به JVM و برچسب زمانی فعلی بسط می‌یابد. .RE .TP \f[V]name=\f[R]\f[I]identifier\f[R] هم نام و هم شناسه یک ضبط را مشخص می‌کند. .TP \f[V]maxage=\f[R]\f[I]time\f[R] حداکثر طول عمر داده‌های دیسک را برای نگهداری در ضبط مشخص می‌کند. این پارامتر فقط زمانی معتبر است که پارامتر \f[V]disk\f[R] روی \f[V]true\f[R] تنظیم شده باشد. پسوند \f[V]s\f[R] را برای مشخص کردن زمان به ثانیه، \f[V]m\f[R] برای دقیقه، \f[V]h\f[R] برای ساعت، یا \f[V]d\f[R] برای روز اضافه کنید (برای مثال، مشخص کردن \f[V]30s\f[R] به معنای ۳۰ ثانیه است). به‌طور پیش‌فرض، حداکثر طول عمر محدود نیست و این پارامتر روی \f[V]0s\f[R] تنظیم شده است. .TP \f[V]maxsize=\f[R]\f[I]size\f[R] حداکثر اندازه (به بایت) داده‌های دیسک را برای نگهداری در ضبط مشخص می‌کند. این پارامتر فقط زمانی معتبر است که پارامتر \f[V]disk\f[R] روی \f[V]true\f[R] تنظیم شده باشد. مقدار نباید کمتر از مقدار پارامتر \f[V]maxchunksize\f[R] باشد که با \f[V]-XX:FlightRecorderOptions\f[R] تنظیم شده است. پسوند \f[V]m\f[R] یا \f[V]M\f[R] را برای مشخص کردن اندازه به مگابایت، یا \f[V]g\f[R] یا \f[V]G\f[R] را برای مشخص کردن اندازه به گیگابایت اضافه کنید. به‌طور پیش‌فرض، حداکثر اندازه داده‌های دیسک محدود نیست و این پارامتر روی \f[V]0\f[R] تنظیم شده است. .TP \f[V]path-to-gc-roots=\f[R]{\f[V]true\f[R]|\f[V]false\f[R]} مشخص می‌کند که آیا مسیر به ریشه‌های جمع‌آوری زباله (GC roots) در انتهای ضبط جمع‌آوری شود یا خیر. به‌طور پیش‌فرض، این پارامتر غیرفعال است. .RS .PP مسیر به GC roots برای یافتن نشت‌های حافظه مفید است، اما جمع‌آوری آن زمان‌بر است. این گزینه را فقط زمانی فعال کنید که ضبط را برای برنامه‌ای آغاز می‌کنید که مشکوک به نشت حافظه است. اگر پارامتر \f[V]settings\f[R] روی \f[V]profile\f[R] تنظیم شده باشد، رد پشته (stack trace) از مکانی که شیء دارای نشت بالقوه در آن تخصیص یافته بود در اطلاعات جمع‌آوری‌شده گنجانده می‌شود. .RE .TP \f[V]settings=\f[R]\f[I]path\f[R] مسیر و نام فایل تنظیمات رویداد (از نوع JFC) را مشخص می‌کند. به‌طور پیش‌فرض، از فایل \f[V]default.jfc\f[R] واقع در \f[V]JAVA_HOME/lib/jfr\f[R] استفاده می‌شود. این فایل تنظیمات پیش‌فرض، مجموعه‌ای از پیش‌تعریف‌شده از اطلاعات را با بار اضافی (overhead) کم جمع‌آوری می‌کند، بنابراین کمترین تأثیر را بر عملکرد دارد و می‌تواند برای ضبط‌هایی که به‌طور مداوم اجرا می‌شوند استفاده شود. .RS .PP یک فایل تنظیمات دوم نیز با نام profile.jfc ارائه شده است که داده‌های بیشتری نسبت به پیکربندی پیش‌فرض فراهم می‌کند، اما ممکن است بار اضافی بیشتری داشته و بر عملکرد اثر بگذارد. از این پیکربندی برای دوره‌های زمانی کوتاه در هنگام نیاز به اطلاعات بیشتر استفاده کنید. .RE .PP می‌توانید با جدا کردن مقادیر چند پارامتر توسط ویرگول، آن‌ها را مشخص کنید. تنظیمات رویداد و گزینه‌های .jfc را می‌توان با استفاده از نحو زیر مشخص کرد: .TP \f[V]option=\f[R]\f[I]value\f[R] مقدار گزینه‌ای را که باید تغییر کند مشخص می‌کند. برای فهرست کردن گزینه‌های موجود، از ابزار \f[V]JAVA_HOME\f[R]/bin/jfr استفاده کنید. .TP \f[V]event-setting=\f[R]\f[I]value\f[R] مقدار تنظیم رویدادی را که باید تغییر کند مشخص می‌کند. از قالب روبرو استفاده کنید: \f[V]#=\f[R]. برای افزودن یک تنظیم رویداد جدید، نام رویداد را با \[aq]+\[aq] پیشوندگذاری کنید. .PP می‌توانید با جدا کردن مقادیر تنظیمات رویداد متعدد و گزینه‌های .jfc با ویرگول، آن‌ها را مشخص کنید. در صورت بروز تعارض بین یک پارامتر و یک گزینه .jfc، پارامتر اولویت خواهد داشت. فاصله خالی (whitespace) جداکننده را می‌توان برای مقادیر بازه زمانی حذف کرد، مانند 20ms. برای اطلاعات بیشتر درباره نحو تنظیمات، مستندات Javadoc مربوط به بسته jdk.jfr را ببینید. .RE .TP \f[V]-XX:ThreadStackSize=\f[R]\f[I]size\f[R] اندازه پشته ریسه (thread stack size) در Java را (به کیلوبایت) تنظیم می‌کند. استفاده از یک پسوند مقیاس‌بندی، مانند \f[V]k\f[R]، منجر به مقیاس‌بندی مقدار کیلوبایت می‌شود، به‌طوری که \f[V]-XX:ThreadStackSize=1k\f[R] اندازه پشته ریسه Java را روی 1024*1024 بایت یا ۱ مگابایت تنظیم می‌کند. مقدار پیش‌فرض به بستر بستگی دارد. به عنوان مثال: .RS .IP \[bu] 2 Linux/x64: 1024 KB .IP \[bu] 2 Linux/Aarch64: 2048 KB .IP \[bu] 2 macOS/x64: 1024 KB .IP \[bu] 2 macOS/Aarch64: 2048 KB .IP \[bu] 2 Windows: مقدار پیش‌فرض به حافظه مجازی بستگی دارد .PP مثال‌های زیر نحوه تنظیم اندازه پشته ریسه به ۱ مگابایت را در واحدهای مختلف نشان می‌دهند: .IP .nf \f[CB] -XX:ThreadStackSize=1k -XX:ThreadStackSize=1024 \f[R] .fi.PP این گزینه مشابه \f[V]-Xss\f[R] است. .RE .TP \f[V]-XX:-UseCompressedOops\f[R] استفاده از اشاره‌گرهای فشرده (compressed pointers) را غیرفعال می‌کند. به‌طور پیش‌فرض، این گزینه فعال است و از اشاره‌گرهای فشرده استفاده می‌شود. این امر به‌طور خودکار حداکثر اندازه حافظه heap جاوا را که به‌صورت ارگونومیک تعیین شده، به حداکثر مقدار حافظه‌ای که می‌تواند توسط اشاره‌گرهای فشرده پوشش داده شود محدود می‌کند. به‌طور پیش‌فرض این محدوده ۳۲ گیگابایت است. .RS .PP با فعال بودن oops فشرده، ارجاعات به اشیاء به‌جای اشاره‌گرهای ۶۴ بیتی، به‌صورت آفست‌های ۳۲ بیتی نمایش داده می‌شوند که معمولاً هنگام اجرای برنامه با اندازه‌های heap جاوا کوچکتر از محدوده اشاره‌گر oops فشرده، کارایی را افزایش می‌دهد. این گزینه فقط برای JVMهای ۶۴ بیتی کار می‌کند. .PP استفاده از اشاره‌گرهای فشرده با اندازه‌های heap جاوا بزرگ‌تر از ۳۲ گیگابایت نیز امکان‌پذیر است. گزینه \f[V]-XX:ObjectAlignmentInBytes\f[R] را ببینید. .RE .TP \f[V]-XX:-UseContainerSupport\f[R] \f[B]فقط لینوکس:\f[R] اکنون VM پشتیبانی از تشخیص خودکار کانتینر را فراهم می‌کند که به VM اجازه می‌دهد مقدار حافظه و تعداد پردازنده‌های در دسترس یک فرایند جاوا را که در کانتینرهای docker اجرا می‌شود، تعیین کند. از این اطلاعات برای تخصیص منابع سیستم استفاده می‌شود. مقدار پیش‌فرض برای این پرچم \f[V]true\f[R] است و پشتیبانی از کانتینر به‌طور پیش‌فرض فعال است. می‌توان آن را با \f[V]-XX:-UseContainerSupport\f[R] غیرفعال کرد. .RS .PP قابلیت Unified Logging برای کمک به عیب‌یابی مسائل مربوط به این پشتیبانی در دسترس است. .PP برای ثبت حداکثری گزارش‌های مربوط به اطلاعات کانتینر از \f[V]-Xlog:os+container=trace\f[R] استفاده کنید. برای توضیحات مربوط به نحوه استفاده از Unified Logging، بخش \f[B]Enable Logging with the JVM Unified Logging Framework\f[R] را ببینید. .RE .TP \f[V]-XX:+UseHugeTLBFS\f[R] \f[B]فقط لینوکس:\f[R] این گزینه معادل مشخص کردن \f[V]-XX:+UseLargePages\f[R] است. این گزینه به‌طور پیش‌فرض غیرفعال است. این گزینه تمام صفحه‌های بزرگ (large pages) را از پیش و در زمان رزرو حافظه تخصیص می‌دهد؛ در نتیجه JVM نمی‌تواند نواحی حافظه صفحه‌های بزرگ را به‌طور پویا بزرگ یا کوچک کند؛ اگر خواهان چنین رفتاری هستید، \f[V]-XX:UseTransparentHugePages\f[R] را ببینید. .RS .PP بخش \f[B]Large Pages\f[R] را ببینید. .RE .TP \f[V]-XX:+UseLargePages\f[R] استفاده از حافظه صفحه بزرگ (large page memory) را فعال می‌کند. به‌طور پیش‌فرض، این گزینه غیرفعال است و از حافظه صفحه بزرگ استفاده نمی‌شود. .RS .PP بخش \f[B]Large Pages\f[R] را ببینید. .RE .TP \f[V]-XX:+UseTransparentHugePages\f[R] \f[B]فقط لینوکس:\f[R] استفاده از صفحه‌های بزرگی را که می‌توانند به‌طور پویا بزرگ یا کوچک شوند فعال می‌کند. این گزینه به‌طور پیش‌فرض غیرفعال است. ممکن است با صفحه‌های بزرگ شفاف (transparent huge pages) با افت کارایی مواجه شوید، زیرا سیستم‌عامل برای ایجاد صفحه‌های بزرگ، صفحه‌های دیگر را جابه‌جا می‌کند؛ این گزینه برای آزمایش و ارزیابی در دسترس قرار گرفته است. .TP \f[V]-XX:+AllowUserSignalHandlers\f[R] \f[B]سیستم‌های غیر ویندوز:\f[R] نصب گرداننده‌های سیگنال (signal handlers) توسط برنامه را فعال می‌کند. به‌طور پیش‌فرض، این گزینه غیرفعال است و برنامه اجازه نصب گرداننده‌های سیگنال را ندارد. .TP \f[V]-XX:VMOptionsFile=\f[R]\f[I]filename\f[R] به کاربر اجازه می‌دهد گزینه‌های VM را در یک فایل مشخص کند؛ برای مثال: \f[V]java -XX:VMOptionsFile=/var/my_vm_options HelloWorld\f[R]. .TP \f[V]-XX:UseBranchProtection=\f[R]\f[I]mode\f[R] \f[B]فقط لینوکس AArch64:\f[R] حالت حفاظت از انشعاب (branch protection) را مشخص می‌کند. تمام گزینه‌ها به جز \f[V]none\f[R] نیازمند این هستند که VM با قابلیت حفاظت از انشعاب فعال ساخته شده باشد. علاوه بر این، برای حفاظت کامل، هرگونه کتابخانه محلی (native) ارائه‌شده توسط برنامه‌ها باید با همان سطح حفاظت کامپایل شده باشد. .RS .PP آرگومان‌های ممکن \f[I]mode\f[R] برای این گزینه شامل موارد زیر است: .TP \f[V]none\f[R] از حفاظت از انشعاب استفاده نکن. این مقدار پیش‌فرض است. .TP \f[V]standard\f[R] تمام حالت‌های حفاظت از انشعاب موجود در پلتفرم فعلی را فعال می‌کند. .TP \f[V]pac-ret\f[R] حفاظت در برابر حملات مبتنی بر ROP را فعال می‌کند. (فقط AArch64 8.3+) .RE .SH "گزینه‌های پیشرفته کامپایلر JIT برای جاوا (ADVANCED JIT COMPILER OPTIONS FOR JAVA)" .PP این گزینه‌های \f[V]java\f[R]، کامپایل پویای درجا (JIT) انجام‌شده توسط Java HotSpot VM را کنترل می‌کنند. .TP \f[V]-XX:AllocateInstancePrefetchLines=\f[R]\f[I]lines\f[R] تعداد خطوطی را که باید جلوتر از اشاره‌گر تخصیص نمونه پیش‌واکشی (prefetch) شوند تنظیم می‌کند. به‌طور پیش‌فرض، تعداد خطوط پیش‌واکشی روی ۱ تنظیم شده است: .RS .RS .PP \f[V]-XX:AllocateInstancePrefetchLines=1\f[R] .RE .RE .TP \f[V]-XX:AllocatePrefetchDistance=\f[R]\f[I]size\f[R] اندازه (به بایت) فاصله پیش‌واکشی را برای تخصیص شیء تنظیم می‌کند. حافظه‌ای که قرار است با مقادیر اشیاء جدید پر شود، از آدرس آخرین شیء تخصیص‌یافته تا این فاصله پیش‌واکشی می‌شود. هر ریسه (thread) جاوا نقطه تخصیص مخصوص به خود را دارد. .RS .PP مقادیر منفی نشان‌دهنده آن است که فاصله پیش‌واکشی بر اساس پلتفرم انتخاب می‌شود. مقادیر مثبت تعداد بایت‌ها برای پیش‌واکشی هستند. برای مشخص کردن کیلوبایت حرف \f[V]k\f[R] یا \f[V]K\f[R]، برای مگابایت حرف \f[V]m\f[R] یا \f[V]M\f[R]، و برای گیگابایت حرف \f[V]g\f[R] یا \f[V]G\f[R] را به انتهای مقدار اضافه کنید. مقدار پیش‌فرض روی \-1 تنظیم شده است. .PP مثال زیر نحوه تنظیم فاصله پیش‌واکشی روی ۱۰۲۴ بایت را نشان می‌دهد: .RS .PP \f[V]-XX:AllocatePrefetchDistance=1024\f[R] .RE .RE .TP \f[V]-XX:AllocatePrefetchInstr=\f[R]\f[I]instruction\f[R] دستورالعمل پیش‌واکشی را برای پیش‌واکشی جلوتر از اشاره‌گر تخصیص مشخص می‌کند. مقادیر ممکن از ۰ تا ۳ هستند. دستورالعمل‌های واقعی متناظر با این مقادیر به پلتفرم بستگی دارد. به‌طور پیش‌فرض، دستورالعمل پیش‌واکشی روی ۰ تنظیم شده است: .RS .RS .PP \f[V]-XX:AllocatePrefetchInstr=0\f[R] .RE .RE .TP \f[V]-XX:AllocatePrefetchLines=\f[R]\f[I]lines\f[R] تعداد خطوط حافظه نهان (cache lines) را که باید پس از آخرین تخصیص شیء با استفاده از دستورالعمل‌های پیش‌واکشی تولیدشده در کد کامپایل‌شده بارگذاری شوند، تعیین می‌کند. اگر آخرین شیء تخصیص‌یافته یک نمونه (instance) باشد، مقدار پیش‌فرض ۱ است و اگر یک آرایه باشد، این مقدار ۳ خواهد بود. .RS .PP مثال زیر نحوه تنظیم تعداد خطوط حافظه نهان بارگذاری‌شده روی ۵ را نشان می‌دهد: .RS .PP \f[V]-XX:AllocatePrefetchLines=5\f[R] .RE .RE .TP \f[V]-XX:AllocatePrefetchStepSize=\f[R]\f[I]size\f[R] اندازه گام (به بایت) را برای دستورالعمل‌های پیش‌واکشی ترتیبی تعیین می‌کند. برای مشخص کردن کیلوبایت حرف \f[V]k\f[R] یا \f[V]K\f[R]، برای مگابایت حرف \f[V]m\f[R] یا \f[V]M\f[R]، و برای گیگابایت حرف \f[V]g\f[R] یا \f[V]G\f[R] را به انتهای مقدار اضافه کنید. به‌طور پیش‌فرض، اندازه گام روی ۱۶ بایت تنظیم شده است: .RS .RS .PP \f[V]-XX:AllocatePrefetchStepSize=16\f[R] .RE .RE .TP \f[V]-XX:AllocatePrefetchStyle=\f[R]\f[I]style\f[R] سبک کد تولیدشده را برای دستورالعمل‌های پیش‌واکشی تنظیم می‌کند. آرگومان \f[I]style\f[R] یک عدد صحیح از ۰ تا ۳ است: .RS .TP \f[V]0\f[R] دستورالعمل‌های پیش‌واکشی تولید نشود. .TP \f[V]1\f[R] دستورالعمل‌های پیش‌واکشی پس از هر تخصیص اجرا شود. این تنظیم پیش‌فرض است. .TP \f[V]2\f[R] از اشاره‌گر واترمارک بلوک تخصیص محلی ریسه (TLAB) برای تعیین زمان اجرای دستورالعمل‌های پیش‌واکشی استفاده شود..TP \f[V]3\f[R] به‌ازای هر خط حافظهٔ پنهان (cache line) یک دستور prefetch تولید می‌کند. .RE .TP \f[V]-XX:+BackgroundCompilation\f[R] کامپایل در پس‌زمینه را فعال می‌کند. این گزینه به‌طور پیش‌فرض فعال است. برای غیرفعال کردن کامپایل در پس‌زمینه، \f[V]-XX:-BackgroundCompilation\f[R] را مشخص کنید (این کار معادل مشخص کردن \f[V]-Xbatch\f[R] است). .TP \f[V]-XX:CICompilerCount=\f[R]\f[I]threads\f[R] تعداد نخ‌های کامپایلر مورد استفاده برای کامپایل را تعیین می‌کند. به‌طور پیش‌فرض، تعداد نخ‌های کامپایلر به‌صورت خودکار بر اساس تعداد پردازنده‌ها و حافظهٔ در دسترس برای کد کامپایل‌شده انتخاب می‌شود. مثال زیر نحوهٔ تنظیم تعداد نخ‌ها روی ۲ را نشان می‌دهد: .RS .RS .PP \f[V]-XX:CICompilerCount=2\f[R] .RE .RE .TP \f[V]-XX:+UseDynamicNumberOfCompilerThreads\f[R] نخ‌های کامپایلر را به‌طور پویا تا سقف مشخص‌شده توسط \f[V]-XX:CICompilerCount\f[R] ایجاد می‌کند. این گزینه به‌طور پیش‌فرض فعال است. .TP \f[V]-XX:CompileCommand=\f[R]\f[I]command\f[R]\f[V],\f[R]\f[I]method\f[R][\f[V],\f[R]\f[I]option\f[R]] یک \f[I]command\f[R] (دستور) را برای اجرا روی یک \f[I]method\f[R] (متد) مشخص می‌کند. برای مثال، جهت مستثنی کردن متد \f[V]indexOf()\f[R] از کلاس \f[V]String\f[R] از کامپایل شدن، از دستور زیر استفاده کنید: .RS .RS .PP \f[V]-XX:CompileCommand=exclude,java/lang/String.indexOf\f[R] .RE .PP توجه داشته باشید که نام کامل کلاس، شامل تمامی بسته‌ها و زیربسته‌هایی که با یک ممیز (\f[V]/\f[R]) جدا شده‌اند، مشخص می‌شود. برای سهولت در عملیات کپی و جای‌گذاری، استفاده از قالب نام متد تولیدشده توسط گزینه‌های \f[V]-XX:+PrintCompilation\f[R] و \f[V]-XX:+LogCompilation\f[R] نیز امکان‌پذیر است: .RS .PP \f[V]-XX:CompileCommand=exclude,java.lang.String::indexOf\f[R] .RE .PP اگر متد بدون امضا مشخص شود، دستور روی تمامی متدهای دارای نام مشخص‌شده اعمال می‌گردد. با این حال، می‌توانید امضای متد را نیز در قالب فایل کلاس مشخص کنید. در این حالت، باید آرگومان‌ها را درون علامت‌های نقل‌قول قرار دهید، چرا که در غیر این صورت شل با علامت نقطه-ویرگول به‌عنوان پایان دستور برخورد می‌کند. برای مثال، اگر می‌خواهید تنها متد \f[V]indexOf(String)\f[R] از کلاس \f[V]String\f[R] را از کامپایل شدن مستثنی کنید، از دستور زیر استفاده نمایید: .RS .PP \f[V]-XX:CompileCommand=\[dq]exclude,java/lang/String.indexOf,(Ljava/lang/String;)I\[dq]\f[R] .RE .PP همچنین می‌توانید از ستاره (*) به‌عنوان نویسهٔ عام برای نام‌های کلاس و متد استفاده کنید. برای مثال، برای مستثنی کردن تمامی متدهای \f[V]indexOf()\f[R] در همهٔ کلاس‌ها از کامپایل شدن، از دستور زیر استفاده کنید: .RS .PP \f[V]-XX:CompileCommand=exclude,*.indexOf\f[R] .RE .PP ویرگول‌ها و نقطه‌ها نام‌های مستعاری برای فاصله‌ها هستند که ارسال دستورهای کامپایلر را از طریق شل آسان‌تر می‌کنند. می‌توانید آرگومان‌ها را با استفاده از فاصله به‌عنوان جداکننده و با قرار دادن آرگومان درون علامت نقل‌قول، به \f[V]-XX:CompileCommand\f[R] ارسال کنید: .RS .PP \f[V]-XX:CompileCommand=\[dq]exclude java/lang/String indexOf\[dq]\f[R] .RE .PP توجه داشته باشید که کامپایلر JIT پس از تجزیهٔ دستورهای ارائه‌شده در خط فرمان از طریق گزینه‌های \f[V]-XX:CompileCommand\f[R]، دستورها را از فایل \f[V].hotspot_compiler\f[R] می‌خواند. می‌توانید دستورهایی را به این فایل اضافه کنید یا با استفاده از گزینهٔ \f[V]-XX:CompileCommandFile\f[R] فایل متفاوتی را تعیین نمایید. .PP برای افزودن چندین دستور، یا گزینهٔ \f[V]-XX:CompileCommand\f[R] را چندین بار مشخص کنید، یا هر آرگومان را با جداکنندهٔ خط جدید (\f[V]\[rs]n\f[R]) جدا سازید. دستورهای زیر در دسترس هستند: .TP \f[V]break\f[R] هنگام اشکال‌زدایی JVM، یک نقطهٔ توقف (breakpoint) تنظیم می‌کند تا در ابتدای کامپایل متد مشخص‌شده متوقف شود. .TP \f[V]compileonly\f[R] همهٔ متدها به جز متد مشخص‌شده را از کامپایل شدن مستثنی می‌کند. به‌عنوان راهکاری جایگزین، می‌توانید از گزینهٔ \f[V]-XX:CompileOnly\f[R] استفاده کنید که به شما اجازه می‌دهد چندین متد را مشخص کنید. .TP \f[V]dontinline\f[R] از درون‌خطی کردن (inlining) متد مشخص‌شده جلوگیری می‌کند. .TP \f[V]exclude\f[R] متد مشخص‌شده را از کامپایل شدن مستثنی می‌کند. .TP \f[V]help\f[R] یک پیام راهنما برای گزینهٔ \f[V]-XX:CompileCommand\f[R] چاپ می‌کند. .TP \f[V]inline\f[R] تلاش می‌کند تا متد مشخص‌شده را درون‌خطی (inline) کند. .TP \f[V]log\f[R] ثبت گزارش کامپایل (با گزینهٔ \f[V]-XX:+LogCompilation\f[R]) را برای همهٔ متدها به جز متد مشخص‌شده مستثنی می‌کند. به‌طور پیش‌فرض، ثبت گزارش برای تمامی متدهای کامپایل‌شده انجام می‌شود. .TP \f[V]option\f[R] یک گزینهٔ کامپایل JIT را به جای آخرین آرگومان (\f[V]option\f[R]) به متد مشخص‌شده ارسال می‌کند. گزینهٔ کامپایل در پایان، پس از نام متد تنظیم می‌شود. برای مثال، جهت فعال‌سازی گزینهٔ \f[V]BlockLayoutByFrequency\f[R] برای متد \f[V]append()\f[R] از کلاس \f[V]StringBuffer\f[R]، از دستور زیر استفاده کنید: .RS .RS .PP \f[V]-XX:CompileCommand=option,java/lang/StringBuffer.append,BlockLayoutByFrequency\f[R] .RE .PP می‌توانید چندین گزینهٔ کامپایل را با جدا کردن توسط ویرگول یا فاصله مشخص کنید. .RE .TP \f[V]print\f[R] کد اسمبلی تولیدشده پس از کامپایل متد مشخص‌شده را چاپ می‌کند. .TP \f[V]quiet\f[R] دستور می‌دهد که دستورهای کامپایل چاپ نشوند. به‌طور پیش‌فرض، دستورهایی که با گزینهٔ \f[V]-XX:CompileCommand\f[R] مشخص می‌کنید چاپ می‌شوند؛ برای مثال، اگر متد \f[V]indexOf()\f[R] از کلاس \f[V]String\f[R] را از کامپایل شدن مستثنی کنید، عبارت زیر در خروجی استاندارد چاپ می‌شود: .RS .RS .PP \f[V]CompilerOracle: exclude java/lang/String.indexOf\f[R] .RE .PP می‌توانید با مشخص کردن گزینهٔ \f[V]-XX:CompileCommand=quiet\f[R] پیش از سایر گزینه‌های \f[V]-XX:CompileCommand\f[R] از این خروجی جلوگیری کنید. .RE .RE .TP \f[V]-XX:CompileCommandFile=\f[R]\f[I]filename\f[R] فایلی را که دستورهای کامپایلر JIT از آن خوانده می‌شوند تعیین می‌کند. به‌طور پیش‌فرض، فایل \f[V].hotspot_compiler\f[R] برای ذخیرهٔ دستورهای اجراشده توسط کامپایلر JIT استفاده می‌شود. .RS .PP هر خط در فایل دستور نشان‌دهندهٔ یک دستور، یک نام کلاس و نام متدی است که دستور برای آن استفاده می‌شود. برای مثال، این خط کد اسمبلی متد \f[V]toString()\f[R] از کلاس \f[V]String\f[R] را چاپ می‌کند: .RS .PP \f[V]print java/lang/String toString\f[R] .RE .PP اگر از دستورهایی استفاده می‌کنید که کامپایلر JIT باید روی متدها اعمال کند، گزینهٔ \f[V]-XX:CompileCommand\f[R] را ببینید. .RE .TP \f[V]-XX:CompilerDirectivesFile=\f[R]\f[I]file\f[R] هنگام شروع برنامه، دستورالعمل‌ها را از یک فایل به پشتهٔ دستورالعمل‌ها اضافه می‌کند. بخش \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[V]-XX:CompilerDirectivesFile\f[R] باید همراه با گزینهٔ \f[V]-XX:UnlockDiagnosticVMOptions\f[R] که گزینه‌های تشخیصی JVM را بازگشایی می‌کند، استفاده شود. .RE .TP \f[V]-XX:+CompilerDirectivesPrint\f[R] پشتهٔ دستورالعمل‌ها را هنگام شروع برنامه یا زمانی که دستورالعمل جدیدی اضافه می‌شود، چاپ می‌کند. .RS .PP گزینهٔ \f[V]-XX:+CompilerDirectivesPrint\f[R] باید همراه با گزینهٔ \f[V]-XX:UnlockDiagnosticVMOptions\f[R] که گزینه‌های تشخیصی JVM را بازگشایی می‌کند، استفاده شود. .RE .TP \f[V]-XX:CompileOnly=\f[R]\f[I]methods\f[R] فهرست متدهایی (جداشده با ویرگول) را که کامپایل باید به آن‌ها محدود شود تنظیم می‌کند. تنها متدهای مشخص‌شده کامپایل می‌شوند. هر متد را با نام کامل کلاس (شامل بسته‌ها و زیربسته‌ها) مشخص کنید. برای مثال، جهت کامپایل شدنِ تنها متد \f[V]length()\f[R] از کلاس \f[V]String\f[R] و متد \f[V]size()\f[R] از کلاس \f[V]List\f[R]، از دستور زیر استفاده کنید: .RS .RS.PP \f[V]-XX:CompileOnly=java/lang/String.length,java/util/List.size\f[R] .RE .PP توجه داشته باشید که نام کامل کلاس، شامل تمام بسته‌ها و زیربسته‌ها که با اسلش (\f[V]/\f[R]) جدا شده‌اند، مشخص می‌شود. برای تسهیل عملیات برش و چسباندن (cut and paste)، می‌توان از قالب نام متد تولیدشده توسط گزینه‌های \f[V]-XX:+PrintCompilation\f[R] و \f[V]-XX:+LogCompilation\f[R] نیز استفاده کرد: .RS .PP \f[V]-XX:CompileOnly=java.lang.String::length,java.util.List::size\f[R] .RE .PP اگرچه نویسه‌های عام (wildcard) پشتیبانی نمی‌شوند، می‌توانید تنها نام کلاس یا بسته را مشخص کنید تا تمام متدهای آن کلاس یا بسته کامپایل شوند، یا اینکه فقط متد را مشخص کنید تا متدهایی با این نام در هر کلاسی کامپایل شوند: .IP .nf \f[CB] -XX:CompileOnly=java/lang/String -XX:CompileOnly=java/lang -XX:CompileOnly=.length \f[R] .fi .RE .TP \f[V]-XX:CompileThresholdScaling=\f[R]\f[I]scale\f[R] کنترل یکپارچه‌ای بر اولین کامپایل فراهم می‌کند. این گزینه زمان اولین کامپایل متدها را هم برای حالت‌های عملکرد چندسطحی (tiered) و هم غیرچندسطحی (nontiered) کنترل می‌کند. گزینه \f[V]CompileThresholdScaling\f[R] مقداری از نوع ممیز شناور بین 0 و +Inf می‌پذیرد و آستانه‌های متناظر با حالت عملکرد فعلی (هم چندسطحی و هم غیرچندسطحی) را مقیاس‌بندی می‌کند. تنظیم \f[V]CompileThresholdScaling\f[R] روی مقداری کمتر از 1.0 منجر به کامپایل زودهنگام‌تر می‌شود، در حالی که مقادیر بزرگ‌تر از 1.0 کامپایل را به تعویق می‌اندازند. تنظیم \f[V]CompileThresholdScaling\f[R] روی 0 معادل غیرفعال کردن کامپایل است. .TP \f[V]-XX:+DoEscapeAnalysis\f[R] استفاده از تحلیل فرار (escape analysis) را فعال می‌کند. این گزینه به‌طور پیش‌فرض فعال است. برای غیرفعال کردن استفاده از تحلیل فرار، \f[V]-XX:-DoEscapeAnalysis\f[R] را مشخص کنید. .TP \f[V]-XX:InitialCodeCacheSize=\f[R]\f[I]size\f[R] اندازه اولیه حافظه پنهان کد (code cache) را (بر حسب بایت) تنظیم می‌کند. حرف \f[V]k\f[R] یا \f[V]K\f[R] را برای مشخص کردن کیلوبایت، \f[V]m\f[R] یا \f[V]M\f[R] را برای مگابایت، یا \f[V]g\f[R] یا \f[V]G\f[R] را برای گیگابایت اضافه کنید. مقدار پیش‌فرض به بستر (platform) بستگی دارد. اندازه اولیه حافظه پنهان کد نباید کمتر از کمینه اندازه صفحه حافظه سیستم باشد. مثال زیر نحوه تنظیم اندازه اولیه حافظه پنهان کد روی ۳۲ کیلوبایت را نشان می‌دهد: .RS .RS .PP \f[V]-XX:InitialCodeCacheSize=32k\f[R] .RE .RE .TP \f[V]-XX:+Inline\f[R] درون‌خطی‌سازی متد (method inlining) را فعال می‌کند. این گزینه به‌طور پیش‌فرض برای افزایش کارایی فعال است. برای غیرفعال کردن درون‌خطی‌سازی متد، \f[V]-XX:-Inline\f[R] را مشخص کنید. .TP \f[V]-XX:InlineSmallCode=\f[R]\f[I]size\f[R] حداکثر اندازه کد (بر حسب بایت) را برای متدهای از قبل کامپایل‌شده‌ای که ممکن است درون‌خطی شوند، تنظیم می‌کند. این پرچم فقط برای کامپایلر C2 اعمال می‌شود. حرف \f[V]k\f[R] یا \f[V]K\f[R] را برای مشخص کردن کیلوبایت، \f[V]m\f[R] یا \f[V]M\f[R] را برای مگابایت، یا \f[V]g\f[R] یا \f[V]G\f[R] را برای گیگابایت اضافه کنید. مقدار پیش‌فرض به بستر و فعال بودن کامپایل چندسطحی بستگی دارد. در مثال زیر این مقدار روی ۱۰۰۰ بایت تنظیم شده است: .RS .RS .PP \f[V]-XX:InlineSmallCode=1000\f[R] .RE .RE .TP \f[V]-XX:+LogCompilation\f[R] ثبت گزارش فعالیت‌های کامپایل را در فایلی به نام \f[V]hotspot.log\f[R] در دایرکتوری کاری جاری فعال می‌کند. می‌توانید با استفاده از گزینه \f[V]-XX:LogFile\f[R] مسیر و نام فایل گزارش متفاوتی را مشخص کنید. .RS .PP به‌طور پیش‌فرض، این گزینه غیرفعال است و فعالیت‌های کامپایل ثبت نمی‌شوند. گزینه \f[V]-XX:+LogCompilation\f[R] باید همراه با گزینه \f[V]-XX:UnlockDiagnosticVMOptions\f[R] که گزینه‌های تشخیصی JVM را باز می‌کند، استفاده شود. .PP می‌توانید با استفاده از گزینه \f[V]-XX:+PrintCompilation\f[R] خروجی تشخیصی مفصل (verbose) را فعال کنید که با هر بار کامپایل یک متد، پیامی را در کنسول چاپ می‌کند. .RE .TP \f[V]-XX:FreqInlineSize=\f[R]\f[I]size\f[R] حداکثر اندازه بایت‌کد (بر حسب بایت) یک متد داغ (hot method) را برای درون‌خطی‌سازی تنظیم می‌کند. این پرچم فقط برای کامپایلر C2 اعمال می‌شود. حرف \f[V]k\f[R] یا \f[V]K\f[R] را برای مشخص کردن کیلوبایت، \f[V]m\f[R] یا \f[V]M\f[R] را برای مگابایت، یا \f[V]g\f[R] یا \f[V]G\f[R] را برای گیگابایت اضافه کنید. مقدار پیش‌فرض به بستر بستگی دارد. در مثال زیر این مقدار روی ۳۲۵ بایت تنظیم شده است: .RS .RS .PP \f[V]-XX:FreqInlineSize=325\f[R] .RE .RE .TP \f[V]-XX:MaxInlineSize=\f[R]\f[I]size\f[R] حداکثر اندازه بایت‌کد (بر حسب بایت) یک متد سرد (cold method) را برای درون‌خطی‌سازی تنظیم می‌کند. این پرچم فقط برای کامپایلر C2 اعمال می‌شود. حرف \f[V]k\f[R] یا \f[V]K\f[R] را برای مشخص کردن کیلوبایت، \f[V]m\f[R] یا \f[V]M\f[R] را برای مگابایت، یا \f[V]g\f[R] یا \f[V]G\f[R] را برای گیگابایت اضافه کنید. به‌طور پیش‌فرض، حداکثر اندازه بایت‌کد روی ۳۵ بایت تنظیم شده است: .RS .RS .PP \f[V]-XX:MaxInlineSize=35\f[R] .RE .RE .TP \f[V]-XX:C1MaxInlineSize=\f[R]\f[I]size\f[R] حداکثر اندازه بایت‌کد (بر حسب بایت) یک متد سرد را برای درون‌خطی‌سازی تنظیم می‌کند. این پرچم فقط برای کامپایلر C1 اعمال می‌شود. حرف \f[V]k\f[R] یا \f[V]K\f[R] را برای مشخص کردن کیلوبایت، \f[V]m\f[R] یا \f[V]M\f[R] را برای مگابایت، یا \f[V]g\f[R] یا \f[V]G\f[R] را برای گیگابایت اضافه کنید. به‌طور پیش‌فرض، حداکثر اندازه بایت‌کد روی ۳۵ بایت تنظیم شده است: .RS .RS .PP \f[V]-XX:MaxInlineSize=35\f[R] .RE .RE .TP \f[V]-XX:MaxTrivialSize=\f[R]\f[I]size\f[R] حداکثر اندازه بایت‌کد (بر حسب بایت) یک متد جزئی (trivial method) را برای درون‌خطی‌سازی تنظیم می‌کند. این پرچم فقط برای کامپایلر C2 اعمال می‌شود. حرف \f[V]k\f[R] یا \f[V]K\f[R] را برای مشخص کردن کیلوبایت، \f[V]m\f[R] یا \f[V]M\f[R] را برای مگابایت، یا \f[V]g\f[R] یا \f[V]G\f[R] را برای گیگابایت اضافه کنید. به‌طور پیش‌فرض، حداکثر اندازه بایت‌کد یک متد جزئی روی ۶ بایت تنظیم شده است: .RS .RS .PP \f[V]-XX:MaxTrivialSize=6\f[R] .RE .RE .TP \f[V]-XX:C1MaxTrivialSize=\f[R]\f[I]size\f[R] حداکثر اندازه بایت‌کد (بر حسب بایت) یک متد جزئی را برای درون‌خطی‌سازی تنظیم می‌کند. این پرچم فقط برای کامپایلر C1 اعمال می‌شود. حرف \f[V]k\f[R] یا \f[V]K\f[R] را برای مشخص کردن کیلوبایت، \f[V]m\f[R] یا \f[V]M\f[R] را برای مگابایت، یا \f[V]g\f[R] یا \f[V]G\f[R] را برای گیگابایت اضافه کنید. به‌طور پیش‌فرض، حداکثر اندازه بایت‌کد یک متد جزئی روی ۶ بایت تنظیم شده است: .RS .RS .PP \f[V]-XX:MaxTrivialSize=6\f[R] .RE .RE .TP \f[V]-XX:MaxNodeLimit=\f[R]\f[I]nodes\f[R] حداکثر تعداد گره‌های مورد استفاده در طول کامپایل یک تک‌متد را تعیین می‌کند. به‌طور پیش‌فرض این مقدار به قابلیت‌های فعال‌شده بستگی دارد. در مثال زیر حداکثر تعداد گره‌ها روی ۱۰۰,۰۰۰ تنظیم شده است: .RS .RS .PP \f[V]-XX:MaxNodeLimit=100000\f[R] .RE .RE .TP \f[V]-XX:NonNMethodCodeHeapSize=\f[R]\f[I]size\f[R] اندازه بخش کد حاوی کدهای غیرمتد (nonmethod code) را به بایت تعیین می‌کند. .RS .PP یک بخش کد غیرمتد شامل کدهای غیرمتد، مانند بافرهای کامپایلر و مفسر بایت‌کد است. این نوع کد برای همیشه در حافظه پنهان کد باقی می‌ماند. این پرچم فقط در صورتی استفاده می‌شود که \f[V]-XX:SegmentedCodeCache\f[R] فعال باشد. .RE.TP \f[V]-XX:NonProfiledCodeHeapSize=\f[R]\f[I]size\f[R] اندازه بخش کد (code segment) حاوی متدهای پروفایل‌نشده (nonprofiled) را بر حسب بایت تعیین می‌کند. این پرچم تنها در صورتی استفاده می‌شود که \f[V]-XX:SegmentedCodeCache\f[R] فعال باشد. .TP \f[V]-XX:+OptimizeStringConcat\f[R] بهینه‌سازی عملیات الحاق (concatenation) رشته‌های \f[V]String\f[R] را فعال می‌کند. این گزینه به‌طور پیش‌فرض فعال است. برای غیرفعال کردن بهینه‌سازی عملیات الحاق رشته‌های \f[V]String\f[R]، مقدار \f[V]-XX:-OptimizeStringConcat\f[R] را مشخص کنید. .TP \f[V]-XX:+PrintAssembly\f[R] چاپ کد اسمبلی را برای متدهای بایت‌کد و محلی (native) با استفاده از کتابخانه خارجی \f[V]hsdis-.so\f[R] یا \f[V].dll\f[R] فعال می‌کند. برای ماشین مجازی ۶۴ بیتی در Windows، این کتابخانه \f[V]hsdis-amd64.dll\f[R] است. این قابلیت به شما امکان می‌دهد کدهای تولیدشده را مشاهده کنید، که می‌تواند به شناسایی مشکلات عملکردی کمک کند. .RS .PP به‌طور پیش‌فرض، این گزینه غیرفعال است و کد اسمبلی چاپ نمی‌شود. گزینه \f[V]-XX:+PrintAssembly\f[R] باید همراه با گزینه \f[V]-XX:UnlockDiagnosticVMOptions\f[R] که گزینه‌های تشخیصی JVM را باز می‌کند، استفاده شود. .RE .TP \f[V]-XX:ProfiledCodeHeapSize=\f[R]\f[I]size\f[R] اندازه بخش کد حاوی متدهای پروفایل‌شده (profiled) را بر حسب بایت تعیین می‌کند. این پرچم تنها در صورتی استفاده می‌شود که \f[V]-XX:SegmentedCodeCache\f[R] فعال باشد. .TP \f[V]-XX:+PrintCompilation\f[R] خروجی تشخیصی پرجزئیات (verbose) از JVM را با چاپ پیامی در کنسول به ازای هر بار کامپایل شدن یک متد فعال می‌کند. این ویژگی به شما امکان می‌دهد مشاهده کنید کدام متدها واقعاً کامپایل می‌شوند. به‌طور پیش‌فرض، این گزینه غیرفعال است و خروجی تشخیصی چاپ نمی‌شود. .RS .PP همچنین می‌توانید فعالیت‌های کامپایل را با استفاده از گزینه \f[V]-XX:+LogCompilation\f[R] در یک فایل ثبت (log) کنید. .RE .TP \f[V]-XX:+PrintInlining\f[R] چاپ تصمیمات مربوط به جای‌گذاری درون‌خطی (inlining) را فعال می‌کند. این ویژگی به شما امکان می‌دهد مشاهده کنید کدام متدها به‌صورت درون‌خطی قرار می‌گیرند. .RS .PP به‌طور پیش‌فرض، این گزینه غیرفعال است و اطلاعات درون‌خطی چاپ نمی‌شود. گزینه \f[V]-XX:+PrintInlining\f[R] باید همراه با گزینه \f[V]-XX:+UnlockDiagnosticVMOptions\f[R] که گزینه‌های تشخیصی JVM را باز می‌کند، استفاده شود. .RE .TP \f[V]-XX:ReservedCodeCacheSize=\f[R]\f[I]size\f[R] حداکثر اندازه حافظه موقت کد (code cache) را برای کدهای کامپایل‌شده توسط JIT (بر حسب بایت) تنظیم می‌کند. برای مشخص کردن کیلوبایت حرف \f[V]k\f[R] یا \f[V]K\f[R]، برای مگابایت \f[V]m\f[R] یا \f[V]M\f[R]، و برای گیگابایت \f[V]g\f[R] یا \f[V]G\f[R] را به انتهای مقدار اضافه کنید. حداکثر اندازه پیش‌فرض حافظه موقت کد ۲۴۰ مگابایت است؛ در صورتی که کامپایل چندلایه (tiered compilation) را با گزینه \f[V]-XX:-TieredCompilation\f[R] غیرفعال کنید، اندازه پیش‌فرض ۴۸ مگابایت خواهد بود. این گزینه حداکثر محدودیت ۲ گیگابایت دارد؛ در غیر این صورت، خطا ایجاد می‌شود. حداکثر اندازه حافظه موقت کد نباید از اندازه اولیه آن کمتر باشد؛ گزینه \f[V]-XX:InitialCodeCacheSize\f[R] را ببینید. .TP \f[V]-XX:RTMAbortRatio=\f[R]\f[I]abort_ratio\f[R] نسبت لغو (abort ratio) تراکنش‌های RTM را به‌صورت درصدی (%) از کل تراکنش‌های اجرایی RTM تعیین می‌کند. اگر تعداد تراکنش‌های لغوشده بیشتر از این نسبت شود، کد کامپایل‌شده وا‌بهینه‌سازی (deoptimized) می‌شود. این نسبت زمانی استفاده می‌شود که گزینه \f[V]-XX:+UseRTMDeopt\f[R] فعال باشد. مقدار پیش‌فرض این گزینه ۵۰ است. این بدان معناست که در صورت لغو ۵۰٪ از تمامی تراکنش‌ها، کد کامپایل‌شده وا‌بهینه‌سازی می‌شود. .TP \f[V]-XX:RTMRetryCount=\f[R]\f[I]number_of_retries\f[R] تعداد دفعاتی را مشخص می‌کند که کد قفل‌گذاری RTM هنگام لغوشدن یا مشغول‌بودن، پیش از بازگشت به سازوکار قفل‌گذاری عادی، دوباره تلاش می‌شود. مقدار پیش‌فرض این گزینه ۵ است. گزینه \f[V]-XX:UseRTMLocking\f[R] باید فعال باشد. .TP \f[V]-XX:+SegmentedCodeCache\f[R] بخش‌بندی حافظه موقت کد (code cache) را فعال می‌کند، که بدون آن، حافظه موقت کد از یک بخش بزرگ یکپارچه تشکیل می‌شود. با فعال بودن \f[V]-XX:+SegmentedCodeCache\f[R]، بخش‌های جداگانه‌ای برای کدهای غیرمتد (non-method)، متدهای پروفایل‌شده (profiled method) و متدهای پروفایل‌نشده (non-profiled method) استفاده خواهد شد. اندازه این بخش‌ها در زمان اجرا تغییر نمی‌کند. مزایای آن عبارتند از کنترل بهتر بر ردپای حافظه (memory footprint)، کاهش تکه‌تکه‌شدن کد (code fragmentation)، و بهبود عملکرد در iTLB پردازنده (instruction translation lookaside buffer) و حافظه نهان دستورالعمل به‌دلیل محلی‌سازی بهتر. .RS .PP این ویژگی در صورتی که کامپایل چندلایه فعال باشد (\f[V]-XX:+TieredCompilation\f[R] ) و اندازه رزرو شده حافظه موقت کد (\f[V]-XX:ReservedCodeCacheSize\f[R]) دست‌کم ۲۴۰ مگابایت باشد، به‌طور پیش‌فرض فعال است. .RE .TP \f[V]-XX:StartAggressiveSweepingAt=\f[R]\f[I]percent\f[R] پیمایش پشته متدهای فعال را مجبور می‌کند تا در زمانی که تنها درصد مشخص‌شده‌ای از حافظه موقت کد خالی است، کدهای بدون استفاده را به‌طور تهاجمی پاکسازی کند. مقدار پیش‌فرض ۱۰٪ است. .TP \f[V]-XX:-TieredCompilation\f[R] استفاده از کامپایل چندلایه (tiered compilation) را غیرفعال می‌کند. این گزینه به‌طور پیش‌فرض فعال است. .TP \f[V]-XX:UseSSE=\f[R]\f[I]version\f[R] استفاده از مجموعه دستورالعمل‌های SSE نسخه مشخص‌شده را فعال می‌کند. به‌طور پیش‌فرض روی بالاترین نسخه پشتیبانی‌شده موجود تنظیم می‌شود (تنها در x86). .TP \f[V]-XX:UseAVX=\f[R]\f[I]version\f[R] استفاده از مجموعه دستورالعمل‌های AVX نسخه مشخص‌شده را فعال می‌کند. به‌طور پیش‌فرض روی بالاترین نسخه پشتیبانی‌شده موجود تنظیم می‌شود (تنها در x86). .TP \f[V]-XX:+UseAES\f[R] توابع درونی (intrinsics) سخت‌افزاری AES را برای سخت‌افزارهایی که از آن پشتیبانی می‌کنند، فعال می‌کند. این گزینه در سخت‌افزارهایی که دستورالعمل‌های لازم را دارند، به‌طور پیش‌فرض فعال است. گزینه \f[V]-XX:+UseAES\f[R] همراه با \f[V]UseAESIntrinsics\f[R] استفاده می‌شود. پرچم‌هایی که توابع درونی را کنترل می‌کنند، اکنون نیازمند گزینه \f[V]-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .TP \f[V]-XX:+UseAESIntrinsics\f[R] توابع درونی AES را فعال می‌کند. مشخص کردن \f[V]-XX:+UseAESIntrinsics\f[R] معادل فعال کردن \f[V]-XX:+UseAES\f[R] نیز هست. برای غیرفعال کردن توابع درونی سخت‌افزاری AES، مقدار \f[V]-XX:-UseAES -XX:-UseAESIntrinsics\f[R] را مشخص کنید. برای نمونه، جهت فعال‌سازی AES سخت‌افزاری، از پرچم‌های زیر استفاده کنید: .RS .RS .PP \f[V]-XX:+UseAES -XX:+UseAESIntrinsics\f[R] .RE .PP پرچم‌هایی که توابع درونی را کنترل می‌کنند، اکنون نیازمند گزینه \f[V]-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .RE .TP \f[V]-XX:+UseAESCTRIntrinsics\f[R] مشابه \f[V]-XX:+UseAESIntrinsics\f[R]، توابع درونی AES/CTR را فعال می‌کند. .TP \f[V]-XX:+UseGHASHIntrinsics\f[R] استفاده از توابع درونی GHASH را کنترل می‌کند. به‌طور پیش‌فرض روی بسترهایی که از دستورالعمل‌های متناظر پشتیبانی می‌کنند فعال است. پرچم‌هایی که توابع درونی را کنترل می‌کنند، اکنون نیازمند گزینه \f[V]-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .TP \f[V]-XX:+UseChaCha20Intrinsics\f[R] توابع درونی ChaCha20 را فعال می‌کند. این گزینه به‌طور پیش‌فرض برای بسترهای پشتیبانی‌شده فعال است. برای غیرفعال کردن توابع درونی ChaCha20، مقدار \f[V]-XX:-UseChaCha20Intrinsics\f[R] را مشخص کنید. پرچم‌هایی که توابع درونی را کنترل می‌کنند، اکنون نیازمند گزینه \f[V]-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .TP \f[V]-XX:+UsePoly1305Intrinsics\f[R] توابع درونی Poly1305 را فعال می‌کند. این گزینه به‌طور پیش‌فرض برای بسترهای پشتیبانی‌شده فعال است. برای غیرفعال کردن توابع درونی Poly1305، مقدار \f[V]-XX:-UsePoly1305Intrinsics\f[R] را مشخص کنید. پرچم‌هایی که توابع درونی را کنترل می‌کنند، اکنون نیازمند گزینه \f[V]-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .TP \f[V]-XX:+UseBASE64Intrinsics\f[R] استفاده از روال‌های کدگذاری شتاب‌یافته BASE64 را برای \f[V]java.util.Base64\f[R] کنترل می‌کند. به‌طور پیش‌فرض روی بسترهایی که از آن پشتیبانی می‌کنند فعال است. پرچم‌هایی که توابع درونی را کنترل می‌کنند، اکنون نیازمند گزینه \f[V]-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .TP \f[V]-XX:+UseAdler32Intrinsics\f[R] استفاده از تابع درونی الگوریتم جمع‌آزمای (checksum) Adler32 را برای \f[V]java.util.zip.Adler32\f[R] کنترل می‌کند. به‌طور پیش‌فرض در بسترهایی که از آن پشتیبانی می‌کنند فعال است. پرچم‌هایی که توابع درونی را کنترل می‌کنند، اکنون نیازمند گزینه \f[V]-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .TP \f[V]-XX:+UseCRC32Intrinsics\f[R] استفاده از توابع درونی CRC32 را برای \f[V]java.util.zip.CRC32\f[R] کنترل می‌کند. به‌طور پیش‌فرض روی بسترهایی که از آن پشتیبانی می‌کنند فعال است. پرچم‌هایی که توابع درونی را کنترل می‌کنند، اکنون نیازمند گزینه \f[V]-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .TP \f[V]-XX:+UseCRC32CIntrinsics\f[R] استفاده از توابع درونی CRC32C را برای \f[V]java.util.zip.CRC32C\f[R] کنترل می‌کند. به‌طور پیش‌فرض روی بسترهایی که از آن پشتیبانی می‌کنند فعال است. پرچم‌هایی که توابع درونی را کنترل می‌کنند، اکنون نیازمند گزینه \f[V]-XX:+UnlockDiagnosticVMOptions\f[R] هستند. .TP \f[V]-XX:+UseSHA\f[R] توابع درونی سخت‌افزاری را برای توابع درهم‌سازی رمزنگاری SHA در برخی سخت‌افزارها فعال می‌کند. گزینه \f[V]UseSHA\f[R] همراه با گزینه‌های \f[V]UseSHA1Intrinsics\f[R]، \f[V]UseSHA256Intrinsics\f[R] و \f[V]UseSHA512Intrinsics\f[R] استفاده می‌شود. .RS.PP پرچم‌های \f[V]UseSHA\f[R] و \f[V]UseSHA*Intrinsics\f[R] به‌طور پیش‌فرض در سامانه‌هایی که از دستورالعمل‌های متناظر پشتیبانی می‌کنند فعال هستند. .PP این قابلیت تنها هنگام استفاده از ارائه‌دهندهٔ \f[V]sun.security.provider.Sun\f[R] برای عملیات‌های SHA قابل اعمال است. پرچم‌هایی که توابع ذاتی (intrinsics) را کنترل می‌کنند اکنون به گزینهٔ \f[V]-XX:+UnlockDiagnosticVMOptions\f[R] نیاز دارند. .PP برای غیرفعال‌سازی تمام توابع ذاتی سخت‌افزاری SHA، گزینهٔ \f[V]-XX:-UseSHA\f[R] را مشخص کنید. برای غیرفعال کردن تنها یک تابع ذاتی خاص SHA، از گزینهٔ متناظر مناسب استفاده کنید. برای مثال: \f[V]-XX:-UseSHA256Intrinsics\f[R]. .RE .TP \f[V]-XX:+UseSHA1Intrinsics\f[R] توابع ذاتی را برای تابع درهم‌ساز رمزنگاری SHA-1 فعال می‌کند. پرچم‌هایی که توابع ذاتی را کنترل می‌کنند اکنون به گزینهٔ \f[V]-XX:+UnlockDiagnosticVMOptions\f[R] نیاز دارند. .TP \f[V]-XX:+UseSHA256Intrinsics\f[R] توابع ذاتی را برای توابع درهم‌ساز رمزنگاری SHA-224 و SHA-256 فعال می‌کند. پرچم‌هایی که توابع ذاتی را کنترل می‌کنند اکنون به گزینهٔ \f[V]-XX:+UnlockDiagnosticVMOptions\f[R] نیاز دارند. .TP \f[V]-XX:+UseSHA512Intrinsics\f[R] توابع ذاتی را برای توابع درهم‌ساز رمزنگاری SHA-384 و SHA-512 فعال می‌کند. پرچم‌هایی که توابع ذاتی را کنترل می‌کنند اکنون به گزینهٔ \f[V]-XX:+UnlockDiagnosticVMOptions\f[R] نیاز دارند. .TP \f[V]-XX:+UseMathExactIntrinsics\f[R] ذاتی‌سازی (intrinsification) توابع مختلف \f[V]java.lang.Math.*Exact()\f[R] را فعال می‌کند. به‌طور پیش‌فرض فعال است. پرچم‌هایی که توابع ذاتی را کنترل می‌کنند اکنون به گزینهٔ \f[V]-XX:+UnlockDiagnosticVMOptions\f[R] نیاز دارند. .TP \f[V]-XX:+UseMultiplyToLenIntrinsic\f[R] ذاتی‌سازیِ \f[V]BigInteger.multiplyToLen()\f[R] را فعال می‌کند. به‌طور پیش‌فرض در بسترهایی که از آن پشتیبانی می‌کنند فعال است. پرچم‌هایی که توابع ذاتی را کنترل می‌کنند اکنون به گزینهٔ \f[V]-XX:+UnlockDiagnosticVMOptions\f[R] نیاز دارند. .TP -XX:+UseSquareToLenIntrinsic ذاتی‌سازیِ \f[V]BigInteger.squareToLen()\f[R] را فعال می‌کند. به‌طور پیش‌فرض در بسترهایی که از آن پشتیبانی می‌کنند فعال است. پرچم‌هایی که توابع ذاتی را کنترل می‌کنند اکنون به گزینهٔ \f[V]-XX:+UnlockDiagnosticVMOptions\f[R] نیاز دارند. .TP -XX:+UseMulAddIntrinsic ذاتی‌سازیِ \f[V]BigInteger.mulAdd()\f[R] را فعال می‌کند. به‌طور پیش‌فرض در بسترهایی که از آن پشتیبانی می‌کنند فعال است. پرچم‌هایی که توابع ذاتی را کنترل می‌کنند اکنون به گزینهٔ \f[V]-XX:+UnlockDiagnosticVMOptions\f[R] نیاز دارند. .TP -XX:+UseMontgomeryMultiplyIntrinsic ذاتی‌سازیِ \f[V]BigInteger.montgomeryMultiply()\f[R] را فعال می‌کند. به‌طور پیش‌فرض در بسترهایی که از آن پشتیبانی می‌کنند فعال است. پرچم‌هایی که توابع ذاتی را کنترل می‌کنند اکنون به گزینهٔ \f[V]-XX:+UnlockDiagnosticVMOptions\f[R] نیاز دارند. .TP -XX:+UseMontgomerySquareIntrinsic ذاتی‌سازیِ \f[V]BigInteger.montgomerySquare()\f[R] را فعال می‌کند. به‌طور پیش‌فرض در بسترهایی که از آن پشتیبانی می‌کنند فعال است. پرچم‌هایی که توابع ذاتی را کنترل می‌کنند اکنون به گزینهٔ \f[V]-XX:+UnlockDiagnosticVMOptions\f[R] نیاز دارند. .TP \f[V]-XX:+UseCMoveUnconditionally\f[R] دستورالعمل‌های CMove (اسکالر و برداری) را بدون توجه به تحلیل سودآوری تولید می‌کند. .TP \f[V]-XX:+UseCodeCacheFlushing\f[R] تخلیهٔ حافظهٔ نهان کد را پیش از متوقف شدن کامپایلر فعال می‌کند. این گزینه به‌طور پیش‌فرض فعال است. برای غیرفعال کردن تخلیهٔ حافظهٔ نهان کد پیش از متوقف شدن کامپایلر، گزینهٔ \f[V]-XX:-UseCodeCacheFlushing\f[R] را مشخص کنید. .TP \f[V]-XX:+UseCondCardMark\f[R] بررسی علامت‌گذاری شدن کارت پیش از به‌روزرسانی جدول کارت را فعال می‌کند. این گزینه به‌طور پیش‌فرض غیرفعال است. این گزینه تنها باید در دستگاه‌های چندسوکت استفاده شود، جایی که کارایی برنامه‌های جاوای وابسته به عملیات‌های هم‌روند را افزایش می‌دهد. .TP \f[V]-XX:+UseCountedLoopSafepoints\f[R] نقاط امن (safepoints) را در حلقه‌های شمارش‌شده حفظ می‌کند. مقدار پیش‌فرض آن به این بستگی دارد که آیا زباله‌روبِ انتخاب‌شده به نقاط امن با زمان تأخیر کم نیاز دارد یا خیر. .TP \f[V]-XX:LoopStripMiningIter=\f[R]\f[I]number_of_iterations\f[R] تعداد تکرارها در حلقهٔ درونی strip mined را کنترل می‌کند. رویکرد Strip mining حلقه‌های شمارش‌شده را به حلقه‌های تودرتوی دو سطحی تبدیل می‌کند. نقاط امن در حلقهٔ بیرونی حفظ می‌شوند در حالی که حلقهٔ درونی می‌تواند با حداکثر سرعت اجرا شود. این گزینه حداکثر تعداد تکرارها در حلقهٔ درونی را کنترل می‌کند. مقدار پیش‌فرض 1,000 است. .TP \f[V]-XX:LoopStripMiningIterShortLoop=\f[R]\f[I]number_of_iterations\f[R] بهینه‌سازی loop strip mining را کنترل می‌کند. حلقه‌هایی با تعداد تکرار کمتر از مقدار مشخص‌شده فاقد نقطهٔ امن خواهند بود. مقدار پیش‌فرض یک‌دهم مقدار \f[V]-XX:LoopStripMiningIter\f[R] است. .TP \f[V]-XX:+UseFMA\f[R] توابع ذاتی FMA مبتنی بر سخت‌افزار را برای سخت‌افزارهایی که دستورالعمل‌های FMA در آن‌ها موجود است (مانند Intel و ARM64) فعال می‌کند. توابع ذاتی FMA برای متدهای \f[V]java.lang.Math.fma(\f[R]\f[I]a\f[R]\f[V],\f[R] \f[I]b\f[R]\f[V],\f[R] \f[I]c\f[R]\f[V])\f[R] که مقدار عبارت‌های \f[V](\f[R] \f[I]a\f[R] \f[V]*\f[R] \f[I]b\f[R] \f[V]+\f[R] \f[I]c\f[R] \f[V])\f[R] را محاسبه می‌کنند، تولید می‌شوند. .TP \f[V]-XX:+UseRTMDeopt\f[R] قفل‌گذاری RTM را بسته به نسبت انصراف (abort ratio) به‌طور خودکار تنظیم می‌کند. این نسبت توسط گزینهٔ \f[V]-XX:RTMAbortRatio\f[R] تعیین می‌شود. اگر تعداد تراکنش‌های لغوشده از نسبت انصراف فراتر رود، متد حاوی قفل، بهینه‌زدایی شده و تمام قفل‌های آن به شکل قفل‌های عادی مجدداً کامپایل می‌شوند. این گزینه به‌طور پیش‌فرض غیرفعال است. گزینهٔ \f[V]-XX:+UseRTMLocking\f[R] باید فعال باشد. .TP \f[V]-XX:+UseRTMLocking\f[R] کد قفل‌گذاری حافظهٔ تراکنشی محدود (RTM) را برای تمام قفل‌های بادشده (inflated) تولید می‌کند، در حالی که سازوکار قفل‌گذاری عادی به عنوان گردانندهٔ جایگزین (fallback handler) عمل می‌کند. این گزینه به‌طور پیش‌فرض غیرفعال است. گزینه‌های مربوط به RTM تنها در پردازنده‌های x86 که از افزونه‌های همگام‌سازی تراکنشی (TSX) پشتیبانی می‌کنند در دسترس هستند. .RS .PP فناوری RTM بخشی از TSX شرکت Intel است که یک افزونهٔ مجموعه دستورالعمل‌های x86 بوده و ایجاد برنامه‌های چندنخی را تسهیل می‌کند. دستورالعمل‌های جدید \f[V]XBEGIN\f[R]، \f[V]XABORT\f[R]، \f[V]XEND\f[R] و \f[V]XTEST\f[R] توسط RTM معرفی می‌شوند. دستورالعمل‌های \f[V]XBEGIN\f[R] و \f[V]XEND\f[R] مجموعه‌ای از دستورالعمل‌ها را برای اجرا در قالب یک تراکنش در بر می‌گیرند. اگر هنگام اجرای تراکنش هیچ تداخلی رخ ندهد، تغییرات حافظه و ثبات‌ها همگی با هم در دستورالعمل \f[V]XEND\f[R] اعمال (commit) می‌شوند. از دستورالعمل \f[V]XABORT\f[R] می‌توان برای لغو صریح یک تراکنش استفاده کرد و دستورالعمل \f[V]XTEST\f[R] بررسی می‌کند که آیا مجموعه‌ای از دستورالعمل‌ها درون یک تراکنش در حال اجرا هستند یا خیر. .PP یک قفل روی یک تراکنش زمانی باد می‌شود (inflated) که نخی دیگر برای دسترسی به همان تراکنش تلاش کند، و بدین ترتیب نخی را که در ابتدا درخواست دسترسی به تراکنش را نداشته مسدود می‌سازد. سازوکار RTM مستلزم آن است که مجموعه‌ای از عملیات‌های جایگزین برای مواقعی که یک تراکنش لغو شده یا با شکست مواجه می‌شود تعیین گردد. یک قفل RTM قفلی است که به سازوکار TSX واگذار شده است. .PP سازوکار RTM کارایی را برای قفل‌های با رقابت بالا (highly contended) و تداخل کم در یک ناحیهٔ بحرانی (کدی که نباید بیش از یک نخ به‌طور هم‌روند به آن دسترسی داشته باشد) بهبود می‌بخشد. همچنین RTM کارایی قفل‌گذاری درشت‌دانه (coarse-grain locking) را که معمولاً در برنامه‌های چندنخی عملکرد مطلوبی ندارد ارتقا می‌دهد. (قفل‌گذاری درشت‌دانه راهبرد نگه‌داشتن قفل‌ها برای مدت طولانی جهت به حداقل رساندن سربار گرفتن و آزادسازی قفل است، در حالی که قفل‌گذاری ریزدانه (fine-grained locking) راهبرد تلاش برای دستیابی به حداکثر هم‌زمانی از طریق قفل‌گذاری تنها در مواقع ضروری و آزادسازی آن در سریع‌ترین زمان ممکن است.) علاوه بر این، برای قفل‌های با رقابت اندک که توسط نخ‌های مختلف استفاده می‌شوند، RTM می‌تواند اشتراک‌گذاری کاذب خط حافظهٔ نهان (false cache line sharing) را که پینگ‌پنگ خط حافظهٔ نهان نیز نامیده می‌شود کاهش دهد. این رخداد زمانی پیش می‌آید که چندین نخ از پردازنده‌های مختلف در حال دسترسی به منابع متفاوتی باشند، اما آن منابع یک خط حافظهٔ نهان مشترک داشته باشند. در نتیجه، پردازنده‌ها مکرراً خطوط حافظهٔ نهان سایر پردازنده‌ها را باطل می‌کنند که این امر آن‌ها را مجبور می‌سازد به جای حافظهٔ نهان، اطلاعات را از حافظهٔ اصلی بخوانند. .RE .TP \f[V]-XX:+UseSuperWord\f[R] تبدیل عملیات‌های اسکالر به عملیات‌های superword را فعال می‌کند. فناوری Superword یک بهینه‌سازی برداری‌سازی (vectorization) است. این گزینه به‌طور پیش‌فرض فعال است. برای غیرفعال کردن تبدیل عملیات‌های اسکالر به عملیات‌های superword، گزینهٔ \f[V]-XX:-UseSuperWord\f[R] را مشخص کنید..SH "گزینه‌های پیشرفتهٔ سرویس‌پذیری برای جاوا (ADVANCED SERVICEABILITY OPTIONS FOR JAVA)" .PP این گزینه‌های \f[V]java\f[R] امکان جمع‌آوری اطلاعات سیستم و انجام اشکال‌زدایی گسترده را فراهم می‌کنند. .TP \f[V]-XX:+DisableAttachMechanism\f[R] سازوکاری را که به ابزارها اجازهٔ پیوستن (attach) به JVM می‌دهد، غیرفعال می‌کند. به‌طور پیش‌فرض، این گزینه غیرفعال است؛ به این معنی که سازوکار پیوست فعال بوده و می‌توانید از ابزارهای عیب‌یابی و رفع اشکال مانند \f[V]jcmd\f[R]، \f[V]jstack\f[R]، \f[V]jmap\f[R] و \f[V]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 \f[V]-XX:+DTraceAllocProbes\f[R] \f[B]لینوکس و macOS:\f[R] کاوشگرهای ابزار \f[V]dtrace\f[R] را برای تخصیص شیء فعال می‌کند. .TP \f[V]-XX:+DTraceMethodProbes\f[R] \f[B]لینوکس و macOS:\f[R] کاوشگرهای ابزار \f[V]dtrace\f[R] را برای ورود و خروج متد (method-entry و method-exit) فعال می‌کند. .TP \f[V]-XX:+DTraceMonitorProbes\f[R] \f[B]لینوکس و macOS:\f[R] کاوشگرهای ابزار \f[V]dtrace\f[R] را برای رویدادهای مانیتور فعال می‌کند. .TP \f[V]-XX:+HeapDumpOnOutOfMemoryError\f[R] تخلیهٔ محتویات حافظهٔ heap جاوا را در فایلی در دایرکتوری جاری با استفاده از تحلیل‌گر heap (HPROF) هنگام رخ دادن استثنای \f[V]java.lang.OutOfMemoryError\f[R] فعال می‌کند. می‌توانید مسیر و نام فایل تخلیهٔ heap را به‌طور صریح با استفاده از گزینهٔ \f[V]-XX:HeapDumpPath\f[R] مشخص کنید. به‌طور پیش‌فرض، این گزینه غیرفعال است و هنگام رخ دادن استثنای \f[V]OutOfMemoryError\f[R]، حافظهٔ heap تخلیه نمی‌شود. .TP \f[V]-XX:HeapDumpPath=\f[R]\f[I]path\f[R] مسیر و نام فایل را برای نوشتن رونوشت heap ارائه‌شده توسط تحلیل‌گر heap (HPROF) هنگام فعال بودن گزینهٔ \f[V]-XX:+HeapDumpOnOutOfMemoryError\f[R] تعیین می‌کند. به‌طور پیش‌فرض، فایل در دایرکتوری کاری جاری ایجاد می‌شود و نام آن \f[V]java_pid.hprof\f[R] است که در آن \f[V]\f[R] شناسهٔ فرایندی است که موجب بروز خطا شده است. مثال زیر نحوهٔ تنظیم صریح فایل پیش‌فرض را نشان می‌دهد (\f[V]%p\f[R] نشان‌دهندهٔ شناسهٔ فرایند جاری است): .RS .RS .PP \f[V]-XX:HeapDumpPath=./java_pid%p.hprof\f[R] .RE .IP \[bu] 2 \f[B]غیر ویندوز:\f[R] مثال زیر نحوهٔ تنظیم فایل تخلیهٔ heap را روی \f[V]/var/log/java/java_heapdump.hprof\f[R] نشان می‌دهد: .RS 2 .RS .PP \f[V]-XX:HeapDumpPath=/var/log/java/java_heapdump.hprof\f[R] .RE .RE .IP \[bu] 2 \f[B]ویندوز:\f[R] مثال زیر نحوهٔ تنظیم فایل تخلیهٔ heap را روی \f[V]C:/log/java/java_heapdump.log\f[R] نشان می‌دهد: .RS 2 .RS .PP \f[V]-XX:HeapDumpPath=C:/log/java/java_heapdump.log\f[R] .RE .RE .RE .TP \f[V]-XX:LogFile=\f[R]\f[I]path\f[R] مسیر و نام فایلی را که داده‌های لاگ در آن نوشته می‌شوند تعیین می‌کند. به‌طور پیش‌فرض، این فایل در دایرکتوری کاری جاری ایجاد می‌شود و نام آن \f[V]hotspot.log\f[R] است. .RS .IP \[bu] 2 \f[B]غیر ویندوز:\f[R] مثال زیر نحوهٔ تنظیم فایل لاگ را روی \f[V]/var/log/java/hotspot.log\f[R] نشان می‌دهد: .RS 2 .RS .PP \f[V]-XX:LogFile=/var/log/java/hotspot.log\f[R] .RE .RE .IP \[bu] 2 \f[B]ویندوز:\f[R] مثال زیر نحوهٔ تنظیم فایل لاگ را روی \f[V]C:/log/java/hotspot.log\f[R] نشان می‌دهد: .RS 2 .RS .PP \f[V]-XX:LogFile=C:/log/java/hotspot.log\f[R] .RE .RE .RE .TP \f[V]-XX:+PrintClassHistogram\f[R] چاپ بافت‌نگار (هیستوگرام) نمونه‌های کلاس را پس از یکی از رویدادهای زیر فعال می‌کند: .RS .IP \[bu] 2 \f[B]غیر ویندوز:\f[R] \f[V]Control+\[rs]\f[R] (\f[V]SIGQUIT\f[R]) .IP \[bu] 2 \f[B]ویندوز:\f[R] \f[V]Control+C\f[R] (\f[V]SIGTERM\f[R]) .PP به‌طور پیش‌فرض، این گزینه غیرفعال است. .PP تنظیم این گزینه معادل اجرای دستور \f[V]jmap -histo\f[R] یا دستور \f[V]jcmd\f[R] \f[I]pid\f[R] \f[V]GC.class_histogram\f[R] است، که در آن \f[I]pid\f[R] شناسهٔ فرایند جاری جاوا است. .RE .TP \f[V]-XX:+PrintConcurrentLocks\f[R] چاپ قفل‌های \f[V]java.util.concurrent\f[R] را پس از یکی از رویدادهای زیر فعال می‌کند: .RS .IP \[bu] 2 \f[B]غیر ویندوز:\f[R] \f[V]Control+\[rs]\f[R] (\f[V]SIGQUIT\f[R]) .IP \[bu] 2 \f[B]ویندوز:\f[R] \f[V]Control+C\f[R] (\f[V]SIGTERM\f[R]) .PP به‌طور پیش‌فرض، این گزینه غیرفعال است. .PP تنظیم این گزینه معادل اجرای دستور \f[V]jstack -l\f[R] یا دستور \f[V]jcmd\f[R] \f[I]pid\f[R] \f[V]Thread.print -l\f[R] است، که در آن \f[I]pid\f[R] شناسهٔ فرایند جاری جاوا است. .RE .TP \f[V]-XX:+PrintFlagsRanges\f[R] محدودهٔ مشخص‌شده را چاپ می‌کند و امکان آزمایش خودکار مقادیر را فراهم می‌سازد. بخش \f[B]Validate Java Virtual Machine Flag Arguments\f[R] را ببینید. .TP \f[V]-XX:+PerfDataSaveToFile\f[R] در صورت فعال بودن، داده‌های دودویی \f[B]jstat\f[R] را هنگام خروج برنامهٔ جاوا ذخیره می‌کند. این داده‌های دودویی در فایلی به نام \f[V]hsperfdata_\f[R]\f[I]pid\f[R] ذخیره می‌شوند که در آن \f[I]pid\f[R] شناسهٔ فرایند برنامهٔ جاوایی است که اجرا کرده‌اید. برای نمایش داده‌های کارایی موجود در این فایل، از دستور \f[V]jstat\f[R] به صورت زیر استفاده کنید: .RS .RS .PP \f[V]jstat -class file:///\f[R]\f[I]path\f[R]\f[V]/hsperfdata_\f[R]\f[I]pid\f[R] .RE .RS .PP \f[V]jstat -gc file:///\f[R]\f[I]path\f[R]\f[V]/hsperfdata_\f[R]\f[I]pid\f[R] .RE .RE .TP \f[V]-XX:+UsePerfData\f[R] قابلیت \f[V]perfdata\f[R] را فعال می‌کند. این گزینه به‌طور پیش‌فرض فعال است تا نظارت بر JVM و آزمایش کارایی امکان‌پذیر باشد. غیرفعال کردن آن مانع از ایجاد دایرکتوری‌های \f[V]hsperfdata_userid\f[R] می‌شود. برای غیرفعال کردن قابلیت \f[V]perfdata\f[R]، گزینهٔ \f[V]-XX:-UsePerfData\f[R] را مشخص کنید..SH "گزینه‌های پیشرفته جمع‌آوری زباله برای جاوا (ADVANCED GARBAGE COLLECTION OPTIONS FOR JAVA)" .PP این گزینه‌های \f[V]java\f[R] نحوه اجرای فرایند جمع‌آوری زباله (GC) توسط Java HotSpot VM را کنترل می‌کنند. .TP \f[V]-XX:+AggressiveHeap\f[R] بهینه‌سازی هیپ جاوا را فعال می‌کند. این گزینه پارامترهای مختلف را بر اساس پیکربندی رایانه (RAM و CPU) طوری تنظیم می‌کند که برای کارهای طولانی‌مدت با تخصیص حافظه فشرده بهینه باشند. به‌طور پیش‌فرض، این گزینه غیرفعال است و اندازه‌های هیپ با تهاجم کمتری پیکربندی می‌شوند. .TP \f[V]-XX:+AlwaysPreTouch\f[R] از ماشین مجازی درخواست می‌کند پس از دریافت هر صفحه در هیپ جاوا از سیستم‌عامل و پیش از تحویل دادن حافظه به برنامه، تک‌تک صفحات را لمس (touch / پیش‌بارگذاری) کند. به‌طور پیش‌فرض، این گزینه غیرفعال است و تمام صفحات هم‌زمان با استفاده برنامه از فضای هیپ تخصیص می‌یابند. .TP \f[V]-XX:ConcGCThreads=\f[R]\f[I]threads\f[R] تعداد ریسه‌های مورد استفاده برای GC هم‌روند را تنظیم می‌کند. مقدار \f[I]\f[VI]threads\f[I]\f[R] را تقریباً برابر با ۱/۴ تعداد ریسه‌های جمع‌آوری زباله موازی قرار می‌دهد. مقدار پیش‌فرض به تعداد CPUهای در دسترس JVM بستگی دارد. .RS .PP برای مثال، برای تنظیم تعداد ریسه‌ها برای GC هم‌روند روی ۲، گزینه زیر را مشخص کنید: .RS .PP \f[V]-XX:ConcGCThreads=2\f[R] .RE .RE .TP \f[V]-XX:+DisableExplicitGC\f[R] گزینه‌ای را فعال می‌کند که پردازش فراخوانی‌های متد \f[V]System.gc()\f[R] را غیرفعال می‌سازد. این گزینه به‌طور پیش‌فرض غیرفعال است، به این معنی که فراخوانی‌های \f[V]System.gc()\f[R] پردازش می‌شوند. اگر پردازش فراخوانی‌های \f[V]System.gc()\f[R] غیرفعال باشد، JVM همچنان در صورت نیاز فرایند GC را انجام می‌دهد. .TP \f[V]-XX:+ExplicitGCInvokesConcurrent\f[R] فراخوانی GC هم‌روند را از طریق درخواست \f[V]System.gc()\f[R] فعال می‌کند. این گزینه به‌طور پیش‌فرض غیرفعال است و تنها همراه با گزینه \f[V]-XX:+UseG1GC\f[R] قابل فعال‌سازی است. .TP \f[V]-XX:G1AdaptiveIHOPNumInitialSamples=\f[R]\f[I]number\f[R] هنگامی که \f[V]-XX:UseAdaptiveIHOP\f[R] فعال باشد، این گزینه تعداد چرخه‌های علامت‌گذاری تکمیل‌شده‌ای را تنظیم می‌کند که برای جمع‌آوری نمونه‌ها به کار می‌روند تا زمانی که G1 مقدار بهینه \f[V]-XX:InitiatingHeapOccupancyPercent\f[R] را به‌صورت تطبیقی تعیین کند. پیش از آن، G1 مستقیماً از مقدار \f[V]-XX:InitiatingHeapOccupancyPercent\f[R] برای این منظور استفاده می‌کند. مقدار پیش‌فرض 3 است. .TP \f[V]-XX:G1HeapRegionSize=\f[R]\f[I]size\f[R] اندازه نواحی‌ای را تنظیم می‌کند که هنگام استفاده از گردآورنده G1 (Garbage-First)، هیپ جاوا به آن‌ها تقسیم می‌شود. این مقدار توانی از ۲ است و می‌تواند در بازه 1 MB تا 32 MB باشد. اندازه پیش‌فرض ناحیه به‌صورت ارگونومیک بر اساس اندازه هیپ و با هدف تقریبی ۲۰۴۸ ناحیه تعیین می‌شود. .RS .PP مثال زیر اندازه زیربخش‌ها را روی 16 MB تنظیم می‌کند: .RS .PP \f[V]-XX:G1HeapRegionSize=16m\f[R] .RE .RE .TP \f[V]-XX:G1HeapWastePercent=\f[R]\f[I]percent\f[R] درصدی از هیپ را که حاضر به هدر رفتن آن هستید تنظیم می‌کند. هنگامی که درصد فضای قابل بازیافت کمتر از درصد هدررفت هیپ باشد، Java HotSpot VM چرخه جمع‌آوری زباله ترکیبی (mixed) را آغاز نمی‌کند. پیش‌فرض 5 درصد است. .TP \f[V]-XX:G1MaxNewSizePercent=\f[R]\f[I]percent\f[R] درصدی از اندازه هیپ را برای استفاده به‌عنوان بیشینه اندازه نسل جوان (young generation) تنظیم می‌کند. مقدار پیش‌فرض 60 درصد از هیپ جاوای شما است. .RS .PP این یک پرچم آزمایشی است. این تنظیم جایگزین تنظیم \f[V]-XX:DefaultMaxNewGenPercent\f[R] می‌شود. .RE .TP \f[V]-XX:G1MixedGCCountTarget=\f[R]\f[I]number\f[R] تعداد هدف برای جمع‌آوری‌های زباله ترکیبی را پس از یک چرخه علامت‌گذاری تنظیم می‌کند تا نواحی قدیمی با حداکثر داده زنده به میزان \f[V]G1MixedGCLIveThresholdPercent\f[R] جمع‌آوری شوند. پیش‌فرض 8 جمع‌آوری زباله ترکیبی است. هدف جمع‌آوری‌های ترکیبی، ماندن در این محدوده تعداد است. .TP \f[V]-XX:G1MixedGCLiveThresholdPercent=\f[R]\f[I]percent\f[R] آستانه اشغال یک ناحیه قدیمی را برای گنجانده شدن در چرخه جمع‌آوری زباله ترکیبی تنظیم می‌کند. میزان اشغال پیش‌فرض 85 درصد است. .RS .PP این یک پرچم آزمایشی است. این تنظیم جایگزین تنظیم \f[V]-XX:G1OldCSetRegionLiveThresholdPercent\f[R] می‌شود. .RE .TP \f[V]-XX:G1NewSizePercent=\f[R]\f[I]percent\f[R] درصدی از هیپ را برای استفاده به‌عنوان کمینه اندازه نسل جوان تنظیم می‌کند. مقدار پیش‌فرض 5 درصد از هیپ جاوای شما است. .RS .PP این یک پرچم آزمایشی است. این تنظیم جایگزین تنظیم \f[V]-XX:DefaultMinNewGenPercent\f[R] می‌شود. .RE .TP \f[V]-XX:G1OldCSetRegionThresholdPercent=\f[R]\f[I]percent\f[R] حد بالایی را برای تعداد نواحی قدیمی جمع‌آوری‌شده در طول یک چرخه جمع‌آوری زباله ترکیبی تعیین می‌کند. پیش‌فرض 10 درصد از هیپ جاوا است. .TP \f[V]-XX:G1ReservePercent=\f[R]\f[I]percent\f[R] درصدی از هیپ (۰ تا ۵۰) را تنظیم می‌کند که به‌عنوان سقف کاذب رزرو می‌شود تا احتمال شکست در ارتقا (promotion failure) برای گردآورنده G1 کاهش یابد. هنگام افزایش یا کاهش این درصد، مطمئن شوید که کل هیپ جاوا را به همان مقدار تنظیم کنید. به‌طور پیش‌فرض، این گزینه روی 10% تنظیم شده است. .RS .PP مثال زیر هیپ رزروشده را روی 20% تنظیم می‌کند: .RS .PP \f[V]-XX:G1ReservePercent=20\f[R] .RE .RE .TP \f[V]-XX:+G1UseAdaptiveIHOP\f[R] محاسبه تطبیقی میزان اشغال نسل قدیمی را برای شروع کارهای پس‌زمینه آماده‌سازی جمع‌آوری نسل قدیمی کنترل می‌کند. در صورت فعال بودن، G1 برای چند بار اول مطابق با مقدار مشخص‌شده در \f[V]-XX:G1AdaptiveIHOPNumInitialSamples\f[R] از مقدار \f[V]-XX:InitiatingHeapOccupancyPercent\f[R] استفاده می‌کند، و پس از آن به‌صورت خودکار و تطبیقی مقدار بهینه جدیدی برای اشغال آغازین محاسبه می‌نماید. در غیر این صورت، فرایند جمع‌آوری نسل قدیمی همواره در میزان اشغال تعیین‌شده توسط \f[V]-XX:InitiatingHeapOccupancyPercent\f[R] آغاز می‌شود. .RS .PP پیش‌فرض، فعال است. .RE .TP \f[V]-XX:InitialHeapSize=\f[R]\f[I]size\f[R] اندازه اولیه (به بایت) استخر تخصیص حافظه را تنظیم می‌کند. این مقدار باید 0 یا مضربی از 1024 و بزرگ‌تر از 1 MB باشد. حرف \f[V]k\f[R] یا \f[V]K\f[R] را برای نشان دادن کیلوبایت، \f[V]m\f[R] یا \f[V]M\f[R] را برای نشان دادن مگابایت، یا \f[V]g\f[R] یا \f[V]G\f[R] را برای نشان دادن گیگابایت به آن الحاق کنید. مقدار پیش‌فرض در زمان اجرا بر اساس پیکربندی سیستم انتخاب می‌شود. .RS .PP مثال‌های زیر نحوه تنظیم اندازه حافظه تخصیص‌یافته روی 6 MB را با واحدهای مختلف نشان می‌دهند: .IP .nf \f[CB] -XX:InitialHeapSize=6291456 -XX:InitialHeapSize=6144k -XX:InitialHeapSize=6m \f[R] .fi .PP اگر این گزینه را روی 0 تنظیم کنید، اندازه اولیه برابر با مجموع اندازه‌های تخصیص‌یافته برای نسل قدیمی و نسل جوان تعیین می‌شود. اندازه هیپ برای نسل جوان را می‌توان با استفاده از گزینه \f[V]-XX:NewSize\f[R] تنظیم کرد. توجه داشته باشید که گزینه \f[V]-Xms\f[R] هم حداقل و هم اندازه اولیه هیپ را تنظیم می‌کند. اگر \f[V]-Xms\f[R] بعد از \f[V]-XX:InitialHeapSize\f[R] در خط فرمان ظاهر شود، اندازه اولیه هیپ روی مقدار مشخص‌شده با \f[V]-Xms\f[R] تنظیم خواهد شد. .RE .TP \f[V]-XX:InitialRAMPercentage=\f[R]\f[I]percent\f[R] میزان اولیه حافظه‌ای را که JVM پیش از اعمال روش‌های ارگونومیک برای هیپ جاوا استفاده می‌کند، به‌صورت درصدی از حداکثر مقدار تعیین‌شده بر اساس توضیحات گزینه \f[V]-XX:MaxRAM\f[R] تنظیم می‌کند. مقدار پیش‌فرض 1.5625 درصد است. .RS .PP مثال زیر نحوه تنظیم درصد مقدار اولیه حافظه مورد استفاده برای هیپ جاوا را نشان می‌دهد: .RS .PP \f[V]-XX:InitialRAMPercentage=5\f[R] .RE .RE.TP \f[V]-XX:InitialSurvivorRatio=\f[R]\f[I]ratio\f[R] نسبت اولیه فضای بازمانده (survivor space) مورد استفاده توسط جمع‌آوری‌کننده زباله توان عملیاتی (throughput garbage collector) را تنظیم می‌کند (که با گزینه \f[V]-XX:+UseParallelGC\f[R] فعال می‌شود). تنظیم اندازه تطبیقی (Adaptive sizing) به‌طور پیش‌فرض در جمع‌آوری‌کننده زباله توان عملیاتی با استفاده از گزینه \f[V]-XX:+UseParallelGC\f[R] فعال است و اندازه فضای بازمانده با شروع از مقدار اولیه، بر اساس رفتار برنامه تغییر اندازه می‌دهد. اگر تنظیم اندازه تطبیقی غیرفعال باشد (با استفاده از گزینه \f[V]-XX:-UseAdaptiveSizePolicy\f[R])، آنگاه باید از گزینه \f[V]-XX:SurvivorRatio\f[R] برای تنظیم اندازه فضای بازمانده در تمام طول اجرای برنامه استفاده شود. .RS .PP فرمول زیر می‌تواند برای محاسبه اندازه اولیه فضای بازمانده (S) بر اساس اندازه نسل جوان (Y) و نسبت اولیه فضای بازمانده (R) استفاده شود: .RS .PP \f[V]S=Y/(R+2)\f[R] .RE .PP عدد ۲ در این معادله نشان‌دهنده دو فضای بازمانده است. هرچه مقدار مشخص‌شده برای نسبت اولیه فضای بازمانده بزرگ‌تر باشد، اندازه اولیه فضای بازمانده کوچک‌تر خواهد بود. .PP به‌طور پیش‌فرض، نسبت اولیه فضای بازمانده روی ۸ تنظیم شده است. اگر از مقدار پیش‌فرض اندازه فضای نسل جوان (۲ مگابایت) استفاده شود، اندازه اولیه فضای بازمانده ۰٫۲ مگابایت خواهد بود. .PP مثال زیر نحوه تنظیم نسبت اولیه فضای بازمانده را روی ۴ نشان می‌دهد: .RS .PP \f[V]-XX:InitialSurvivorRatio=4\f[R] .RE .RE .TP \f[V]-XX:InitiatingHeapOccupancyPercent=\f[R]\f[I]percent\f[R] درصد اشغال فضای نسل قدیم (۰ تا ۱۰۰) را برای شروع نخستین چرخه‌های نشانه‌گذاری همگام در جمع‌آوری‌کننده زباله G1 تعیین می‌کند. .RS .PP به‌طور پیش‌فرض، مقدار آغازین روی ۴۵٪ تنظیم شده است. مقدار ۰ به معنای چرخه‌های همگام GC بدون توقف از ابتدا است، تا زمانی که G1 این مقدار را به‌صورت تطبیقی تنظیم کند. .PP همچنین گزینه‌های \f[V]-XX:G1UseAdaptiveIHOP\f[R] و \f[V]-XX:G1AdaptiveIHOPNumInitialSamples\f[R] را ببینید. .PP مثال زیر نحوه تنظیم درصد اشغال آغازین هیپ را روی ۷۵٪ نشان می‌دهد: .RS .PP \f[V]-XX:InitiatingHeapOccupancyPercent=75\f[R] .RE .RE .TP \f[V]-XX:MaxGCPauseMillis=\f[R]\f[I]time\f[R] یک هدف برای حداکثر زمان توقف GC (برحسب میلی‌ثانیه) تعیین می‌کند. این یک هدف نرم (soft goal) است و JVM نهایت تلاش خود را برای دستیابی به آن به کار خواهد بست. مقدار مشخص‌شده با اندازه هیپ شما تطبیق پیدا نمی‌کند. به‌طور پیش‌فرض، برای G1 هدف حداکثر زمان توقف ۲۰۰ میلی‌ثانیه است. سایر جمع‌آوری‌کننده‌های نسلی به‌طور پیش‌فرض از هدف زمان توقف استفاده نمی‌کنند. .RS .PP مثال زیر نحوه تنظیم هدف حداکثر زمان توقف را روی ۵۰۰ میلی‌ثانیه نشان می‌دهد: .RS .PP \f[V]-XX:MaxGCPauseMillis=500\f[R] .RE .RE .TP \f[V]-XX:MaxHeapSize=\f[R]\f[I]size\f[R] حداکثر اندازه (برحسب بایت) مخزن تخصیص حافظه را تنظیم می‌کند. این مقدار باید مضربی از ۱۰۲۴ و بزرگ‌تر از ۲ مگابایت باشد. حرف \f[V]k\f[R] یا \f[V]K\f[R] را برای مشخص کردن کیلوبایت، \f[V]m\f[R] یا \f[V]M\f[R] را برای مشخص کردن مگابایت، یا \f[V]g\f[R] یا \f[V]G\f[R] را برای مشخص کردن گیگابایت اضافه کنید. مقدار پیش‌فرض در زمان اجرا بر اساس پیکربندی سیستم انتخاب می‌شود. برای استقرارهای سرور، گزینه‌های \f[V]-XX:InitialHeapSize\f[R] و \f[V]-XX:MaxHeapSize\f[R] اغلب روی مقداری یکسان تنظیم می‌شوند. .RS .PP مثال‌های زیر نحوه تنظیم حداکثر اندازه مجاز حافظه تخصیص‌یافته را روی ۸۰ مگابایت با استفاده از واحدهای مختلف نشان می‌دهند: .IP .nf \f[CB] -XX:MaxHeapSize=83886080 -XX:MaxHeapSize=81920k -XX:MaxHeapSize=80m \f[R] .fi .PP گزینه \f[V]-XX:MaxHeapSize\f[R] معادل \f[V]-Xmx\f[R] است. .RE .TP \f[V]-XX:MaxHeapFreeRatio=\f[R]\f[I]percent\f[R] حداکثر درصد مجاز فضای خالی هیپ (۰ تا ۱۰۰) را پس از یک رویداد GC تنظیم می‌کند. اگر فضای خالی هیپ بیش از این مقدار گسترش یابد، هیپ کوچک می‌شود. به‌طور پیش‌فرض، این مقدار روی ۷۰٪ تنظیم شده است. .RS .PP اندازه هیپ جاوا را با کاهش مقادیر پارامترهای \f[V]MaxHeapFreeRatio\f[R] (مقدار پیش‌فرض ۷۰٪ است) و \f[V]MinHeapFreeRatio\f[R] (مقدار پیش‌فرض ۴۰٪ است) از طریق گزینه‌های خط فرمان \f[V]-XX:MaxHeapFreeRatio\f[R] و \f[V]-XX:MinHeapFreeRatio\f[R] به حداقل برسانید. کاهش \f[V]MaxHeapFreeRatio\f[R] تا ۱۰٪ و \f[V]MinHeapFreeRatio\f[R] تا ۵٪ توانسته است با موفقیت اندازه هیپ را بدون افت کارایی چشمگیر کاهش دهد؛ با این حال، نتایج ممکن است بسته به برنامه شما بسیار متفاوت باشد. مقادیر مختلف را برای این پارامترها بیازمایید تا به کمترین مقدار ممکن برسند و در عین حال عملکرد قابل‌قبول حفظ شود. .RS .PP \f[V]-XX:MaxHeapFreeRatio=10 -XX:MinHeapFreeRatio=5\f[R] .RE .PP کاربرانی که تلاش می‌کنند اندازه هیپ را کوچک نگه دارند باید گزینه \f[V]-XX:-ShrinkHeapInSteps\f[R] را نیز اضافه کنند. برای توضیحات درباره استفاده از این گزینه جهت کوچک نگه داشتن هیپ جاوا از طریق کاهش ردپای پویای حافظه در برنامه‌های جاسازی‌شده (embedded)، به \f[B]Performance Tuning Examples\f[R] مراجعه کنید. .RE .TP \f[V]-XX:MaxMetaspaceSize=\f[R]\f[I]size\f[R] حداکثر میزان حافظه بومی (native memory) قابل تخصیص برای فراداده‌های کلاس (class metadata) را تعیین می‌کند. به‌طور پیش‌فرض، این اندازه محدود نیست. میزان فراداده برای یک برنامه به خود برنامه، سایر برنامه‌های در حال اجرا و میزان حافظه در دسترس سیستم بستگی دارد. .RS .PP مثال زیر نحوه تنظیم حداکثر اندازه فراداده کلاس را روی ۲۵۶ مگابایت نشان می‌دهد: .RS .PP \f[V]-XX:MaxMetaspaceSize=256m\f[R] .RE .RE .TP \f[V]-XX:MaxNewSize=\f[R]\f[I]size\f[R] حداکثر اندازه (برحسب بایت) هیپ را برای نسل جوان (nursery) تنظیم می‌کند. مقدار پیش‌فرض به‌صورت ارگونومیک تعیین می‌شود. .TP \f[V]-XX:MaxRAM=\f[R]\f[I]size\f[R] حداکثر میزان حافظه‌ای را که JVM می‌تواند پیش از اعمال قواعد ارگونومیک برای هیپ جاوا استفاده کند، تنظیم می‌کند. مقدار پیش‌فرض برابر است با حداکثر حافظه در دسترس برای فرایند JVM یا ۱۲۸ گیگابایت، هر کدام که کمتر باشد. .RS .PP حداکثر میزان حافظه در دسترس فرایند JVM برابر با کمینه حافظه فیزیکی دستگاه و محدودیت‌های اعمال‌شده توسط محیط (مانند container) است. .PP مشخص کردن این گزینه در صورتی که نتیجه ترکیب این گزینه و سایر گزینه‌های اثرگذار بر حداکثر مقدار حافظه، بزرگ‌تر از دامنه حافظه آدرس‌پذیر توسط compressed oops باشد، استفاده خودکار از compressed oops را غیرفعال می‌کند. برای اطلاعات بیشتر درباره compressed oops به \f[V]-XX:UseCompressedOops\f[R] مراجعه کنید. .PP مثال زیر نحوه تنظیم حداکثر مقدار حافظه در دسترس برای تعیین اندازه هیپ جاوا را روی ۲ گیگابایت نشان می‌دهد: .RS .PP \f[V]-XX:MaxRAM=2G\f[R] .RE .RE .TP \f[V]-XX:MaxRAMPercentage=\f[R]\f[I]percent\f[R] حداکثر میزان حافظه‌ای را که JVM می‌تواند پیش از اعمال قواعد ارگونومیک برای هیپ جاوا استفاده کند، به‌صورت درصدی از حداکثر مقدار تعیین‌شده بر اساس توضیحات گزینه \f[V]-XX:MaxRAM\f[R] تنظیم می‌کند. مقدار پیش‌فرض ۲۵ درصد است. .RS .PP مشخص کردن این گزینه در صورتی که نتیجه ترکیب این گزینه و سایر گزینه‌های اثرگذار بر حداکثر مقدار حافظه، بزرگ‌تر از دامنه حافظه آدرس‌پذیر توسط compressed oops باشد، استفاده خودکار از compressed oops را غیرفعال می‌کند. برای اطلاعات بیشتر درباره compressed oops به \f[V]-XX:UseCompressedOops\f[R] مراجعه کنید. .PP مثال زیر نحوه تنظیم درصد حداکثر میزان حافظه مورد استفاده برای هیپ جاوا را نشان می‌دهد: .RS .PP \f[V]-XX:MaxRAMPercentage=75\f[R] .RE .RE.TP \f[V]-XX:MinRAMPercentage=\f[R]\f[I]percent\f[R] حداکثر میزان حافظه‌ای را که JVM می‌تواند پیش از اعمال قواعد ارگونومی (ergonomics heuristics) برای هیپ جاوا استفاده کند، برای هیپ‌های کوچک به صورت درصدی از حداکثر مقدار تعیین‌شده بر اساس گزینهٔ \f[V]-XX:MaxRAM\f[R] تنظیم می‌کند. یک هیپ کوچک، هیپی با اندازهٔ تقریبی ۱۲۵ مگابایت است. مقدار پیش‌فرض ۵۰ درصد است. .RS .PP مثال زیر نحوهٔ تنظیم درصد حداکثر میزان حافظهٔ مورد استفاده برای هیپ جاوا را در هیپ‌های کوچک نشان می‌دهد: .RS .PP \f[V]-XX:MinRAMPercentage=75\f[R] .RE .RE .TP \f[V]-XX:MaxTenuringThreshold=\f[R]\f[I]threshold\f[R] حداکثر آستانهٔ ارتقا (tenuring threshold) را برای استفاده در تعیین اندازهٔ تطبیقی GC تنظیم می‌کند. بزرگ‌ترین مقدار ۱۵ است. مقدار پیش‌فرض برای گردآورندهٔ موازی (parallel / throughput collector) برابر با ۱۵ است. .RS .PP مثال زیر نحوهٔ تنظیم حداکثر آستانهٔ ارتقا را روی ۱۰ نشان می‌دهد: .RS .PP \f[V]-XX:MaxTenuringThreshold=10\f[R] .RE .RE .TP \f[V]-XX:MetaspaceSize=\f[R]\f[I]size\f[R] اندازهٔ فضای متادادهٔ کلاس تخصیص‌یافته را تنظیم می‌کند که در صورت فراتر رفتن از آن برای اولین بار، یک بازیافت حافظه (GC) آغاز می‌شود. این آستانه برای بازیافت حافظه، بسته به میزان متادادهٔ استفاده‌شده افزایش یا کاهش می‌یابد. اندازهٔ پیش‌فرض به بستر اجرایی (platform) بستگی دارد. .TP \f[V]-XX:MinHeapFreeRatio=\f[R]\f[I]percent\f[R] حداقل درصد مجاز فضای خالی هیپ (۰ تا ۱۰۰) پس از یک رویداد GC را تعیین می‌کند. اگر فضای خالی هیپ به کمتر از این مقدار برسد، هیپ گسترش می‌یابد. به طور پیش‌فرض، این مقدار روی ۴۰٪ تنظیم شده است. .RS .PP اندازهٔ هیپ جاوا را با کاهش مقادیر پارامترهای \f[V]MaxHeapFreeRatio\f[R] (مقدار پیش‌فرض ۷۰٪) و \f[V]MinHeapFreeRatio\f[R] (مقدار پیش‌فرض ۴۰٪) از طریق گزینه‌های خط فرمان \f[V]-XX:MaxHeapFreeRatio\f[R] و \f[V]-XX:MinHeapFreeRatio\f[R] به حداقل برسانید. کاهش \f[V]MaxHeapFreeRatio\f[R] تا ۱۰٪ و \f[V]MinHeapFreeRatio\f[R] تا ۵٪ توانسته است با موفقیت اندازهٔ هیپ را بدون افت کارایی شدید کاهش دهد؛ با این حال، بسته به برنامهٔ شما نتایج ممکن است تفاوت چشمگیری داشته باشد. مقادیر مختلف این پارامترها را امتحان کنید تا جایی که تا حد ممکن پایین باشند و در عین حال عملکردی قابل قبول حفظ شود. .RS .PP \f[V]-XX:MaxHeapFreeRatio=10 -XX:MinHeapFreeRatio=5\f[R] .RE .PP کاربرانی که تلاش می‌کنند اندازهٔ هیپ را کوچک نگه دارند، باید گزینهٔ \f[V]-XX:-ShrinkHeapInSteps\f[R] را نیز اضافه کنند. برای توضیح دربارهٔ استفاده از این گزینه به منظور کوچک نگه داشتن هیپ جاوا از طریق کاهش ردپای حافظهٔ پویا (dynamic footprint) در برنامه‌های تعبیه‌شده (embedded)، بخش \f[B]Performance Tuning Examples\f[R] را ببینید. .RE .TP \f[V]-XX:MinHeapSize=\f[R]\f[I]size\f[R] حداقل اندازهٔ (به بایت) استخر تخصیص حافظه را تنظیم می‌کند. این مقدار باید یا ۰ باشد، یا مضربی از ۱۰۲۴ و بزرگ‌تر از ۱ مگابایت. حرف \f[V]k\f[R] یا \f[V]K\f[R] را برای مشخص کردن کیلوبایت، \f[V]m\f[R] یا \f[V]M\f[R] را برای مگابایت، یا \f[V]g\f[R] یا \f[V]G\f[R] را برای گیگابایت به انتهای مقدار اضافه کنید. مقدار پیش‌فرض در زمان اجرا بر اساس پیکربندی سیستم انتخاب می‌شود. .RS .PP مثال‌های زیر نحوهٔ تنظیم حداقل اندازهٔ حافظهٔ تخصیص‌یافته را بر روی ۶ مگابایت با استفاده از واحدهای مختلف نشان می‌دهند: .IP .nf \f[CB] -XX:MinHeapSize=6291456 -XX:MinHeapSize=6144k -XX:MinHeapSize=6m \f[R] .fi .PP اگر این گزینه را روی ۰ تنظیم کنید، حداقل اندازه برابر با مقدار اندازهٔ اولیه تنظیم می‌شود. .RE .TP \f[V]-XX:NewRatio=\f[R]\f[I]ratio\f[R] نسبت بین اندازهٔ نسل جوان (young generation) و نسل قدیم (old generation) را تعیین می‌کند. به طور پیش‌فرض، این گزینه روی ۲ تنظیم شده است. مثال زیر نحوهٔ تنظیم نسبت جوان به قدیم را روی ۱ نشان می‌دهد: .RS .RS .PP \f[V]-XX:NewRatio=1\f[R] .RE .RE .TP \f[V]-XX:NewSize=\f[R]\f[I]size\f[R] اندازهٔ اولیهٔ (به بایت) هیپ را برای نسل جوان (nursery) تعیین می‌کند. حرف \f[V]k\f[R] یا \f[V]K\f[R] را برای مشخص کردن کیلوبایت، \f[V]m\f[R] یا \f[V]M\f[R] را برای مگابایت، یا \f[V]g\f[R] یا \f[V]G\f[R] را برای گیگابایت به انتهای مقدار اضافه کنید. .RS .PP ناحیهٔ نسل جوان در هیپ برای اشیاء جدید استفاده می‌شود. فرایند GC در این ناحیه بیش از سایر نواحی انجام می‌گیرد. اگر اندازهٔ نسل جوان خیلی کم باشد، تعداد زیادی GC جزئی (minor GC) اجرا می‌شود. اگر اندازه بیش از حد بزرگ باشد، تنها GC کامل (full GC) اجرا خواهد شد که تکمیل آن ممکن است زمان زیادی طول بکشد. توصیه می‌شود اندازهٔ نسل جوان را بزرگ‌تر از ۲۵٪ و کمتر از ۵۰٪ اندازهٔ کلی هیپ نگه دارید. .PP مثال‌های زیر نحوهٔ تنظیم اندازهٔ اولیهٔ نسل جوان را بر روی ۲۵۶ مگابایت با استفاده از واحدهای مختلف نشان می‌دهند: .IP .nf \f[CB] -XX:NewSize=256m -XX:NewSize=262144k -XX:NewSize=268435456 \f[R] .fi .PP گزینهٔ \f[V]-XX:NewSize\f[R] معادل \f[V]-Xmn\f[R] است. .RE .TP \f[V]-XX:ParallelGCThreads=\f[R]\f[I]threads\f[R] تعداد رشته‌های کاری توقف کامل (stop-the-world یا STW) را تعیین می‌کند. مقدار پیش‌فرض به تعداد پردازنده‌های در دسترس JVM و گردآورندهٔ زبالهٔ انتخاب‌شده بستگی دارد. .RS .PP برای مثال، به منظور تنظیم تعداد رشته‌ها برای G1 GC روی ۲، گزینهٔ زیر را مشخص کنید: .RS .PP \f[V]-XX:ParallelGCThreads=2\f[R] .RE .RE .TP \f[V]-XX:+ParallelRefProcEnabled\f[R] پردازش موازی ارجاع‌ها (parallel reference processing) را فعال می‌کند. این گزینه به طور پیش‌فرض غیرفعال است. .TP \f[V]-XX:+PrintAdaptiveSizePolicy\f[R] چاپ اطلاعات مربوط به تعیین اندازهٔ تطبیقی نسل‌ها را فعال می‌کند. این گزینه به طور پیش‌فرض غیرفعال است. .TP \f[V]-XX:+ScavengeBeforeFullGC\f[R] اجرای GC روی نسل جوان را پیش از هر full GC فعال می‌کند. این گزینه به طور پیش‌فرض فعال است. توصیه می‌شود آن را غیرفعال \f[I]نکنید\f[R]، زیرا پاک‌سازی نسل جوان پیش از یک full GC می‌تواند تعداد اشیاء قابل‌دسترس از فضای نسل قدیم به فضای نسل جوان را کاهش دهد. برای غیرفعال کردن GC روی نسل جوان پیش از هر full GC، گزینهٔ \f[V]-XX:-ScavengeBeforeFullGC\f[R] را مشخص کنید. .TP \f[V]-XX:SoftRefLRUPolicyMSPerMB=\f[R]\f[I]time\f[R] مدت زمانی (به میلی‌ثانیه) را تعیین می‌کند که یک شیء با ارجاع soft (ارجاع‌پذیر به صورت نرم) پس از آخرین باری که به آن ارجاع داده شده، در هیپ فعال نگه داشته می‌شود. مقدار پیش‌فرض، یک ثانیه طول عمر به ازای هر مگابایت فضای خالی در هیپ است. گزینهٔ \f[V]-XX:SoftRefLRUPolicyMSPerMB\f[R] مقادیر صحیحی را می‌پذیرد که نشان‌دهندهٔ میلی‌ثانیه به ازای هر یک مگابایت از اندازهٔ فعلی هیپ (برای Java HotSpot Client VM) یا حداکثر اندازهٔ ممکن هیپ (برای Java HotSpot Server VM) است. این تفاوت بدین معناست که Client VM تمایل دارد به جای گسترش هیپ، ارجاع‌های soft را تخلیه کند؛ در حالی که Server VM تمایل دارد به جای تخلیهٔ ارجاع‌های soft، هیپ را گسترش دهد. در حالت دوم، مقدار گزینهٔ \f[V]-Xmx\f[R] تأثیر چشمگیری بر سرعت بازیافت حافظهٔ ارجاع‌های soft دارد. .RS .PP مثال زیر نحوهٔ تنظیم این مقدار را بر روی ۲٫۵ ثانیه نشان می‌دهد: .PP \f[V]-XX:SoftRefLRUPolicyMSPerMB=2500\f[R] .RE .TP \f[V]-XX:-ShrinkHeapInSteps\f[R] اندازهٔ هیپ جاوا را به صورت تدریجی تا اندازهٔ هدف که توسط گزینهٔ \f[V]-XX:MaxHeapFreeRatio\f[R] مشخص شده است، کاهش می‌دهد. این گزینه به طور پیش‌فرض فعال است. در صورت غیرفعال شدن، به جای نیاز به چندین چرخهٔ بازیافت حافظه، اندازهٔ هیپ جاوا را فوراً به اندازهٔ هدف کاهش می‌دهد. اگر می‌خواهید اندازهٔ هیپ جاوا را به حداقل برسانید، این گزینه را غیرفعال کنید. هنگام غیرفعال بودن این گزینه، احتمالاً با افت کارایی مواجه خواهید شد. .RS.PP برای توضیحات مربوط به استفاده از گزینهٔ \f[V]MaxHeapFreeRatio\f[R] جهت کوچک نگه داشتن هیپ جاوا از طریق کاهش ردپای حافظه برای برنامه‌های توکار (embedded)، بخش \f[B]Performance Tuning Examples\f[R] را ببینید. .RE .TP \f[V]-XX:StringDeduplicationAgeThreshold=\f[R]\f[I]threshold\f[R] شیء‌های \f[V]String\f[R] را که به سن مشخص‌شده می‌رسند، به عنوان نامزدهای حذف داده‌های تکراری (deduplication) مشخص می‌کند. سن یک شیء معیاری است از تعداد دفعاتی که از فرایند زباله‌روبی (GC) جان سالم به در برده است. این مورد گاهی به عنوان ارتقای سنی (tenuring) نامیده می‌شود. .RS .RS .PP \f[B]نکته:\f[R] شیء‌های \f[V]String\f[R] که قبل از رسیدن به این سن به یک ناحیهٔ قدیمی هیپ ارتقا می‌یابند، همواره به عنوان نامزد deduplication در نظر گرفته می‌شوند. مقدار پیش‌فرض این گزینه \f[V]3\f[R] است. گزینهٔ \f[V]-XX:+UseStringDeduplication\f[R] را ببینید. .RE .RE .TP \f[V]-XX:SurvivorRatio=\f[R]\f[I]ratio\f[R] نسبت بین اندازهٔ فضای eden و فضای survivor را تنظیم می‌کند. این گزینه به طور پیش‌فرض روی 8 تنظیم شده است. مثال زیر نحوهٔ تنظیم نسبت فضای eden/survivor به 4 را نشان می‌دهد: .RS .RS .PP \f[V]-XX:SurvivorRatio=4\f[R] .RE .RE .TP \f[V]-XX:TargetSurvivorRatio=\f[R]\f[I]percent\f[R] درصد مورد نظر از فضای survivor (بین 0 تا 100) را که پس از زباله‌روبی نسل جوان استفاده می‌شود، تنظیم می‌کند. این گزینه به طور پیش‌فرض روی 50% تنظیم شده است. .RS .PP مثال زیر نحوهٔ تنظیم نسبت هدف فضای survivor به 30% را نشان می‌دهد: .RS .PP \f[V]-XX:TargetSurvivorRatio=30\f[R] .RE .RE .TP \f[V]-XX:TLABSize=\f[R]\f[I]size\f[R] اندازهٔ اولیه (به بایت) یک بافر تخصیص محلی ریسه (TLAB) را تنظیم می‌کند. حرف \f[V]k\f[R] یا \f[V]K\f[R] را برای مشخص کردن کیلوبایت، \f[V]m\f[R] یا \f[V]M\f[R] را برای مگابایت، یا \f[V]g\f[R] یا \f[V]G\f[R] را برای گیگابایت اضافه کنید. اگر این گزینه روی 0 تنظیم شود، JVM اندازهٔ اولیه را به طور خودکار انتخاب می‌کند. .RS .PP مثال زیر نحوهٔ تنظیم اندازهٔ اولیهٔ TLAB به 512 کیلوبایت را نشان می‌دهد: .RS .PP \f[V]-XX:TLABSize=512k\f[R] .RE .RE .TP \f[V]-XX:+UseAdaptiveSizePolicy\f[R] استفاده از تعیین اندازهٔ انطباقی نسل‌ها را فعال می‌کند. این گزینه به طور پیش‌فرض فعال است. برای غیرفعال کردن اندازه‌بندی انطباقی نسل‌ها، گزینهٔ \f[V]-XX:-UseAdaptiveSizePolicy\f[R] را مشخص کرده و اندازهٔ مخزن تخصیص حافظه را به طور صریح تعیین کنید. گزینهٔ \f[V]-XX:SurvivorRatio\f[R] را ببینید. .TP \f[V]-XX:+UseG1GC\f[R] استفاده از زباله‌روب Garbage-First (G1) را فعال می‌کند. این یک زباله‌روب سروری است که برای ماشین‌های چندپردازنده‌ای با مقدار حافظهٔ رم بالا هدف‌گذاری شده است. این گزینه اهداف زمان مکث GC را با احتمال بالا برآورده می‌سازد، در حالی که توان عملیاتی خوبی را حفظ می‌کند. زباله‌روب G1 برای برنامه‌هایی پیشنهاد می‌شود که نیازمند هیپ‌های بزرگ (اندازه‌های حدود 6 گیگابایت یا بزرگ‌تر) با الزامات محدود تأخیر GC (زمان مکث پایدار و قابل پیش‌بینی زیر 0.5 ثانیه) هستند. این گزینه به طور پیش‌فرض فعال است و G1 به عنوان زباله‌روب پیش‌فرض استفاده می‌شود. .TP \f[V]-XX:+UseGCOverheadLimit\f[R] سیاستی را فعال می‌کند که نسبت زمان صرف‌شده توسط JVM برای GC را قبل از پرتاب خطای \f[V]OutOfMemoryError\f[R] محدود می‌سازد. این گزینه به طور پیش‌فرض فعال است، و اگر بیش از 98% از کل زمان صرف زباله‌روبی شود و کمتر از 2% از هیپ بازیابی گردد، زباله‌روب موازی یک استثنای \f[V]OutOfMemoryError\f[R] صادر خواهد کرد. زمانی که هیپ کوچک است، از این ویژگی می‌توان برای جلوگیری از اجرای طولانی‌مدت برنامه‌ها با پیشرفت کم یا بدون پیشرفت استفاده کرد. برای غیرفعال کردن این گزینه، گزینهٔ \f[V]-XX:-UseGCOverheadLimit\f[R] را مشخص کنید. .TP \f[V]-XX:+UseNUMA\f[R] بهینه‌سازی کارایی برنامه را در رایانه‌ای با معماری حافظه ناهمگن (NUMA) از طریق افزایش بهره‌گیری برنامه از حافظه با تأخیر کمتر فعال می‌کند. این گزینه به طور پیش‌فرض غیرفعال است و هیچ بهینه‌سازی برای NUMA انجام نمی‌شود. این گزینه تنها زمانی در دسترس است که از زباله‌روب موازی (\f[V]-XX:+UseParallelGC\f[R]) استفاده شود. .TP \f[V]-XX:+UseParallelGC\f[R] استفاده از زباله‌روب موازی (parallel scavenge collector، مشهور به زباله‌روب توان عملیاتی) را فعال می‌کند تا با استفاده از پردازنده‌های متعدد، کارایی برنامهٔ شما را بهبود بخشد. .RS .PP این گزینه به طور پیش‌فرض غیرفعال است و از زباله‌روب پیش‌فرض استفاده می‌شود. .RE .TP \f[V]-XX:+UseSerialGC\f[R] استفاده از زباله‌روب ترتیبی (serial garbage collector) را فعال می‌کند. این گزینه عموماً بهترین انتخاب برای برنامه‌های کوچک و ساده‌ای است که به هیچ قابلیت خاصی در زباله‌روبی نیاز ندارند. این گزینه به طور پیش‌فرض غیرفعال است و از زباله‌روب پیش‌فرض استفاده می‌شود. .TP \f[V]-XX:+UseSHM\f[R] \f[B]فقط در لینوکس:\f[R] به JVM امکان می‌دهد از حافظهٔ اشتراکی برای راه‌اندازی صفحات بزرگ (large pages) استفاده کند. .RS .PP برای راه‌اندازی صفحات بزرگ، بخش \f[B]Large Pages\f[R] را ببینید. .RE .TP \f[V]-XX:+UseStringDeduplication\f[R] حذف رشته‌های تکراری (string deduplication) را فعال می‌کند. این گزینه به طور پیش‌فرض غیرفعال است. برای استفاده از این گزینه، باید زباله‌روب G1 را فعال کنید. .RS .PP حذف رشته‌های تکراری با بهره‌گیری از این واقعیت که بسیاری از شیء‌های \f[V]String\f[R] یکسان هستند، ردپای حافظهٔ شیء‌های \f[V]String\f[R] را در هیپ جاوا کاهش می‌دهد. به جای اینکه هر شیء \f[V]String\f[R] به آرایهٔ نویسه‌ای مختص خود اشاره کند، شیء‌های \f[V]String\f[R] همسان می‌توانند به همان آرایهٔ نویسه‌ای مشترک اشاره کنند. .RE .TP \f[V]-XX:+UseTLAB\f[R] استفاده از بلوک‌های تخصیص محلی ریسه (TLABها) را در فضای نسل جوان فعال می‌کند. این گزینه به طور پیش‌فرض فعال است. برای غیرفعال کردن استفاده از TLABها، گزینهٔ \f[V]-XX:-UseTLAB\f[R] را مشخص کنید. .TP \f[V]-XX:+UseZGC\f[R] استفاده از زباله‌روب Z (معروف به ZGC) را فعال می‌کند. این یک زباله‌روب با تأخیر پایین است که حداکثر زمان مکث در حد چند میلی‌ثانیه را با کمی کاهش در توان عملیاتی ارائه می‌دهد. زمان‌های مکث مستقل از اندازهٔ هیپ استفاده‌شده هستند. از هیپ‌هایی با اندازهٔ 8MB تا 16TB پشتیبانی می‌کند. .TP \f[V]-XX:ZAllocationSpikeTolerance=\f[R]\f[I]factor\f[R] میزان تحمل جهش تخصیص را برای ZGC تنظیم می‌کند. این گزینه به طور پیش‌فرض روی 2.0 تنظیم شده است. این ضریب، سطح جهش‌های مورد انتظار در تخصیص حافظه را مشخص می‌کند. برای مثال، استفاده از ضریب 3.0 به این معنی است که می‌توان انتظار داشت نرخ تخصیص در هر لحظه تا سه برابر افزایش یابد. .TP \f[V]-XX:ZCollectionInterval=\f[R]\f[I]seconds\f[R] حداکثر فاصلهٔ زمانی (به ثانیه) بین دو چرخهٔ GC را در هنگام استفاده از ZGC تعیین می‌کند. این گزینه به طور پیش‌فرض روی 0 (غیرفعال) تنظیم شده است. .TP \f[V]-XX:ZFragmentationLimit=\f[R]\f[I]percent\f[R] حداکثر قطعه‌قطعه شدن قابل‌قبول هیپ (به درصد) را برای ZGC مشخص می‌کند. این گزینه به طور پیش‌فرض روی 25 تنظیم شده است. استفاده از مقدار کمتر باعث می‌شود فشرده‌سازی هیپ تهاجمی‌تر انجام شود تا حافظهٔ بیشتری آزاد گردد، البته به بهای مصرف زمان بیشتر توسط پردازنده. .TP \f[V]-XX:+ZProactive\f[R] چرخه‌های پیش‌دستانهٔ GC را در هنگام استفاده از ZGC فعال می‌کند. این گزینه به طور پیش‌فرض فعال است. اگر انتظار برود که آغاز چرخهٔ زباله‌روبی کمترین تأثیر را روی برنامهٔ در حال اجرا داشته باشد، ZGC چرخهٔ پیش‌دستانه را آغاز می‌کند. این ویژگی زمانی کاربرد دارد که برنامه غالباً بیکار (idle) است یا اشیاء بسیار کمی تخصیص می‌دهد، اما شما همچنان می‌خواهید اندازهٔ هیپ را پایین نگه دارید و اجازه دهید پردازش ارجاعات انجام شود، حتی زمانی که فضای خالی زیادی روی هیپ وجود دارد. .TP \f[V]-XX:+ZUncommit\f[R] آزادسازی (uncommit) حافظهٔ استفاده‌نشدهٔ هیپ را هنگام استفاده از ZGC فعال می‌کند. این گزینه به طور پیش‌فرض فعال است. آزادسازی حافظهٔ استفاده‌نشدهٔ هیپ موجب کاهش ردپای حافظهٔ JVM شده و آن حافظه را برای سایر فرایندها در دسترس قرار می‌دهد. .TP \f[V]-XX:ZUncommitDelay=\f[R]\f[I]seconds\f[R] مدت زمانی (به ثانیه) را تعیین می‌کند که حافظهٔ هیپ قبل از آزادسازی (uncommit) باید بدون استفاده مانده باشد. این گزینه به طور پیش‌فرض روی 300 (5 دقیقه) تنظیم شده است. تخصیص قطعی (commit) و آزادسازی حافظه عملیات‌های نسبتاً هزینه‌بری هستند. استفاده از مقداری کمتر باعث می‌شود حافظهٔ هیپ زودتر آزاد شود، با این ریسک که ممکن است خیلی زود به تخصیص مجدد آن نیاز پیدا شود..SH "گزینه‌های منسوخ‌شده جاوا (DEPRECATED JAVA OPTIONS)" .PP این گزینه‌های \f[V]java\f[R] منسوخ شده‌اند و ممکن است در انتشارهای آیندهٔ JDK حذف شوند. این گزینه‌ها همچنان پذیرفته شده و اعمال می‌گردند، اما هنگام استفاده از آن‌ها هشداری صادر می‌شود. .TP \f[V]-Xfuture\f[R] بررسی‌های سخت‌گیرانهٔ قالب فایل‌های کلاس (class-file) را که انطباق دقیق با مشخصات قالب فایل‌های کلاس را الزام می‌کند، فعال می‌سازد. توسعه‌دهندگان هنگام توسعهٔ کدهای جدید باید از این پرچم استفاده کنند. ممکن است این بررسی‌های سخت‌گیرانه‌تر در انتشارهای آینده به حالت پیش‌فرض تبدیل شوند. .TP \f[V]-Xloggc:\f[R]\f[I]filename\f[R] فایلی را تنظیم می‌کند که اطلاعات تفصیلی رویدادهای GC باید برای ثبت در لاگ به آن هدایت شود. اگر هر دو گزینه با یک دستور java داده شوند، گزینهٔ \f[V]-Xloggc\f[R] بر \f[V]-verbose:gc\f[R] اولویت داشته و جایگزین آن می‌شود. گزینهٔ \f[V]-Xloggc:\f[R]\f[I]filename\f[R] با \f[V]-Xlog:gc:\f[R]\f[I]filename\f[R] جایگزین شده است. بخش Enable Logging with the JVM Unified Logging Framework را ببینید. .RS .PP مثال: .PP \f[V]-Xlog:gc:garbage-collection.log\f[R] .RE .TP \f[V]-XX:+FlightRecorder\f[R] استفاده از Java Flight Recorder (JFR) را در زمان اجرای برنامه فعال می‌کند. از نگارش JDK 8u40 به بعد، برای استفاده از JFR دیگر نیازی به این گزینه نیست. .TP \f[V]-XX:InitialRAMFraction=\f[R]\f[I]ratio\f[R] میزان حافظهٔ اولیه را که JVM ممکن است پیش از اعمال قواعد اکتشافی ارگونومی (ergonomics heuristics) برای هیپ جاوا استفاده کند، به عنوان نسبتی از حداکثر مقدار تعیین‌شده بر اساس توضیحات گزینهٔ \f[V]-XX:MaxRAM\f[R] تنظیم می‌کند. مقدار پیش‌فرض 64 است. .RS .PP به‌جای آن از گزینهٔ \f[V]-XX:InitialRAMPercentage\f[R] استفاده کنید. .RE .TP \f[V]-XX:MaxRAMFraction=\f[R]\f[I]ratio\f[R] حداکثر مقدار حافظه‌ای را که JVM ممکن است پیش از اعمال قواعد اکتشافی ارگونومی برای هیپ جاوا استفاده کند، به صورت کسری از حداکثر مقدار تعیین‌شده بر اساس توضیحات گزینهٔ \f[V]-XX:MaxRAM\f[R] تنظیم می‌کند. مقدار پیش‌فرض 4 است. .RS .PP مشخص کردن این گزینه، استفادهٔ خودکار از compressed oops را غیرفعال می‌کند اگر نتیجهٔ ترکیبی این گزینه و سایر گزینه‌های مؤثر بر حداکثر حافظه، بزرگ‌تر از محدودهٔ حافظهٔ قابل آدرس‌دهی توسط compressed oops باشد. برای اطلاعات بیشتر درباره compressed oops، به \f[V]-XX:UseCompressedOops\f[R] مراجعه کنید. .PP به‌جای آن از گزینهٔ \f[V]-XX:MaxRAMPercentage\f[R] استفاده کنید. .RE .TP \f[V]-XX:MinRAMFraction=\f[R]\f[I]ratio\f[R] حداکثر مقدار حافظه‌ای را که JVM ممکن است پیش از اعمال قواعد اکتشافی ارگونومی برای هیپ‌های کوچک جاوا استفاده کند، به عنوان کسری از حداکثر مقدار تعیین‌شده بر اساس توضیحات گزینهٔ \f[V]-XX:MaxRAM\f[R] تنظیم می‌کند. یک هیپ کوچک، هیپی با اندازهٔ تقریبی ۱۲۵ مگابایت است. مقدار پیش‌فرض 2 است. .RS .PP به‌جای آن از گزینهٔ \f[V]-XX:MinRAMPercentage\f[R] استفاده کنید. .RE .SH "گزینه‌های از رده خارج جاوا (OBSOLETE JAVA OPTIONS)" .PP این گزینه‌های \f[V]java\f[R] همچنان پذیرفته می‌شوند اما نادیده گرفته خواهند شد، و در صورت استفاده از آن‌ها هشداری صادر می‌شود. .TP \f[V]--illegal-access=\f[R]\f[I]parameter\f[R] ویژگی \f[I]relaxed strong encapsulation\f[R] را کنترل می‌کرد، همان‌گونه که در \f[B]JEP 261\f[R] [https://openjdk.org/jeps/261#Relaxed-strong-encapsulation] تعریف شده است. این گزینه در JDK 16 توسط \f[B]JEP 396\f[R] [https://openjdk.org/jeps/396] منسوخ گردید و در JDK 17 با \f[B]JEP 403\f[R] [https://openjdk.org/jeps/403] از رده خارج شد. .SH "گزینه‌های حذف‌شده جاوا (REMOVED JAVA OPTIONS)" .PP این گزینه‌های \f[V]java\f[R] در JDK 21 حذف شده‌اند و استفاده از آن‌ها منجر به خطای زیر می‌شود: .RS .PP \f[V]Unrecognized VM option\f[R] \f[I]option-name\f[R] .RE .TP \f[V]-XX:+ExtendedDTraceProbes\f[R] \f[B]لینوکس و macOS:\f[R] کاوشگرهای اضافی ابزار \f[V]dtrace\f[R] را که بر کارایی تأثیر می‌گذارند، فعال می‌کند. به‌طور پیش‌فرض این گزینه غیرفعال است و \f[V]dtrace\f[R] تنها کاوشگرهای استاندارد را انجام می‌دهد. به‌جای آن از ترکیب این پرچم‌ها استفاده کنید: \f[V]-XX:+DTraceMethodProbes\f[R]، \f[V]-XX:+DTraceAllocProbes\f[R]، \f[V]-XX:+DTraceMonitorProbes\f[R]. .PP برای فهرست و توضیحات گزینه‌های حذف‌شده در نگارش‌های پیشین، بخش \f[I]Removed Java Options\f[R] را در منابع زیر ببینید: .IP \[bu] 2 \f[B]دستور \f[VB]java\f[B]، نگارش 20\f[R] [https://docs.oracle.com/en/java/javase/20/docs/specs/man/java.html] .IP \[bu] 2 \f[B]دستور \f[VB]java\f[B]، نگارش 19\f[R] [https://docs.oracle.com/en/java/javase/19/docs/specs/man/java.html] .IP \[bu] 2 \f[B]دستور \f[VB]java\f[B]، نگارش 18\f[R] [https://docs.oracle.com/en/java/javase/18/docs/specs/man/java.html] .IP \[bu] 2 \f[B]دستور \f[VB]java\f[B]، نگارش 17\f[R] [https://docs.oracle.com/en/java/javase/17/docs/specs/man/java.html] .IP \[bu] 2 \f[B]دستور \f[VB]java\f[B]، نگارش 16\f[R] [https://docs.oracle.com/en/java/javase/16/docs/specs/man/java.html] .IP \[bu] 2 \f[B]دستور \f[VB]java\f[B]، نگارش 15\f[R] [https://docs.oracle.com/en/java/javase/15/docs/specs/man/java.html] .IP \[bu] 2 \f[B]دستور \f[VB]java\f[B]، نگارش 14\f[R] [https://docs.oracle.com/en/java/javase/14/docs/specs/man/java.html] .IP \[bu] 2 \f[B]دستور \f[VB]java\f[B]، نگارش 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، نگارش 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، نگارش 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، نگارش 10\f[R] [https://docs.oracle.com/javase/10/tools/java.htm#JSWOR624] .IP \[bu] 2 \f[B]مرجع ابزارهای Java Platform, Standard Edition، نگارش 9\f[R] [https://docs.oracle.com/javase/9/tools/java.htm#JSWOR624] .IP \[bu] 2 \f[B]مرجع ابزارهای Java Platform, Standard Edition، نگارش 8 برای Oracle JDK در 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، نگارش 8 برای Oracle JDK در Solaris، Linux و macOS\f[R] [https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BGBCIEFC].SH "فایل‌های آرگومان خط فرمان جاوا (JAVA COMMAND-LINE ARGUMENT FILES)" .PP شما می‌توانید با استفاده از فایل‌های آرگومان \f[V]\[at]\f[R]، دستور \f[V]java\f[R] را کوتاه یا ساده‌تر کنید؛ بدین صورت که یک یا چند فایل متنی شامل آرگومان‌ها، مانند گزینه‌ها و نام‌های کلاس‌ها را که قرار است به دستور \f[V]java\f[R] ارسال شوند، مشخص نمایید. این قابلیت به شما امکان می‌دهد دستورهای \f[V]java\f[R] با هر طولی را در هر سیستم‌عاملی بسازید. .PP در خط فرمان، از پیشوند علامت ات‌ساین (\f[V]\[at]\f[R]) برای مشخص کردن یک فایل آرگومان حاوی گزینه‌ها و نام‌های کلاس \f[V]java\f[R] استفاده کنید. هنگامی که دستور \f[V]java\f[R] با فایلی مواجه می‌شود که با علامت ات‌ساین (\f[V]\[at]\f[R]) آغاز شده است، محتویات آن فایل را درست همانند زمانی که مستقیماً در خط فرمان مشخص شده باشند، به یک فهرست از آرگومان‌ها بسط می‌دهد. .PP اجراکنندهٔ \f[V]java\f[R] محتویات فایل آرگومان را تا زمانی که به گزینهٔ \f[V]--disable-\[at]files\f[R] برسد، بسط می‌دهد. شما می‌توانید از گزینهٔ \f[V]--disable-\[at]files\f[R] در هر کجای خط فرمان، از جمله درون یک فایل آرگومان، برای متوقف کردن بسط فایل‌های آرگومان \f[V]\[at]\f[R] استفاده کنید. .PP موارد زیر نحو و ساختار دستوری فایل‌های آرگومان \f[V]java\f[R] را شرح می‌دهند: .IP \[bu] 2 فایل آرگومان باید تنها شامل نویسه‌های ASCII یا نویسه‌هایی در کدگذاری پیش‌فرض سیستم باشد که با ASCII سازگار هستند، مانند UTF-8. .IP \[bu] 2 اندازهٔ فایل آرگومان نباید از MAXINT (۲٬۱۴۷٬۴۸۳٬۶۴۷) بایت تجاوز کند. .IP \[bu] 2 اجراکننده الگوهای عام (wildcards) موجود در یک فایل آرگومان را بسط نمی‌دهد. .IP \[bu] 2 از نویسه‌های فاصلهٔ خالی (white space) یا خط جدید (new line) برای جداسازی آرگومان‌های موجود در فایل استفاده کنید. .IP \[bu] 2 فاصلهٔ خالی شامل نویسهٔ فاصله، \f[V]\[rs]t\f[R]، \f[V]\[rs]n\f[R]، \f[V]\[rs]r\f[R] و \f[V]\[rs]f\f[R] است. .RS 2 .PP برای نمونه، ممکن است مسیری دارای فاصله باشد، مانند \f[V]c:\[rs]Program Files\f[R] که می‌توان آن را به صورت \f[V]\[dq]c:\[rs]\[rs]Program Files\[dq]\f[R] یا، برای جلوگیری از نویسهٔ گریز، به صورت \f[V]c:\[rs]Program\[dq] \[dq]Files\f[R] مشخص کرد. .RE .IP \[bu] 2 هر گزینه‌ای که حاوی فاصله باشد، مانند بخشی از یک مسیر، باید به طور کامل با استفاده از نویسه‌های نقل‌قول (\[aq]\[dq]\[aq]) درون گیومه قرار گیرد. .IP \[bu] 2 رشته‌ای که درون گیومه قرار دارد می‌تواند شامل نویسه‌های \f[V]\[rs]n\f[R]، \f[V]\[rs]r\f[R]، \f[V]\[rs]t\f[R] و \f[V]\[rs]f\f[R] باشد. این نویسه‌ها به کدهای ASCII متناظر خود تبدیل می‌شوند. .IP \[bu] 2 اگر نام یک فایل حاوی فاصله‌های درونی است، کل نام فایل را درون علامت نقل‌قول دوتایی (double quotation) قرار دهید. .IP \[bu] 2 نام‌های فایل در یک فایل آرگومان نسبت به دایرکتوری جاری سنجیده می‌شوند، نه نسبت به محل قرارگیری فایل آرگومان. .IP \[bu] 2 از علامت هش \f[V]#\f[R] در فایل آرگومان برای مشخص کردن توضیحات (کامنت‌ها) استفاده کنید. تمام نویسه‌های پس از \f[V]#\f[R] تا انتهای خط نادیده گرفته می‌شوند. .IP \[bu] 2 پیشوندهای اضافی علامت ات‌ساین \f[V]\[at]\f[R] برای گزینه‌هایی که خود پیشوند \f[V]\[at]\f[R] دارند به عنوان نویسهٔ گریز عمل می‌کنند (اولین \f[V]\[at]\f[R] حذف می‌شود و بقیهٔ آرگومان‌ها به صورت مستقیم و عینی به اجراکننده تحویل داده می‌شوند). .IP \[bu] 2 خطوط را می‌توان با استفاده از نویسهٔ ادامه (\f[V]\[rs]\f[R]) در انتهای خط، ادامه داد. دو خط به یکدیگر متصل می‌شوند در حالی که فاصله‌های خالی ابتدای خط بعد حذف می‌گردند. برای جلوگیری از حذف فاصله‌های خالی ابتدای خط، می‌توان یک نویسهٔ ادامه (\f[V]\[rs]\f[R]) را در ستون اول قرار داد. .IP \[bu] 2 از آنجا که بک‌اسلش (\[rs]) یک نویسهٔ گریز است، یک نویسهٔ بک‌اسلش باید با یک نویسهٔ بک‌اسلش دیگر گریز داده شود (escape شود). .IP \[bu] 2 نقل‌قول ناقص مجاز است و با رسیدن به انتهای فایل (end-of-file) بسته می‌شود. .IP \[bu] 2 یک نقل‌قول باز در انتهای خط پایان می‌یابد، مگر اینکه \f[V]\[rs]\f[R] آخرین نویسه باشد، که در این صورت با حذف تمامی نویسه‌های فاصلهٔ خالی ابتدای خط بعدی، به آن متصل می‌شود. .IP \[bu] 2 استفاده از نویسه‌های عام (*) در این فهرست‌ها مجاز نیست (مانند مشخص کردن \f[V]*.java\f[R]). .IP \[bu] 2 استفاده از علامت ات‌ساین (\f[V]\[at]\f[R]) برای تفسیر بازگشتی فایل‌ها پشتیبانی نمی‌شود. .SS "مثال نقل‌قول‌های باز یا ناقص در یک فایل آرگومان (Example of Open or Partial Quotes in an Argument File)" .PP در فایل آرگومان، .IP .nf \f[CB] -cp \[dq]lib/ cool/ app/ jars \f[R] .fi .PP این عبارت به این صورت تفسیر می‌شود: .RS .PP \f[V]-cp lib/cool/app/jars\f[R] .RE .SS "مثال نویسهٔ بک‌اسلش گریز داده شده با بک‌اسلش دیگر در فایل آرگومان (Example of a Backslash Character Escaped with Another Backslash Character in an Argument File)" .PP برای تولید خروجی زیر: .RS .PP \f[V]-cp c:\[rs]Program Files (x86)\[rs]Java\[rs]jre\[rs]lib\[rs]ext;c:\[rs]Program Files\[rs]Java\[rs]jre9\[rs]lib\[rs]ext\f[R] .RE .PP نویسهٔ بک‌اسلش باید در فایل آرگومان به این صورت مشخص شود: .RS .PP \f[V]-cp \[dq]c:\[rs]\[rs]Program Files (x86)\[rs]\[rs]Java\[rs]\[rs]jre\[rs]\[rs]lib\[rs]\[rs]ext;c:\[rs]\[rs]Program Files\[rs]\[rs]Java\[rs]\[rs]jre9\[rs]\[rs]lib\[rs]\[rs]ext\[dq]\f[R] .RE.SS مثالی از گریز EOL برای اجبار به الحاق خطوط در یک فایل آرگومان .PP در فایل آرگومان، .IP .nf \f[CB] -cp \[dq]/lib/cool app/jars:\[rs] /lib/another app/jars\[dq] \f[R] .fi .PP این دستور به صورت زیر تفسیر می‌شود: .RS .PP \f[V]-cp /lib/cool app/jars:/lib/another app/jars\f[R] .RE .SS مثالی از ادامه خط با فاصله‌های ابتدایی در یک فایل آرگومان .PP در فایل آرگومان، .IP .nf \f[CB] -cp \[dq]/lib/cool\[rs] \[rs]app/jars\[dq] \f[R] .fi .PP این دستور به این صورت تفسیر می‌شود: .PP \f[V]-cp /lib/cool app/jars\f[R] .SS مثال‌هایی از استفاده از یک فایل آرگومان تکی .PP می‌توانید از یک فایل آرگومان تکی، مانند \f[V]myargumentfile\f[R] در مثال زیر، برای نگهداری تمام آرگومان‌های لازم \f[V]java\f[R] استفاده کنید: .RS .PP \f[V]java \[at]myargumentfile\f[R] .RE .SS مثال‌هایی از استفاده از فایل‌های آرگومان دارای مسیر .PP می‌توانید مسیرهای نسبی را در فایل‌های آرگومان بگنجانید؛ با این حال، آن‌ها نسبت به دایرکتوری کاری فعلی سنجیده می‌شوند و نه نسبت به مسیرهای خود فایل‌های آرگومان. در مثال زیر، \f[V]path1/options\f[R] و \f[V]path2/options\f[R] بیانگر فایل‌های آرگومانی با مسیرهای مختلف هستند. هر مسیر نسبی موجود در آن‌ها نسبت به دایرکتوری کاری فعلی است و نه نسبت به فایل‌های آرگومان: .RS .PP \f[V]java \[at]path1/options \[at]path2/classes\f[R] .RE .SH "تحلیل وضعیت CODE HEAP (CODE HEAP STATE ANALYTICS)" .SS بررسی اجمالی (Overview) .PP مواقعی پیش می‌آید که داشتن بینشی نسبت به وضعیت فعلی code heap در JVM برای پاسخ به پرسش‌هایی مانند موارد زیر مفید خواهد بود: .IP \[bu] 2 چرا JIT خاموش شد و سپس مکرراً روشن گردید؟ .IP \[bu] 2 تمام فضای code heap کجا رفته است؟ .IP \[bu] 2 چرا پاک‌کنندهٔ متد (method sweeper) به‌صورت مؤثر کار نمی‌کند؟ .PP برای ایجاد این دیدگاه، قابلیت تحلیل وضعیت code heap پیاده‌سازی شده است که امکان تحلیل در لحظه و حین اجرای code heap را فراهم می‌سازد. فرآیند تحلیل به دو بخش تقسیم می‌شود. بخش اول کل code heap را بررسی کرده و تمام اطلاعاتی را که مفید یا مهم تلقی می‌شوند تجمیع می‌کند. بخش دوم شامل چندین گام مستقل است که اطلاعات جمع‌آوری‌شده را با تأکید بر جنبه‌های گوناگون داده‌ها چاپ می‌کنند. جمع‌آوری و چاپ داده‌ها بر پایهٔ «در صورت درخواست» (on request) صورت می‌گیرد. .SS نحو (Syntax) .PP درخواست‌های تحلیل آنی و در لحظه را می‌توان با دستور زیر صادر کرد: .RS .PP \f[V]jcmd\f[R] \f[I]pid\f[R] \f[V]Compiler.CodeHeap_Analytics\f[R] [\f[I]function\f[R]] [\f[I]granularity\f[R]] .RE .PP اگر تنها می‌خواهید بدانید وضعیت code heap پس از اجرای یک بار کاری نمونه به چه شکل درمی‌آید، می‌توانید از گزینهٔ خط فرمان زیر استفاده کنید: .RS .PP \f[V]-Xlog:codecache=Trace\f[R] .RE .PP برای مشاهده وضعیت code heap هنگامی که شرایط «CodeCache full» وجود دارد، VM را با این گزینهٔ خط فرمان راه‌اندازی کنید: .RS .PP \f[V]-Xlog:codecache=Debug\f[R] .RE .PP برای توضیحات دقیق در مورد قابلیت تحلیل وضعیت code heap، توابع پشتیبانی‌شده و گزینه‌های دانه‌بندی (granularity)، به \f[B]CodeHeap State Analytics (OpenJDK)\f[R] [https://bugs.openjdk.org/secure/attachment/75649/JVM_CodeHeap_StateAnalytics_V2.pdf] مراجعه کنید. .SH "فعال‌سازی گزارش‌گیری با چارچوب گزارش‌گیری یکپارچه JVM (ENABLE LOGGING WITH THE JVM UNIFIED LOGGING FRAMEWORK)" .PP برای پیکربندی یا فعال‌سازی گزارش‌گیری از طریق چارچوب گزارش‌گیری یکپارچهٔ ماشین مجازی جاوا (JVM)، از گزینهٔ \f[V]-Xlog\f[R] استفاده کنید. .SS خلاصه دستور (SYNOPSIS) .RS .PP \f[V]-Xlog\f[R][\f[V]:\f[R][\f[I]what\f[R]][\f[V]:\f[R][\f[I]output\f[R]][\f[V]:\f[R][\f[I]decorators\f[R]][\f[V]:\f[R]\f[I]output-options\f[R][\f[V],\f[R]...]]]]] .PP \f[V]-Xlog:\f[R]\f[I]directive\f[R] .RE .TP \f[I]what\f[R] ترکیبی از برچسب‌ها (tags) و سطوح (levels) را به فرم \f[I]tag1\f[R][\f[V]+\f[R]\f[I]tag2\f[R]...][\f[V]*\f[R]][\f[V]=\f[R]\f[I]level\f[R]][\f[V],\f[R]...] مشخص می‌کند. تنها در صورتی که نویسهٔ عام (\f[V]*\f[R]) مشخص نشده باشد، فقط پیام‌های گزارشی که دقیقاً با برچسب‌های مشخص‌شده برچسب‌گذاری شده باشند مطابقت داده می‌شوند. بخش \f[B]-Xlog Tags and Levels\f[R] را ببینید. .TP \f[I]output\f[R] نوع خروجی را تعیین می‌کند. در صورت حذف نوع \f[I]output\f[R]، مقدار پیش‌فرض \f[V]stdout\f[R] خواهد بود. بخش \f[B]-Xlog Output\f[R] را ببینید. .TP \f[I]decorators\f[R] خروجی را برای استفاده از مجموعه‌ای سفارشی از تزیین‌کننده‌ها (decorators) پیکربندی می‌کند. در صورت حذف \f[I]decorators\f[R]، مقادیر پیش‌فرض \f[V]uptime\f[R]، \f[V]level\f[R] و \f[V]tags\f[R] خواهند بود. بخش \f[B]Decorations\f[R] را ببینید. .TP \f[I]output-options\f[R] گزینه‌های خروجی گزارش‌گیری \f[V]-Xlog\f[R] را تعیین می‌کند. .TP \f[I]directive\f[R] یک گزینهٔ سراسری یا زیردستور: help، disable، async.SS توضیحات (Description) .PP چارچوب یکپارچه لاگ‌گیری ماشین مجازی جاوا (JVM) یک سیستم لاگ‌گیری مشترک را برای تمامی مؤلفه‌های JVM فراهم می‌کند. لاگ‌گیری GC در JVM تغییر یافته است تا از این چارچوب لاگ‌گیری جدید استفاده کند. نگاشت پرچم‌های قدیمی GC به پیکربندی جدید متناظر در Xlog در \f[B]Convert GC Logging Flags to Xlog\f[R] شرح داده شده است. علاوه بر این، لاگ‌گیری زمان اجرا (runtime) نیز برای استفاده از چارچوب یکپارچه لاگ‌گیری JVM تغییر کرده است. نگاشت پرچم‌های قدیمی لاگ‌گیری زمان اجرا به پیکربندی جدید متناظر در Xlog در \f[B]Convert Runtime Logging Flags to Xlog\f[R] شرح داده شده است. .PP موارد زیر مرجع سریعی برای دستور \f[V]-Xlog\f[R] و نحو گزینه‌ها ارائه می‌دهد: .TP \f[V]-Xlog\f[R] لاگ‌گیری JVM را در سطح \f[V]info\f[R] فعال می‌کند. .TP \f[V]-Xlog:help\f[R] نحو استفاده از \f[V]-Xlog\f[R] و برچسب‌ها، سطوح و آراسته‌گرهای (decorators) موجود را همراه با خط فرمان‌های نمونه و توضیحات چاپ می‌کند. .TP \f[V]-Xlog:disable\f[R] تمام لاگ‌گیری‌ها را غیرفعال کرده و همه پیکربندی‌های چارچوب لاگ‌گیری، شامل پیکربندی پیش‌فرض برای هشدارها و خطاها را پاک می‌کند. .TP \f[V]-Xlog\f[R][\f[V]:\f[R]\f[I]option\f[R]] چندین آرگومان را به ترتیبی که در خط فرمان ظاهر می‌شوند اعمال می‌کند. چندین آرگومان \f[V]-Xlog\f[R] برای یک خروجی یکسان، یکدیگر را بر اساس ترتیب داده‌شده بازنویسی می‌کنند. .RS .PP مؤلفه \f[I]option\f[R] به صورت زیر تنظیم می‌شود: .RS .PP [\f[I]tag-selection\f[R]][\f[V]:\f[R][\f[I]output\f[R]][\f[V]:\f[R][\f[I]decorators\f[R]][\f[V]:\f[R]\f[I]output-options\f[R]]]] .RE .PP حذف \f[I]tag-selection\f[R]، مجموعه برچسب پیش‌فرض را روی \f[V]all\f[R] و سطح را روی \f[V]info\f[R] قرار می‌دهد. .RS .PP \f[I]tag\f[R][\f[V]+\f[R]...] \f[V]all\f[R] .RE .PP برچسب \f[V]all\f[R] یک برچسب متا (meta tag) متشکل از تمامی مجموعه‌های برچسب در دسترس است. ستاره \f[V]*\f[R] در تعریف یک مجموعه برچسب، نشان‌دهنده تطبیق با نویسه عام (wildcard) است. تطبیق با نویسه عام، تمامی مجموعه‌های برچسبی را انتخاب می‌کند که \f[I]دست‌کم\f[R] شامل برچسب‌های مشخص‌شده باشند. بدون نویسه عام، تنها تطابق‌های دقیق مجموعه‌های برچسب مشخص‌شده انتخاب می‌شوند. .PP مؤلفه \f[I]output-options\f[R] به صورت زیر است: .RS .PP \f[V]filecount=\f[R]\f[I]file-count\f[R] \f[V]filesize=\f[R]\f[I]اندازه فایل با پسوند اختیاری K، M یا G\f[R] \f[V]foldmultilines=\f[R]\f[I]\f[R] .RE .PP هنگامی که \f[V]foldmultilines\f[R] برابر با true باشد، رویداد لاگی که شامل چند سطر است، با جایگزینی نویسه‌های خط جدید با توالی \f[V]\[aq]\[rs]\[aq]\f[R] و \f[V]\[aq]n\[aq]\f[R] در خروجی، در یک سطر ادغام خواهد شد. نویسه‌های تک‌بک‌اسلش موجود نیز با توالی دو بک‌اسلش جایگزین می‌شوند تا تبدیل برگشت‌پذیر باشد. استفاده از این گزینه با کدگذاری نویسه UTF-8 ایمن است، اما سایر کدگذاری‌ها ممکن است به درستی کار نکنند. برای نمونه، ممکن است توالی‌های چندبایتی در Shift JIS و BIG5 را به اشتباه تبدیل کند. .RE .SS پیکربندی پیش‌فرض (Default Configuration) .PP هنگامی که در خط فرمان تنها گزینه \f[V]-Xlog\f[R] و هیچ چیز دیگری مشخص نشده باشد، از پیکربندی پیش‌فرض استفاده می‌شود. پیکربندی پیش‌فرض، صرف نظر از اینکه پیام به چه برچسب‌هایی مرتبط است، تمامی پیام‌های دارای سطح متناظر با warning یا error را لاگ می‌کند. پیکربندی پیش‌فرض معادل وارد کردن دستور زیر در خط فرمان است: .RS .PP \f[V]-Xlog:all=warning:stdout:uptime,level,tags\f[R] .RE .SS کنترل لاگ‌گیری در زمان اجرا (Controlling Logging at Runtime) .PP لاگ‌گیری می‌تواند در زمان اجرا از طریق دستورهای تشخیصی (با ابزار \f[B]jcmd\f[R]) نیز کنترل شود. هر آنچه را که می‌توان در خط فرمان مشخص کرد، می‌توان به صورت پویا با دستور \f[V]VM.log\f[R] نیز تعیین نمود. از آنجا که دستورهای تشخیصی به‌طور خودکار در قالب MBeanها ارائه می‌شوند، می‌توانید از JMX برای تغییر پیکربندی لاگ‌گیری در زمان اجرا استفاده کنید. .SS برچسب‌ها و سطوح -Xlog (-Xlog Tags and Levels) .PP هر پیام لاگ دارای یک سطح و یک مجموعه برچسب مرتبط است. سطح پیام نشان‌دهنده میزان جزئیات آن است، و مجموعه برچسب مشخص می‌کند که پیام شامل چه مواردی است یا به کدام مؤلفه JVM مربوط می‌شود (مانند \f[V]gc\f[R]، \f[V]jit\f[R]، یا \f[V]os\f[R]). نگاشت پرچم‌های GC به پیکربندی Xlog در \f[B]Convert GC Logging Flags to Xlog\f[R] شرح داده شده است. نگاشت پرچم‌های قدیمی لاگ‌گیری زمان اجرا به پیکربندی متناظر در Xlog در \f[B]Convert Runtime Logging Flags to Xlog\f[R] شرح داده شده است. .PP \f[B]سطوح لاگ موجود:\f[R] .IP \[bu] 2 \f[V]off\f[R] .IP \[bu] 2 \f[V]trace\f[R] .IP \[bu] 2 \f[V]debug\f[R] .IP \[bu] 2 \f[V]info\f[R] .IP \[bu] 2 \f[V]warning\f[R] .IP \[bu] 2 \f[V]error\f[R] .PP \f[B]برچسب‌های لاگ موجود:\f[R] .PP ده‌ها برچسب لاگ وجود دارد که در ترکیب‌های مناسب، طیف گسترده‌ای از خروجی‌های لاگ را فراهم می‌کنند. مجموعه کامل برچسب‌های لاگ در دسترس را می‌توان با استفاده از \f[V]-Xlog:help\f[R] مشاهده کرد. مشخص کردن \f[V]all\f[R] به جای یک ترکیب برچسب، با تمامی ترکیب‌های برچسب مطابقت خواهد داشت..SS خروجی -Xlog .PP گزینهٔ \f[V]-Xlog\f[R] از انواع خروجی‌های زیر پشتیبانی می‌کند: .IP \[bu] 2 \f[V]stdout\f[R] --- ارسال خروجی به stdout .IP \[bu] 2 \f[V]stderr\f[R] --- ارسال خروجی به stderr .IP \[bu] 2 \f[V]file=\f[R]\f[I]filename\f[R] --- ارسال خروجی به فایل(های) متنی. .PP هنگام استفاده از \f[V]file=\f[R]\f[I]filename\f[R]، مشخص کردن \f[V]%p\f[R] و/یا \f[V]%t\f[R] در نام فایل، به‌ترتیب به PID و برچسب زمانی راه‌اندازی JVM بسط می‌یابد. همچنین می‌توانید فایل‌های متنی را برای مدیریت چرخش فایل (rotation) بر اساس اندازهٔ فایل و تعداد فایل‌ها جهت چرخش پیکربندی کنید. برای نمونه، جهت چرخش فایل لاگ در هر ۱۰ مگابایت و نگه‌داشتن ۵ فایل در چرخه، گزینه‌های \f[V]filesize=10M, filecount=5\f[R] را مشخص کنید. اندازهٔ هدف فایل‌ها تضمین نمی‌شود که دقیق باشد و صرفاً یک مقدار تقریبی است. فایل‌ها به‌طور پیش‌فرض تا ۵ فایل چرخشی با اندازهٔ هدف ۲۰ مگابایت چرخانده می‌شوند، مگر اینکه خلاف آن پیکربندی شده باشد. مشخص کردن \f[V]filecount=0\f[R] به این معنی است که فایل لاگ نباید چرخانده شود. در این صورت، احتمال رونویسی شدن فایل لاگ از پیش موجود وجود دارد. .SS حالت خروجی -Xlog .PP به‌طور پیش‌فرض، پیام‌های ثبت وقایع به‌صورت هم‌گام (synchronous) خروجی داده می‌شوند؛ هر پیام لاگ هنگام فراخوانی ثبت، در خروجی تعیین‌شده نوشته می‌شود. اما در عوض می‌توانید با مشخص کردن عبارت زیر از حالت لاگ‌گیری ناهمگام (asynchronous) استفاده کنید: .TP \f[V]-Xlog:async\f[R] نوشتن تمام لاگ‌ها به‌صورت ناهمگام. .PP در حالت ثبت وقایع ناهمگام، محل‌های لاگ‌گیری همهٔ پیام‌ها را در یک بافر میانی صف‌بندی می‌کنند و یک ریسهٔ (thread) مستقل مسئول تخلیهٔ (flush) آن‌ها در خروجی‌های مربوطه است. بافر میانی محدود است و در صورت پر شدن بافر، پیامی که در صف قرار می‌گیرد دور ریخته می‌شود. عملیات نوشتن ورودی‌های لاگ تضمین‌شده بدون انسداد (non-blocking) هستند. .PP گزینهٔ \f[V]-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[V]decorators\f[R] به‌طور پیش‌فرض مقادیر \f[V]uptime\f[R]، \f[V]level\f[R] و \f[V]tags\f[R] را در نظر می‌گیرد. تزئین‌کنندهٔ \f[V]none\f[R] ویژه است و برای غیرفعال کردن همهٔ تزئین‌ها به کار می‌رود. .PP تزئین‌کننده‌های \f[V]time\f[R] (\f[V]t\f[R])، \f[V]utctime\f[R] (\f[V]utc\f[R])، \f[V]uptime\f[R] (\f[V]u\f[R])، \f[V]timemillis\f[R] (\f[V]tm\f[R])، \f[V]uptimemillis\f[R] (\f[V]um\f[R])، \f[V]timenanos\f[R] (\f[V]tn\f[R])، \f[V]uptimenanos\f[R] (\f[V]un\f[R])، \f[V]hostname\f[R] (\f[V]hn\f[R])، \f[V]pid\f[R] (\f[V]p\f[R])، \f[V]tid\f[R] (\f[V]ti\f[R])، \f[V]level\f[R] (\f[V]l\f[R]) و \f[V]tags\f[R] (\f[V]tg\f[R]) را می‌توان برای نداشتن هیچ تزئینی به‌صورت \f[V]none\f[R] نیز مشخص کرد. .PP تزئین‌های پیام‌های ثبت وقایع .TS tab(@); lw(14.9n) lw(55.1n). T{ تزئین‌ها T}@T{ توضیحات T} _ T{ \f[V]time\f[R] یا \f[V]t\f[R] T}@T{ زمان و تاریخ جاری در قالب ISO-8601. T} T{ \f[V]utctime\f[R] یا \f[V]utc\f[R] T}@T{ ساعت هماهنگ جهانی (UTC). T} T{ \f[V]uptime\f[R] یا \f[V]u\f[R] T}@T{ زمان سپری‌شده از راه‌اندازی JVM بر حسب ثانیه و میلی‌ثانیه. برای نمونه، 6.567s. T} T{ \f[V]timemillis\f[R] یا \f[V]tm\f[R] T}@T{ همان مقدار تولیدشده توسط \f[V]System.currentTimeMillis()\f[R]. T} T{ \f[V]uptimemillis\f[R] یا \f[V]um\f[R] T}@T{ میلی‌ثانیه‌های سپری‌شده از راه‌اندازی JVM. T} T{ \f[V]timenanos\f[R] یا \f[V]tn\f[R] T}@T{ همان مقدار تولیدشده توسط \f[V]System.nanoTime()\f[R]. T} T{ \f[V]uptimenanos\f[R] یا \f[V]un\f[R] T}@T{ نانوثانیه‌های سپری‌شده از راه‌اندازی JVM. T} T{ \f[V]hostname\f[R] یا \f[V]hn\f[R] T}@T{ نام میزبان (hostname). T} T{ \f[V]pid\f[R] یا \f[V]p\f[R] T}@T{ شناسهٔ فرایند. T} T{ \f[V]tid\f[R] یا \f[V]ti\f[R] T}@T{ شناسهٔ ریسه. T} T{ \f[V]level\f[R] یا \f[V]l\f[R] T}@T{ سطح مرتبط با پیام لاگ. T} T{ \f[V]tags\f[R] یا \f[V]tg\f[R] T}@T{ مجموعه برچسب‌های مرتبط با پیام لاگ. T} .TE.SS تبدیل پرچم‌های ثبت وقایع GC به Xlog .PP نگاشت پرچم‌های قدیمی ثبت وقایع GC به پیکربندی Xlog .TS tab(@); lw(22.4n) lw(16.5n) lw(31.2n). T{ پرچم قدیمی Garbage Collection (GC) T}@T{ پیکربندی Xlog T}@T{ توضیح T} _ T{ \f[V]G1PrintHeapRegions\f[R] T}@T{ \f[V]-Xlog:gc+region=trace\f[R] T}@T{ قابل اعمال نیست T} T{ \f[V]GCLogFileSize\f[R] T}@T{ هیچ پیکربندی‌ای در دسترس نیست T}@T{ چرخش لاگ توسط چارچوب مدیریت می‌شود. T} T{ \f[V]NumberOfGCLogFiles\f[R] T}@T{ قابل اعمال نیست T}@T{ چرخش لاگ توسط چارچوب مدیریت می‌شود. T} T{ \f[V]PrintAdaptiveSizePolicy\f[R] T}@T{ \f[V]-Xlog:gc+ergo*=\f[R]\f[I]level\f[R] T}@T{ برای اکثر اطلاعات از یک \f[I]level\f[R] با مقدار \f[V]debug\f[R]، یا برای تمام آنچه که برای \f[V]PrintAdaptiveSizePolicy\f[R] ثبت می‌شد از یک \f[I]level\f[R] با مقدار \f[V]trace\f[R] استفاده کنید. T} T{ \f[V]PrintGC\f[R] T}@T{ \f[V]-Xlog:gc\f[R] T}@T{ قابل اعمال نیست T} T{ \f[V]PrintGCApplicationConcurrentTime\f[R] T}@T{ \f[V]-Xlog:safepoint\f[R] T}@T{ توجه داشته باشید که \f[V]PrintGCApplicationConcurrentTime\f[R] و \f[V]PrintGCApplicationStoppedTime\f[R] روی همان تگ ثبت می‌شوند و در سامانه جدید ثبت وقایع از هم جدا نیستند. T} T{ \f[V]PrintGCApplicationStoppedTime\f[R] T}@T{ \f[V]-Xlog:safepoint\f[R] T}@T{ توجه داشته باشید که \f[V]PrintGCApplicationConcurrentTime\f[R] و \f[V]PrintGCApplicationStoppedTime\f[R] روی همان تگ ثبت می‌شوند و در سامانه جدید ثبت وقایع از هم جدا نیستند. T} T{ \f[V]PrintGCCause\f[R] T}@T{ قابل اعمال نیست T}@T{ علت GC اکنون همیشه ثبت می‌شود. T} T{ \f[V]PrintGCDateStamps\f[R] T}@T{ قابل اعمال نیست T}@T{ برچسب‌های تاریخ توسط چارچوب ثبت می‌شوند. T} T{ \f[V]PrintGCDetails\f[R] T}@T{ \f[V]-Xlog:gc*\f[R] T}@T{ قابل اعمال نیست T} T{ \f[V]PrintGCID\f[R] T}@T{ قابل اعمال نیست T}@T{ شناسه GC اکنون همیشه ثبت می‌شود. T} T{ \f[V]PrintGCTaskTimeStamps\f[R] T}@T{ \f[V]-Xlog:gc+task*=debug\f[R] T}@T{ قابل اعمال نیست T} T{ \f[V]PrintGCTimeStamps\f[R] T}@T{ قابل اعمال نیست T}@T{ برچسب‌های زمانی توسط چارچوب ثبت می‌شوند. T} T{ \f[V]PrintHeapAtGC\f[R] T}@T{ \f[V]-Xlog:gc+heap=trace\f[R] T}@T{ قابل اعمال نیست T} T{ \f[V]PrintReferenceGC\f[R] T}@T{ \f[V]-Xlog:gc+ref*=debug\f[R] T}@T{ توجه داشته باشید که در ثبت وقایع قدیمی، \f[V]PrintReferenceGC\f[R] تنها در صورتی اثر داشت که \f[V]PrintGCDetails\f[R] نیز فعال شده باشد. T} T{ \f[V]PrintStringDeduplicationStatistics\f[R] T}@T{ \[ga]-Xlog:gc+stringdedup*=debug T}@T{ \[ga] قابل اعمال نیست T} T{ \f[V]PrintTenuringDistribution\f[R] T}@T{ \f[V]-Xlog:gc+age*=\f[R]\f[I]level\f[R] T}@T{ برای بیشترین اطلاعات مرتبط از یک \f[I]level\f[R] با مقدار \f[V]debug\f[R]، یا برای تمام آنچه که برای \f[V]PrintTenuringDistribution\f[R] ثبت می‌شد از یک \f[I]level\f[R] با مقدار \f[V]trace\f[R] استفاده کنید. T} T{ \f[V]UseGCLogFileRotation\f[R] T}@T{ قابل اعمال نیست T}@T{ آنچه که برای \f[V]PrintTenuringDistribution\f[R] ثبت می‌شد. T} .TE.SS تبدیل پرچم‌های وقایع‌نگاری زمان اجرا به Xlog .PP این پرچم‌های قدیمی دیگر شناخته نمی‌شوند و در صورت استفادهٔ مستقیم باعث خطا خواهند شد. در عوض از معادل وقایع‌نگاری یکپارچهٔ (unified logging) آن‌ها استفاده کنید. .PP نگاشت پرچم‌های وقایع‌نگاری زمان اجرا به پیکربندی Xlog .TS tab(@); lw(15.0n) lw(20.2n) lw(34.7n). T{ پرچم زمان اجرای قدیمی T}@T{ پیکربندی Xlog T}@T{ توضیحات T} _ T{ \f[V]TraceExceptions\f[R] T}@T{ \f[V]-Xlog:exceptions=info\f[R] T}@T{ اعمال نمی‌شود T} T{ \f[V]TraceClassLoading\f[R] T}@T{ \f[V]-Xlog:class+load=\f[R]\f[I]level\f[R] T}@T{ برای اطلاعات معمولی از \f[I]level\f[R]=\f[V]info\f[R]، یا برای اطلاعات اضافی از \f[I]level\f[R]=\f[V]debug\f[R] استفاده کنید. در نحو Unified Logging، پرچم \f[V]-verbose:class\f[R] برابر با \f[V]-Xlog:class+load=info,class+unload=info\f[R] است. T} T{ \f[V]TraceClassLoadingPreorder\f[R] T}@T{ \f[V]-Xlog:class+preorder=debug\f[R] T}@T{ اعمال نمی‌شود T} T{ \f[V]TraceClassUnloading\f[R] T}@T{ \f[V]-Xlog:class+unload=\f[R]\f[I]level\f[R] T}@T{ برای اطلاعات معمولی از \f[I]level\f[R]=\f[V]info\f[R]، یا برای اطلاعات اضافی از \f[I]level\f[R]=\f[V]trace\f[R] استفاده کنید. در نحو Unified Logging، پرچم \f[V]-verbose:class\f[R] برابر با \f[V]-Xlog:class+load=info,class+unload=info\f[R] است. T} T{ \f[V]VerboseVerification\f[R] T}@T{ \f[V]-Xlog:verification=info\f[R] T}@T{ اعمال نمی‌شود T} T{ \f[V]TraceClassPaths\f[R] T}@T{ \f[V]-Xlog:class+path=info\f[R] T}@T{ اعمال نمی‌شود T} T{ \f[V]TraceClassResolution\f[R] T}@T{ \f[V]-Xlog:class+resolve=debug\f[R] T}@T{ اعمال نمی‌شود T} T{ \f[V]TraceClassInitialization\f[R] T}@T{ \f[V]-Xlog:class+init=info\f[R] T}@T{ اعمال نمی‌شود T} T{ \f[V]TraceLoaderConstraints\f[R] T}@T{ \f[V]-Xlog:class+loader+constraints=info\f[R] T}@T{ اعمال نمی‌شود T} T{ \f[V]TraceClassLoaderData\f[R] T}@T{ \f[V]-Xlog:class+loader+data=\f[R]\f[I]level\f[R] T}@T{ برای اطلاعات معمولی از \f[I]level\f[R]=\f[V]debug\f[R] یا برای اطلاعات اضافی از \f[I]level\f[R]=\f[V]trace\f[R] استفاده کنید. T} T{ \f[V]TraceSafepointCleanupTime\f[R] T}@T{ \f[V]-Xlog:safepoint+cleanup=info\f[R] T}@T{ اعمال نمی‌شود T} T{ \f[V]TraceSafepoint\f[R] T}@T{ \f[V]-Xlog:safepoint=debug\f[R] T}@T{ اعمال نمی‌شود T} T{ \f[V]TraceMonitorInflation\f[R] T}@T{ \f[V]-Xlog:monitorinflation=debug\f[R] T}@T{ اعمال نمی‌شود T} T{ \f[V]TraceRedefineClasses\f[R] T}@T{ \f[V]-Xlog:redefine+class*=\f[R]\f[I]level\f[R] T}@T{ سطوح \f[I]level\f[R]=\f[V]info\f[R]، \f[V]debug\f[R] و \f[V]trace\f[R] مقادیر فزاینده‌ای از اطلاعات را ارائه می‌دهند. T} .TE.SS مثال‌های کاربرد \-Xlog .PP موارد زیر مثال‌هایی از کاربرد \f[V]-Xlog\f[R] هستند. .TP \f[V]-Xlog\f[R] تمام پیام‌ها را با استفاده از سطح \f[V]info\f[R] و با تزیینات \f[V]uptime\f[R]، \f[V]levels\f[R] و \f[V]tags\f[R] در \f[V]stdout\f[R] ثبت می‌کند. این معادل استفاده از دستور زیر است: .RS .RS .PP \f[V]-Xlog:all=info:stdout:uptime,levels,tags\f[R] .RE .RE .TP \f[V]-Xlog:gc\f[R] پیام‌های دارای برچسب \f[V]gc\f[R] را با سطح \f[V]info\f[R] در \f[V]stdout\f[R] ثبت می‌کند. پیکربندی پیش‌فرض برای تمام پیام‌های دیگر در سطح \f[V]warning\f[R] همچنان برقرار است. .TP \f[V]-Xlog:gc,safepoint\f[R] پیام‌های دارای هر یک از برچسب‌های \f[V]gc\f[R] یا \f[V]safepoint\f[R] را با سطح \f[V]info\f[R] و تزیینات پیش‌فرض در \f[V]stdout\f[R] ثبت می‌کند. پیام‌هایی که همزمان هر دو برچسب \f[V]gc\f[R] و \f[V]safepoint\f[R] را دارند ثبت نخواهند شد. .TP \f[V]-Xlog:gc+ref=debug\f[R] پیام‌هایی را که همزمان هر دو برچسب \f[V]gc\f[R] و \f[V]ref\f[R] را دارند، با استفاده از سطح \f[V]debug\f[R] و تزیینات پیش‌فرض در \f[V]stdout\f[R] ثبت می‌کند. پیام‌هایی که تنها یکی از این دو برچسب را دارند ثبت نخواهند شد. .TP \f[V]-Xlog:gc=debug:file=gc.txt:none\f[R] پیام‌های دارای برچسب \f[V]gc\f[R] را با سطح \f[V]debug\f[R] و بدون هیچ تزیینی در فایلی به نام \f[V]gc.txt\f[R] ثبت می‌کند. پیکربندی پیش‌فرض برای تمام پیام‌های دیگر در سطح \f[V]warning\f[R] همچنان برقرار است. .TP \f[V]-Xlog:gc=trace:file=gctrace.txt:uptimemillis,pids:filecount=5,filesize=1024\f[R] پیام‌های دارای برچسب \f[V]gc\f[R] را با سطح \f[V]trace\f[R] در مجموعه‌ای چرخشی از ۵ فایل با اندازهٔ ۱ مگابایت با نام پایهٔ \f[V]gctrace.txt\f[R] ثبت کرده و از تزیینات \f[V]uptimemillis\f[R] و \f[V]pid\f[R] استفاده می‌کند. .RS .PP پیکربندی پیش‌فرض برای تمام پیام‌های دیگر در سطح \f[V]warning\f[R] همچنان برقرار است. .RE .TP \f[V]-Xlog:gc::uptime,tid\f[R] پیام‌های دارای برچسب \f[V]gc\f[R] را با سطح پیش‌فرض \[aq]info\[aq] در خروجی پیش‌فرض \f[V]stdout\f[R] ثبت کرده و از تزیینات \f[V]uptime\f[R] و \f[V]tid\f[R] استفاده می‌کند. پیکربندی پیش‌فرض برای تمام پیام‌های دیگر در سطح \f[V]warning\f[R] همچنان برقرار است. .TP \f[V]-Xlog:gc*=info,safepoint*=off\f[R] پیام‌های دارای دست‌کم برچسب \f[V]gc\f[R] را با استفاده از سطح \f[V]info\f[R] ثبت می‌کند، اما ثبت وقایع پیام‌های دارای برچسب \f[V]safepoint\f[R] را خاموش می‌کند. پیام‌هایی که هر دو برچسب \f[V]gc\f[R] و \f[V]safepoint\f[R] را دارند ثبت نخواهند شد. .TP \f[V]-Xlog:disable -Xlog:safepoint=trace:safepointtrace.txt\f[R] تمام ثبت وقایع، شامل هشدارها و خطاها را غیرفعال می‌کند و سپس ثبت پیام‌های دارای برچسب \f[V]safepoint\f[R] را با سطح \f[V]trace\f[R] در فایل \f[V]safepointtrace.txt\f[R] فعال می‌سازد. پیکربندی پیش‌فرض اعمال نمی‌شود، چرا که خط فرمان با \f[V]-Xlog:disable\f[R] آغاز شده است. .SS مثال‌های پیچیده از کاربرد \-Xlog .PP موارد زیر چند مثال پیچیده از به‌کارگیری گزینهٔ \f[V]-Xlog\f[R] را شرح می‌دهند. .TP \f[V]-Xlog:gc+class*=debug\f[R] پیام‌های دارای دست‌کم برچسب‌های \f[V]gc\f[R] و \f[V]class\f[R] را با استفاده از سطح \f[V]debug\f[R] در \f[V]stdout\f[R] ثبت می‌کند. پیکربندی پیش‌فرض برای تمام پیام‌های دیگر در سطح \f[V]warning\f[R] همچنان برقرار است. .TP \f[V]-Xlog:gc+meta*=trace,class*=off:file=gcmetatrace.txt\f[R] پیام‌های دارای دست‌کم برچسب‌های \f[V]gc\f[R] و \f[V]meta\f[R] را با سطح \f[V]trace\f[R] در فایل \f[V]metatrace.txt\f[R] ثبت می‌کند اما تمام پیام‌های دارای برچسب \f[V]class\f[R] را خاموش می‌نماید. پیام‌های دارای برچسب‌های \f[V]gc\f[R]، \f[V]meta\f[R] و \f[V]class\f[R] ثبت نخواهند شد زیرا \f[V]class*\f[R] روی off تنظیم شده است. پیکربندی پیش‌فرض برای تمام پیام‌های دیگر در سطح \f[V]warning\f[R] به جز مواردی که شامل \f[V]class\f[R] هستند برقرار است. .TP \f[V]-Xlog:gc+meta=trace\f[R] پیام‌هایی را که دقیقاً دارای برچسب‌های \f[V]gc\f[R] و \f[V]meta\f[R] هستند، با استفاده از سطح \f[V]trace\f[R] در \f[V]stdout\f[R] ثبت می‌کند. پیکربندی پیش‌فرض برای تمام پیام‌های دیگر در سطح \f[V]warning\f[R] همچنان برقرار است. .TP \f[V]-Xlog:gc+class+heap*=debug,meta*=warning,threads*=off\f[R] پیام‌های دارای دست‌کم برچسب‌های \f[V]gc\f[R]، \f[V]class\f[R] و \f[V]heap\f[R] را با سطح \f[V]trace\f[R] در \f[V]stdout\f[R] ثبت می‌کند اما پیام‌های دارای برچسب \f[V]meta\f[R] را تنها با سطح مربوطه ثبت می‌نماید. پیکربندی پیش‌فرض برای تمام پیام‌های دیگر در سطح \f[V]warning\f[R] به جز مواردی که شامل \f[V]threads\f[R] هستند برقرار است. .SH "اعتبارسنجی آرگومان‌های پرچم ماشین مجازی جاوا (VALIDATE JAVA VIRTUAL MACHINE FLAG ARGUMENTS)" .PP شما از مقادیر ارائه‌شده به تمامی پرچم‌های خط فرمان ماشین مجازی جاوا (JVM) برای اعتبارسنجی استفاده می‌کنید و اگر مقدار ورودی نامعتبر یا خارج از محدوده باشد، پیام خطای مناسبی نمایش داده می‌شود. .PP چه این مقادیر به‌صورت ارگونومیک، در خط فرمان، توسط یک ابزار ورودی یا از طریق APIها (برای مثال کلاس‌های موجود در بستهٔ \f[V]java.lang.management\f[R]) تنظیم شده باشند، مقادیر ارائه‌شده به تمامی پرچم‌های خط فرمان ماشین مجازی جاوا (JVM) اعتبارسنجی می‌شوند. ارگونومی در راهنمای Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide شرح داده شده است. .PP محدوده‌ها و قیود یا در زمان مقداردهی اولیهٔ JVM که تمامی پرچم‌ها مقدار می‌گیرند، یا هنگامی که مقدار یک پرچم در طول زمان اجرا تغییر می‌کند (برای مثال با استفاده از ابزار \f[V]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[V]-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 با این حال، استفاده از صفحات بزرگ می‌تواند تأثیر منفی بر عملکرد سیستم بگذارد. برای نمونه، هنگامی که مقدار زیادی از حافظه توسط یک برنامه پین (قفل) می‌شود، ممکن است کمبود حافظه معمولی ایجاد کند و باعث صفحه‌بندی (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 اگر خروجی شامل مواردی با پیشوند \[dq]Huge\[dq] باشد، سیستم شما از صفحات بزرگ پشتیبانی می‌کند. مقادیر ممکن است بسته به محیط متفاوت باشد. فیلد \f[V]Hugepagesize\f[R] اندازه پیش‌فرض صفحات بزرگ را در محیط شما نشان می‌دهد و سایر فیلدها جزئیات مربوط به صفحات بزرگِ این اندازه را نمایش می‌دهند. هسته‌های جدیدتر از چندین اندازه صفحه بزرگ پشتیبانی می‌کنند. برای فهرست کردن اندازه‌های صفحه پشتیبانی‌شده، این دستور را اجرا کنید: .IP .nf \f[CB] # ls /sys/kernel/mm/hugepages/ hugepages-1048576kB hugepages-2048kB \f[R] .fi .PP محیط بالا از صفحات بزرگ ۲ مگابایتی و ۱ گیگابایتی پشتیبانی می‌کند، اما آن‌ها باید پیکربندی شوند تا JVM بتواند از آن‌ها استفاده کند. هنگام استفاده از صفحات بزرگ و عدم فعال‌سازی صفحات عظیم شفاف (گزینه \f[V]-XX:+UseTransparentHugePages\f[R])، تعداد صفحات بزرگ باید از قبل تخصیص داده شود. برای نمونه، جهت فعال‌سازی ۸ گیگابایت حافظه با پشتیبانی صفحات بزرگ ۲ مگابایتی، با کاربر \f[V]root\f[R] وارد شوید و دستور زیر را اجرا کنید: .RS .PP \f[V]# echo 4096 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages\f[R] .RE .PP همواره توصیه می‌شود پس از درخواست، مقدار \f[V]nr_hugepages\f[R] را بررسی کنید تا مطمئن شوید هسته قادر به تخصیص تعداد صفحات بزرگ درخواستی بوده است. .PP هنگام استفاده از گزینه \f[V]-XX:+UseSHM\f[R] برای فعال‌سازی صفحات بزرگ، همچنین باید مطمئن شوید پارامتر \f[V]SHMMAX\f[R] طوری پیکربندی شده است که امکان تخصیص بخش‌های حافظه مشترک به اندازه کافی بزرگ را فراهم کند. برای مجاز کردن حداکثر یک بخش مشترک ۸ گیگابایتی، با کاربر \f[V]root\f[R] وارد شوید و دستور زیر را اجرا کنید: .RS .PP \f[V]# echo 8589934592 > /proc/sys/kernel/shmmax\f[R] .RE .PP در برخی محیط‌ها این کار ضروری نیست زیرا مقدار پیش‌فرض به اندازه کافی بزرگ است، اما اطمینان از اینکه مقدار به اندازه کافی بزرگ باشد تا میزان حافظه در نظر گرفته شده برای پشتیبانی توسط صفحات بزرگ را دربرگیرد، حائز اهمیت است. .RS .PP \f[B]نکته:\f[R] مقادیر موجود در \f[V]/proc\f[R] و \f[V]/sys\f[R] پس از راه‌اندازی مجدد سیستم بازنشانی می‌شوند، بنابراین ممکن است بخواهید آن‌ها را در یک اسکریپت مقداردهی اولیه (برای نمونه، \f[V]rc.local\f[R] یا \f[V]sysctl.conf\f[R]) تنظیم کنید. .RE .PP اگر پارامترهای هسته سیستم‌عامل را برای فعال کردن استفاده از صفحات بزرگ پیکربندی کنید، فرآیندهای جاوا ممکن است صفحات بزرگ را علاوه بر Java heap، برای سایر بخش‌های داخلی نیز تخصیص دهند، برای نمونه: .IP \[bu] 2 حافظه نهان کد (Code cache) .IP \[bu] 2 بیت‌مپ‌های نشانه‌گذاری (Marking bitmaps) .PP در نتیجه، اگر پارامتر \f[V]nr_hugepages\f[R] را برابر با اندازه Java heap پیکربندی کنید، همچنان ممکن است JVM در تخصیص heap با استفاده از صفحات بزرگ با شکست مواجه شود، زیرا سایر بخش‌ها مانند حافظه نهان کد (code cache) ممکن است از قبل برخی از صفحات بزرگ پیکربندی‌شده را مصرف کرده باشند. .SS "پشتیبانی از صفحات بزرگ در ویندوز (Large Pages Support for Windows)" .PP برای استفاده از پشتیبانی صفحات بزرگ در ویندوز، مدیر سیستم (administrator) ابتدا باید امتیازات بیشتری را به کاربری که برنامه را اجرا می‌کند اختصاص دهد: .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 توجه داشته باشید که این مراحل حتی در صورتی که مدیر سیستم (administrator) برنامه را اجرا کند نیز الزامی است، زیرا مدیران سیستم به طور پیش‌فرض امتیاز قفل کردن صفحات در حافظه را ندارند..SH "اشتراک‌گذاری داده‌های کلاس برنامه (APPLICATION CLASS DATA SHARING)" .PP قابلیت «اشتراک‌گذاری داده‌های کلاس برنامه» (AppCDS) کلاس‌های استفاده‌شده توسط برنامه‌های شما را در یک فایل بایگانی ذخیره می‌کند. از آنجا که این کلاس‌ها در قالبی ذخیره می‌شوند که می‌توانند بسیار سریع بارگذاری شوند (در مقایسه با کلاس‌های ذخیره‌شده در یک فایل JAR)، AppCDS می‌تواند زمان راه‌اندازی برنامه‌های شما را بهبود بخشد. علاوه بر این، AppCDS می‌تواند با به اشتراک گذاشتن بخش‌هایی از این کلاس‌ها بین چندین فرایند، ردپای حافظه زمان اجرا را کاهش دهد. .PP کلاس‌ها در بایگانی CDS در قالبی بهینه‌شده ذخیره می‌شوند که حدود ۲ تا ۵ برابر بزرگ‌تر از کلاس‌های ذخیره‌شده در فایل‌های JAR یا تصویر زمان اجرای JDK است. بنابراین، ایده مناسبی است که تنها آن دسته از کلاس‌هایی را بایگانی کنید که واقعاً توسط برنامه شما استفاده می‌شوند. این‌ها معمولاً تنها بخش کوچکی از تمام کلاس‌های موجود هستند. برای مثال، برنامه شما ممکن است تنها از چند API ارائه‌شده توسط یک کتابخانه بزرگ استفاده کند. .SS "استفاده از بایگانی‌های CDS" .PP به‌طور پیش‌فرض، در بیشتر توزیع‌های JDK، مگر اینکه \f[V]-Xshare:off\f[R] مشخص شده باشد، JVM با یک بایگانی CDS پیش‌فرض راه‌اندازی می‌شود که معمولاً در \f[V]JAVA_HOME/lib/server/classes.jsa\f[R] (یا در ویندوز \f[V]JAVA_HOME\[rs]bin\[rs]server\[rs]classes.jsa\f[R]) قرار دارد. این بایگانی حاوی حدود ۱۳۰۰ کلاس از کتابخانه‌های اصلی است که توسط بیشتر برنامه‌ها استفاده می‌شوند. .PP برای استفاده از CDS برای مجموعه دقیق کلاس‌های استفاده‌شده توسط برنامه خود، می‌توانید از گزینه \f[V]-XX:SharedArchiveFile\f[R] استفاده کنید که فرم کلی زیر را دارد: .RS .PP \f[V]-XX:SharedArchiveFile=:\f[R] .RE .IP \[bu] 2 بخش \f[V]\f[R] جایگزین بایگانی پیش‌فرض CDS می‌شود. .IP \[bu] 2 بخش \f[V]\f[R] کلاس‌های اضافی را فراهم می‌کند که می‌توانند علاوه بر کلاس‌های موجود در \f[V]\f[R] بارگذاری شوند. .IP \[bu] 2 در ویندوز، جداکننده مسیر فوق (\f[V]:\f[R]) باید با \f[V];\f[R] جایگزین شود. .PP (نام‌های \[dq]static\[dq] (ایستا) و \[dq]dynamic\[dq] (پویا) به دلایل تاریخی استفاده شده‌اند. تنها اهمیت آن‌ها این است که بایگانی \[dq]static\[dq] ابتدا بارگذاری می‌شود و بایگانی \[dq]dynamic\[dq] در مرتبه دوم بارگذاری می‌شود). .PP ماشین مجازی JVM می‌تواند حداکثر از دو بایگانی استفاده کند. برای استفاده از تنها یک \f[V]\f[R]، می‌توانید بخش \f[V]\f[R] را حذف کنید: .RS .PP \f[V]-XX:SharedArchiveFile=\f[R] .RE .PP برای سهولت، \f[V]\f[R] مکان \f[V]\f[R] را ثبت می‌کند. بنابراین، می‌توانید تنها با نوشتن مورد زیر، \f[V]\f[R] را حذف کنید: .RS .PP \f[V]-XX:SharedArchiveFile=\f[R] .RE .SS "ایجاد دستی بایگانی‌های CDS" .PP بایگانی‌های CDS را می‌توان با استفاده از چندین روش به‌صورت دستی ایجاد کرد: .IP \[bu] 2 \f[V]-Xshare:dump\f[R] .IP \[bu] 2 \f[V]-XX:ArchiveClassesAtExit\f[R] .IP \[bu] 2 \f[V]jcmd VM.cds\f[R] .PP یک عملیات مشترک در تمام این روش‌ها یک «اجرای آزمایشی» (\[dq]trial run\[dq]) است، که در آن برنامه را یک بار اجرا می‌کنید تا کلاس‌هایی که باید در بایگانی ذخیره شوند تعیین گردند. .SS "ایجاد یک فایل بایگانی CDS ایستا با -Xshare:dump" .PP مراحل زیر یک فایل بایگانی CDS ایستا ایجاد می‌کند که شامل تمام کلاس‌های استفاده‌شده توسط برنامه \f[V]test.Hello\f[R] است. .IP "1." 3 فهرستی از تمام کلاس‌های استفاده‌شده توسط برنامه \f[V]test.Hello\f[R] ایجاد کنید. دستور زیر فایلی به نام \f[V]hello.classlist\f[R] ایجاد می‌کند که حاوی فهرستی از تمام کلاس‌های استفاده‌شده توسط این برنامه است: .RS 4 .RS .PP \f[V]java -Xshare:off -XX:DumpLoadedClassList=hello.classlist -cp hello.jar test.Hello\f[R] .RE .PP مسیر کلاسی که توسط پارامتر \f[V]-cp\f[R] مشخص می‌شود باید تنها شامل فایل‌های JAR باشد. .RE .IP "2." 3 یک بایگانی ایستا به نام \f[V]hello.jsa\f[R] ایجاد کنید که حاوی تمام کلاس‌های موجود در \f[V]hello.classlist\f[R] باشد: .RS 4 .RS .PP \f[V]java -Xshare:dump -XX:SharedArchiveFile=hello.jsa -XX:SharedClassListFile=hello.classlist -cp hello.jar\f[R] .RE .RE .IP "3." 3 برنامه \f[V]test.Hello\f[R] را با بایگانی \f[V]hello.jsa\f[R] اجرا کنید: .RS 4 .RS .PP \f[V]java -XX:SharedArchiveFile=hello.jsa -cp hello.jar test.Hello\f[R] .RE .RE .IP "4." 3 \f[B]اختیاری\f[R] بررسی کنید که برنامه \f[V]test.Hello\f[R] از کلاس موجود در بایگانی اشتراکی \f[V]hello.jsa\f[R] استفاده می‌کند: .RS 4 .RS .PP \f[V]java -XX:SharedArchiveFile=hello.jsa -cp hello.jar -Xlog:class+load test.Hello\f[R] .RE .PP خروجی این دستور باید شامل متن زیر باشد: .RS .PP \f[V][info][class,load] test.Hello source: shared objects file\f[R] .RE .RE.SS ایجاد فایل آرشیو پویای CDS با \-XX:ArchiveClassesAtExit .PP مزایای آرشیوهای پویای CDS عبارتند از: .IP \[bu] 2 آن‌ها معمولاً فضای دیسک کمتری مصرف می‌کنند، زیرا نیازی به ذخیره کلاس‌هایی که از قبل در آرشیو ایستا موجود هستند ندارند. .IP \[bu] 2 آن‌ها در مقایسه با آرشیو ایستای مشابه، با یک مرحله کمتر ایجاد می‌شوند. .PP مراحل زیر یک فایل آرشیو پویای CDS ایجاد می‌کنند که شامل کلاس‌های مورد استفاده توسط برنامه \f[V]test.Hello\f[R] است، به استثنای مواردی که از قبل در آرشیو پیش‌فرض CDS قرار دارند. .IP "1." 3 ایجاد یک آرشیو پویای CDS با نام \f[V]hello.jsa\f[R] که شامل تمام کلاس‌های موجود در \f[V]hello.jar\f[R] است که توسط برنامه \f[V]test.Hello\f[R] بارگذاری شده‌اند: .RS 4 .RS .PP \f[V]java -XX:ArchiveClassesAtExit=hello.jsa -cp hello.jar Hello\f[R] .RE .RE .IP "2." 3 اجرای برنامه \f[V]test.Hello\f[R] با آرشیو اشتراکی \f[V]hello.jsa\f[R]: .RS 4 .RS .PP \f[V]java -XX:SharedArchiveFile=hello.jsa -cp hello.jar test.Hello\f[R] .RE .RE .IP "3." 3 \f[B]اختیاری\f[R] مرحله ۴ از بخش قبلی را تکرار کنید تا مطمئن شوید برنامه \f[V]test.Hello\f[R] از کلاس موجود در آرشیو اشتراکی \f[V]hello.jsa\f[R] استفاده می‌کند. .PP همچنین امکان ایجاد یک آرشیو پویای CDS به همراه یک آرشیو ایستای غیرپیش‌فرض CDS وجود دارد. برای مثال: .RS .PP \f[V]java -XX:SharedArchiveFile=base.jsa -XX:ArchiveClassesAtExit=hello.jsa -cp hello.jar Hello\f[R] .RE .PP برای اجرای برنامه با استفاده از این آرشیو پویای CDS: .RS .PP \f[V]java -XX:SharedArchiveFile=base.jsa:hello.jsa -cp hello.jar Hello\f[R] .RE .PP (در Windows، جداکننده مسیر \f[V]:\f[R] در بالا باید با \f[V];\f[R] جایگزین شود) .PP همان‌طور که در بالا اشاره شد، می‌توان از نام آرشیو ایستا صرف‌نظر کرد: .RS .PP \f[V]java -XX:SharedArchiveFile=hello.jsa -cp hello.jar Hello\f[R] .RE .SS ایجاد فایل‌های آرشیو CDS با jcmd .PP دو بخش قبلی برای ایجاد یک آرشیو CDS، نیازمند تغییر اسکریپت راه‌اندازی برنامه هستند. گاهی اوقات این کار ممکن است دشوار باشد، به عنوان مثال اگر مسیر کلاس (class path) برنامه توسط روال‌های پیچیده‌ای تنظیم شده باشد. .PP دستور \f[V]jcmd VM.cds\f[R] روشی با تداخل کمتر برای ایجاد یک آرشیو CDS از طریق اتصال به یک پردازه در حال اجرای JVM فراهم می‌کند. می‌توانید یک آرشیو ایستا ایجاد کنید: .RS .PP \f[V]jcmd VM.cds static_dump my_static_archive.jsa\f[R] .RE .PP یا یک آرشیو پویا: .RS .PP \f[V]jcmd VM.cds dynamic_dump my_dynamic_archive.jsa\f[R] .RE .PP برای استفاده از فایل آرشیو حاصل در اجرای بعدی برنامه بدون نیاز به ویرایش اسکریپت راه‌اندازی برنامه، می‌توانید از ترفند زیر استفاده کنید: .RS .PP \f[V]env JAVA_TOOL_OPTIONS=-XX:SharedArchiveFile=my_static_archive.jsa bash app_start.sh\f[R] .RE .PP نکته: برای استفاده از \f[V]jcmd VM.cds dynamic_dump\f[R]، پردازه JVM که با \f[V]\f[R] مشخص شده است باید با \f[V]-XX:+RecordDynamicDumpInfo\f[R] راه‌اندازی شده باشد، که آن را نیز می‌توان با استفاده از همین شیوه به اسکریپت راه‌اندازی برنامه منتقل کرد: .RS .PP \f[V]env JAVA_TOOL_OPTIONS=-XX:+RecordDynamicDumpInfo bash app_start.sh\f[R] .RE .SS ایجاد فایل آرشیو پویای CDS با \-XX:+AutoCreateSharedArchive .PP گزینه \f[V]-XX:+AutoCreateSharedArchive\f[R] روشی راحت‌تر برای ایجاد/استفاده از آرشیوهای CDS است. برخلاف روش‌های ایجاد دستی آرشیو CDS که در بخش قبلی توضیح داده شد، با \f[V]-XX:+AutoCreateSharedArchive\f[R] دیگر نیازی به یک اجرای آزمایشی مجزا نیست. در عوض، می‌توانید همیشه برنامه را با همان خط فرمان یکسان اجرا کنید و به‌طور خودکار از مزایای CDS بهره‌مند شوید. .RS .PP \f[V]java -XX:+AutoCreateSharedArchive -XX:SharedArchiveFile=hello.jsa -cp hello.jar Hello\f[R] .RE .PP اگر فایل آرشیو مشخص‌شده وجود داشته باشد و توسط همان نسخه JDK ساخته شده باشد، به عنوان یک آرشیو پویا بارگذاری خواهد شد؛ در غیر این صورت هنگام راه‌اندازی VM نادیده گرفته می‌شود. .PP هنگام خروج VM، اگر فایل آرشیو مشخص‌شده وجود نداشته باشد، ایجاد خواهد شد. اگر وجود داشته باشد اما با نسخه‌ای متفاوت (ولی پس از JDK 19) از JDK ساخته شده باشد، جایگزین خواهد شد. در هر دو حالت، آرشیو برای دفعه بعد که JVM با همان خط فرمان اجرا شود، آماده بارگذاری خواهد بود. .PP اگر فایل آرشیو مشخص‌شده وجود داشته باشد اما توسط نسخه‌ای از JDK قبل از JDK 19 ایجاد شده باشد، نادیده گرفته خواهد شد: نه در زمان راه‌اندازی بارگذاری می‌شود و نه در زمان خروج جایگزین می‌گردد. .PP توسعه‌دهندگان باید توجه داشته باشند که محتویات فایل آرشیو CDS مختص به هر بیلد از JDK است. بنابراین، اگر به بیلد متفاوتی از JDK سوئیچ کنید، \f[V]-XX:+AutoCreateSharedArchive\f[R] به‌طور خودکار آرشیو را بازتولید می‌کند تا با JDK همخوانی داشته باشد. اگر قصد دارید از این ویژگی به همراه یک آرشیو موجود استفاده کنید، باید مطمئن شوید که آرشیو حداقل با نسخه ۱۹ از JDK ساخته شده است..SS محدودیت‌های Class Path و Module Path .IP \[bu] 2 نه مسیر کلاس (\f[V]-classpath\f[R] و \f[V]-Xbootclasspath/a\f[R]) و نه مسیر ماژول (\f[V]--module-path\f[R]) نمی‌توانند شامل دایرکتوری‌های غیرخالی باشند. .IP \[bu] 2 در \f[V]--module-path\f[R] فقط از فایل‌های JAR ماژولار پشتیبانی می‌شود. ماژول‌های بازشده (Exploded modules) پشتیبانی نمی‌شوند. .IP \[bu] 2 مسیر کلاسی که در زمان ایجاد آرشیو استفاده شده است باید با مسیر کلاس استفاده‌شده در زمان اجرا یکسان باشد (یا پیشوندی از آن باشد). (هیچ الزامی از این دست برای مسیر ماژول وجود ندارد.) .IP \[bu] 2 اگر هر یک از فایل‌های JAR در مسیر کلاس یا مسیر ماژول پس از ایجاد آرشیو تغییر کنند، آرشیو CDS نمی‌تواند بارگیری شود. .IP \[bu] 2 در صورت تعیین هر یک از گزینه‌های VM شامل \f[V]--upgrade-module-path\f[R]، \f[V]--patch-module\f[R] یا \f[V]--limit-modules\f[R]، قابلیت CDS غیرفعال می‌شود. این بدان معناست که JVM بدون بارگیری هیچ آرشیو CDS اجرا خواهد شد. علاوه بر این، اگر تلاش کنید با تعیین هر یک از این ۳ گزینه یک آرشیو CDS ایجاد کنید، JVM یک خطا گزارش خواهد کرد. .SH "مثال‌های بهینه‌سازی کارایی (PERFORMANCE TUNING EXAMPLES)" .PP می‌توانید از گزینه‌های پیشرفته زمان اجرای جاوا برای بهینه‌سازی کارایی برنامه‌های خود استفاده کنید. .SS تنظیم برای توان عملیاتی بالاتر .PP برای دستیابی به عملکرد توان عملیاتی بالاتر در برنامه خود، از دستورها و گزینه‌های پیشرفته زیر استفاده کنید: .RS .PP \f[V]java -server -XX:+UseParallelGC -XX:+UseLargePages -Xmn10g -Xms26g -Xmx26g\f[R] .RE .SS تنظیم برای زمان پاسخ‌دهی کوتاه‌تر .PP برای دستیابی به زمان‌های پاسخ‌دهی کوتاه‌تر برای برنامه خود، از دستورها و گزینه‌های پیشرفته زیر استفاده کنید: .RS .PP \f[V]java -XX:+UseG1GC -XX:MaxGCPauseMillis=100\f[R] .RE .SS کوچک نگه‌داشتن هیپ جاوا و کاهش ردپای حافظه پویای برنامه‌های تعبیه‌شده .PP از گزینه‌های پیشرفته زمان اجرای زیر برای کوچک نگه‌داشتن هیپ جاوا و کاهش ردپای پویای برنامه‌های تعبیه‌شده استفاده کنید: .RS .PP \f[V]-XX:MaxHeapFreeRatio=10 -XX:MinHeapFreeRatio=5\f[R] .RE .RS .PP \f[B]نکته:\f[R] مقادیر پیش‌فرض برای این دو گزینه به ترتیب ۷۰٪ و ۴۰٪ است. از آنجا که هنگام استفاده از این تنظیمات ممکن است افت کارایی رخ دهد، باید با کاهش این مقادیر تا حد امکان، اندازه ردپای حافظه را بدون ایجاد افت کارایی غیرقابل قبول بهینه‌سازی کنید. .RE .SH "وضعیت خروج (EXIT STATUS)" .PP هنگامی که اجراکننده با آرگومان‌های نادرست، خطاهای جدی یا استثناهای پرتاب‌شده از سوی JVM فراخوانی شود، معمولاً مقادیر خروج زیر را بازمی‌گرداند. با این حال، یک برنامه جاوا می‌تواند با استفاده از فراخوانی رابط برنامه‌نویسی \f[V]System.exit(exitValue)\f[R] هر مقداری را بازگرداند. این مقادیر عبارتند از: .IP \[bu] 2 \f[V]0\f[R]: اتمام موفقیت‌آمیز .IP \[bu] 2 \f[V]>0\f[R]: خطایی رخ داده است