ممکنه شما هم به مشکلاتی نظیر پایین اومدن سرور bi بعد از لاگین چندکاربر خورده باشید

یکی از دلایل این مشکل به این خاطره که شما کلی گزارش سنگین دارید و کاربرها هم در آن واحد در حال استفاده از سامانه هوش تجاری شما هستند، پس ادمین اپلیکیشن شما باید فضای heap جاوا رو tune کنه تا سرور بتونه بدون مشکل گزارشها رو برای کاربرها لود کنه

تشخیص مقدار فضای heap

  • اوراکل پیشنهاد میکنه که فضای اولیه heap ماشین مجازی جاواتون رو 1/64 مقدار حافظه‌ی فیزیکی ماشین بذارید (Initial heap size)
  • همچنین توصیه میکنه مقدار بیشترین فضای heap ماشین مجازی جاواتون رو 1/4 مقدار حافظه‌ی فیزیکی ماشینتون بذارید (Maximum heap size)

بازبینی معماری حافظه در جاوا

خب میخوایم یه نگاه سریع به معماری حافظه در جاوا بکنیم:

[oracle@oraserv /]$ java -X
-Xmixed mixed mode execution (default)
-Xint interpreted mode execution only
-Xbootclasspath:<directories and zip/jar files separated by :>
set search path for bootstrap classes and resources

-Xbootclasspath/a:<directories and zip/jar files separated by :>
append to end of bootstrap class path

-Xbootclasspath/p:<directories and zip/jar files separated by :>
prepend in front of bootstrap class path

-Xdiag show additional diagnostic messages
-Xnoclassgc disable class garbage collection
-Xincgc enable incremental garbage collection
-Xloggc:<file> log GC status to a file with time stamps
-Xbatch disable background compilation
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
-Xss<size> set java thread stack size
-Xprof output cpu profiling data
-Xfuture enable strictest checks, anticipating future default
-Xrs reduce use of OS signals by Java/VM (see documentation)
-Xcheck:jni perform additional checks for JNI functions
-Xshare:off do not attempt to use shared class data
-Xshare:auto use shared class data if possible (default)
-Xshare:on require using shared class data, otherwise fail.
-XshowSettings show all settings and continue

-XshowSettings:all
show all settings and continue

-XshowSettings:vm show all vm related settings and continue

-XshowSettings:properties
show all property settings and continue

-XshowSettings:locale
show all locale related settings and continue

The -X options are non-standard and subject to change without notice.

Java Heap Size

مکانی برای ذخیره آبجکت ایجاد شده توسط اپلیکیشن جاوای شما، اینجا جایی که GC کارشو شروع میکنه و همون حافظه‌ای که اپلیکیشن جاوای شما ازش استفاده میکنه. برای پراسس‌های سنگین فضای heap کافی باعث کارکرد بهتر میشود و دیگه شما به امثال این پیغام‌ها بر نمی‌خورید:

java.lang.OutOfMemoryError: Java heap space

پارامترهای تنظیم heap در ماشین مجازی اوراکل پارامترهای زیر هستند:

-Xms<size> - Set initial Java heap size
-Xmx<size> - Set maximum Java heap size

برای اجرای اپلیکیشنتون با این پارامترها می‌تونید مثل مثال زیر عمل کنید:

$ java -Xms512m -Xmx1024m JavaAp

Perm Gen Size

مکانی برای ذخیره کلاس‌های لود شده تعریف شده و متادیتاهای اپلیکیشن. اگه شما یه پروژه بزرگ با کدهای زیاد دارید خیلی مهمه که فضای کافی در این قسمت داشته باشید یکی از خطاهای رایج در صورت کم بودن فضای این قسمت خطای زیر هستش:

Java.Lang.OutOfMemoryError: PermGen

پارامترهای تنظیم فضای PermGen به شرح زیر است:

-XX:PermSize<size> - Set initial PermGen Size.
-XX:MaxPermSize<size> - Set the maximum PermGen Size.

برای اجرای اپلیکیشنتون با این پارامترها می‌تونید مثل مثال زیر عمل کنید:

$ java -XX:PermSize=64m -XX:MaxPermSize=128m JavaApp

Java Stack Size

مقدار فضا برای تردهای جاوا. اگه پروژه شما دارای تردهای خیلی زیادیه خب باید این فضا رو به درستی تنظیم کنید تا به مشکلاتی نظیر out of memory در زمان اجرا نخورید.

پارامتر تنظیم فضای Stack به شرح زیر است:

-Xss = set java thread stack size

برای اجرای اپلیکیشنتون با این پارامترها می‌تونید مثل مثال زیر عمل کنید:

$ java -Xss512k JavaApp

مقادیر فعلی 

برای پیدا کردن مقادیر فعلی تنظیم شده بر روی ماشین مجازی جاوای سرور خود می‌تونید از ۲ دستور زیر استفاده کنید:

- سیستم‌های یونیکس بیس:

$ java -XX:+PrintFlagsFinal -version | grep -iE 'heapsize|permsize|threadstacksize'

- سیستم‌های ویندوزی:

C:\>java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

تنظیم مقادیر در سطح ماشین مجازی

پیشنهاد من برای پروژه‌های کوچیک مقادیر زیر هستش:

  1. Heap = -Xms512m -Xmx1024m
  2. PermGen = -XX:PermSize=64m -XX:MaxPermSize=128m
  3. Thread = -Xss512k

نکته: برای اکثر اپلیکیشنهای کوچیک 512k فضا برای تردها کافیه

$ java -XX:+PrintFlagsFinal -Xms512m -Xmx1024m -Xss512k -XX:PermSize=64m -XX:MaxPermSize=128m
-version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

uintx InitialHeapSize := 536870912 {product}
uintx MaxHeapSize := 1073741824 {product}
uintx PermSize := 67108864 {pd product}
uintx MaxPermSize := 134217728 {pd product}
intx ThreadStackSize := 512 {pd product}

نکته: فضای پیشفرض برای perm gen و stack و heap در هر ماشین مجازی جاوایی متفاوت از بقیه است. همیشه یادتون باشه best practice باید توسط ادمین اپلیکیشن تعیین و مقادیر برای اپلیکیشن شما tune شوند.

افزایش فضای Heap, PermGen سرور OBIEE 11g

برای افزایش فضای heap جاوای instanceهای Admin Server و (Managed Server (bi_server1 وبلاجیک OBI ما نیاز داریم ۲ جا رو کانفیگ کنیم:

  1. تغییر مقدار فضای heap در اسکریپت setDomainEnv.sh برای Admin Server
  2. تنظیم Java Arguments در کنسول وبلاجیک برای bi_server1

مرحله اول

افزایش فضای Instance Admin Server

به مسیر زیر با دستور cd تغییر مسیر بدید:

export ORACLE_INSTANCE=/middleware/instances/instance1/
echo $ORACLE_INSTANCE
<MiddlewareHome>/user_projects/domains/bifoundation_domain/bin
cd /middleware/user_projects/domains/bifoundation_domain/bin/

اسکریپت زیر رو باز کنید:

vim setDomainEnv.sh

اگه شما از سرور ۶۴ بیتی استفاده می‌کنید پس باید متغیرهای XMS_SUN_64BIT و XMX_SUN_64BIT رو شبیه مقادیر زیر ویرایش کنید:

XMS_SUN_64BIT="10240"
export XMS_SUN_64BIT
XMS_SUN_32BIT="256"
export XMS_SUN_32BIT
XMX_SUN_64BIT="20480"
export XMX_SUN_64BIT
XMX_SUN_32BIT="512"
export XMX_SUN_32BIT

مرحله دوم

افزایش فضای Instance bi_server1

برای افزایش فضای Heap اینستنس (Managed Server (bi_server1 به کنسول وبلاجیک لاگین کنید:

http://host_name:7001/console
ex:
http://192.168.200.61:7001/console/console.portal?_nfpb=true

به مسیر Servers->bi_server1->Server Start برید و حالا آرگومانهای زیر رو وارد کنید:

-Xms2048m -Xmx4096m -XX:PermSize=512m -XX:MaxPermSize=1024m
ex:
-Dserver.group=obi -Xms10g -Xmx20g -XX:PermSize=512m -XX:MaxPermSize=1024m

 

تغییر در سطح وبلاجیک

شما می‌تونید مقدار پیشفرض فضای heap جاوا رو برای Administration Server و Managed Servers با تنظیم متغیر USER_MEM_ARGS در اسکریپت استارتاپ وبلاجیک انجام بدید.

برای تغییر فضای heap پیشفرض JVM:

  • اول با استفاده از کنسول ادمین وبلاجیک به طور کامل وبلاجیک رو shutdown کنید
  • فایل setDomainEnv.sh رو برای ویرایش باز کنید (یا در سیستم‌های ویندوزی فایل setDomainEnv.bat)

شما می‌تونید این فایل رو در دایرکتوری DOMAIN_HOME/bin پیدا کنید به عنوان مثال:

C:\OBI_11117\user_projects\domains\bifoundation_domain\bin
  • حالا شرط IF ای رو که از متغیر USER_MEM_ARGS استفاده کرده رو پیدا کنید و قبل از بلاک IF متغیر با مقادیر زیر مقداردهی کنید:

سیستم‌های یونیکس بیس:

USER_MEM_ARGS="-Xms10240m -Xmx20480m -XX:CompileThreshold=8000 -XX:PermSize=512m -XX:MaxPermSize=1024m"
export USER_MEM_ARGS

سیستم‌های ویندوزی:

set USER_MEM_ARGS="-Xms10240m -Xmx20480m -XX:CompileThreshold=8000 -XX:PermSize=512m -XX:MaxPermSize=1024m"

نکته: مقداردهی آرگومان USER_MEM_ARGS خیلی به این بستگی داره که شما از ماشین مجازی SunVM استفاده می‌کنید یا JRockit برای مثال آرگومان PermSize و MaxPermSize فقط برای ماشین مجازی SunVM هستند و در ماشین مجازی JRockit تعریف نشده‌اند و شما به خطا می‌خورید.

  • بعد از تنظیم پارامترها فایل رو ذخیره کنید و ببندید و بعدش هر دو instance مورد نظر (Administration Server و Managed Servers) رو برای اعمال تغییرات ریستارت کنید.

برای بازبینی مقادیر و صحت این موضوع که پارامترها به درستی تنظیم شده‌اند به کنسول وبلاجیک لاگین کنید و در قسمت مانیتورینگ موارد رو بازبینی کنید:

همچنین من برای استارت و استاپ سرویسها OBI 11g از اسکریپت زیر استفاده میکنم:

دریافت اسکریپت
حجم: 10.2 کیلوبایت

اطلاعات تکمیلی در:

  • Doc ID 1622182.1
  • Doc ID 1271635.1
  • Doc ID 15492741.1
  • Doc ID 2243306.1

منبع:

https://www.mkyong.com/java/find-out-your-java-heap-memory-size

http://aravinddarla.blogspot.com/2014/03/increase-java-heap-size-for-obiee-11g.html