এসবিটিতে “রান” ক্রিয়া সহ একটি অ্যাপ্লিকেশন চালনার জন্য কীভাবে জেভিএম সর্বাধিক হ্যাপ সাইজ “-Xmx” নির্দিষ্ট করবেন?


98

আমার অ্যাপ্লিকেশনটি বড় ডেটা অ্যারে প্রসেসিং করে এবং জেভিএম ডিফল্টরূপে দেয় তার চেয়ে বেশি মেমরি দরকার। আমি জাভাতে জানি এটি "-Xmx" বিকল্প দ্বারা নির্দিষ্ট করা হয়েছে। "রান" অ্যাকশন দিয়ে কোনও অ্যাপ্লিকেশন চালানোর জন্য আমি কীভাবে নির্দিষ্ট "-Xmx" মানটি ব্যবহার করতে এসবিটি সেট করব?

উত্তর:


17

এটা চেষ্টা কর:

class ForkRun(info: ProjectInfo) extends DefaultProject(info) {
    override def fork = Some(new ForkScalaRun {
        override def runJVMOptions = super.runJVMOptions ++ Seq("-Xmx512m")
        override def scalaJars = Seq(buildLibraryJar.asFile, buildCompilerJar.asFile)
    })
}

53
এটি পুরানো, এখন আপনি ব্যবহার করতে পারেনjavaOptions += "-Xmx1G"
i

4
@ আমার পোস্টের লিখিত সামগ্রীটি আপনার কাছে খুব গুরুত্বপূর্ণ বলে মনে হচ্ছে।
আরনে

4
দ্রষ্টব্য যে javaOptionsকেবলমাত্র জালভুক্ত জেভিএমগুলির জন্যই প্রভাব রয়েছে ( স্কেলা-sbt.org/0.13/docs/ Forking.html দেখুন )
ইয়ার

4
যোগ fork in run := ture দেয়javaOptions
coanor

@ কোয়ানোর এই উত্তরটি এসবিটি-র একটি প্রাচীন সংস্করণের জন্য। এই উত্তরটির অধীনে অনেক উচ্চ র‌্যাঙ্কিং সহ একটি উত্তর রয়েছে। প্রশ্নটি যখন জিজ্ঞাসা করা হয়েছিল তখন এই উত্তরটি সঠিক উত্তর ছিল।
আর্ন

115

কাঁটাচামচ প্রক্রিয়াগুলির জন্য আপনার বিল্ড.স্কালার দিকে নজর দেওয়া উচিত

কাঁটাচামচ প্রক্রিয়াগুলির জন্য জাভা অপশনগুলি সংশোধন করতে আপনাকে সেগুলি বিল্ড.স্কালায় (বা আপনার বিল্ডটির নাম হিসাবে কিছু দিয়েছেন) এগুলি নির্দিষ্ট করতে হবে:

val buildSettings = Defaults.defaultSettings ++ Seq(
   //…
   javaOptions += "-Xmx1G",
   //…
)

এটি আপনাকে বিশ্বব্যাপী JAVA_OPTS পরিবর্তন না করে যথাযথ বিকল্পগুলি দেবে এবং এটি এসবিটি উত্পাদিত স্টার্ট স্ক্রিপ্টে কাস্টম JAVA_OPTS রাখবে

জন্য অ Forked প্রসেস এটা মাধ্যমে কনফিগ সেট সবচেয়ে সুবিধাজনক sbtoptsবা sbtconfigআপনার SBT সংস্করণের উপর নির্ভর করে।

যেহেতু এসবিটি 0.13.6 হ্রাস .sbtconfigকরা হয়েছে/usr/local/etc/sbtoptsএই লাইন বরাবর সংশোধন করুন :

-J-Xms512M
-J-Xmx3536M
-J-Xss1M
-J-XX:+CMSClassUnloadingEnabled
-J-XX:+UseConcMarkSweepGC
-J-XX:MaxPermSize=724M
-J-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

আপনি.sbtopts ফাইলটির মতো একই সিনট্যাক্স ব্যবহার করে আপনার এসবিটি প্রকল্পের মূলের মধ্যে একটি ফাইলও তৈরি করতে পারেন/usr/local/etc/sbtopts । এটি প্রকল্পটি স্ব-অন্তর্ভুক্ত করে।

এসবিটি 0.13.6 এর আগে আপনি নন কাঁটাযুক্ত প্রক্রিয়াগুলির জন্য .sbtconfig এ বিকল্পগুলি সেট করতে পারেন :

  1. এসবিটি কোথায় রয়েছে তা পরীক্ষা করুন:

    $ which sbt
    /usr/local/bin/sbt
    
  2. বিষয়বস্তু দেখুন:

    $ cat /usr/local/bin/sbt
    #!/bin/sh
    test -f ~/.sbtconfig && . ~/.sbtconfig
    exec java ${SBT_OPTS} -jar /usr/local/Cellar/sbt/0.12.1/libexec/sbt-launch.jar "$@"
    
  3. ওএম প্রতিরোধের জন্য সঠিক জেভিএম বিকল্পগুলি সেট করুন (নিয়মিত এবং পার্মজেন উভয়):

    $ cat ~/.sbtconfig
    SBT_OPTS="-Xms512M -Xmx3536M -Xss1M 
     -XX:+CMSClassUnloadingEnabled 
     -XX:+UseConcMarkSweepGC -XX:MaxPermSize=724M"
    

আপনি যদি এসবিটি-র বর্তমান চলার জন্য কেবল এসবিT_OPTS সেট করতে চান তবে গুগল env SBT_OPTS=".." sbtশানের পরামর্শ অনুসারে আপনি ব্যবহার করতে পারেন । অথবা আপনি এসবিটি 12: এ যুক্ত বিকল্পটি ব্যবহার করতে পারেন sbt -mem 2048। বিকল্পগুলির দীর্ঘ তালিকাগুলির জন্য এটি অযৌক্তিক হয়ে যায়, তবে আপনার যদি বিভিন্ন প্রয়োজন অনুসারে বিভিন্ন প্রকল্প থাকে তবে এটি সাহায্য করতে পারে।

নোট করুন যে সিএমএসক্লাসঅনলোডিংএনলজড ইউজকনকমার্কসুইপজিসির সাথে কনসার্টে পার্মজেন স্পেসকে পরিষ্কার রাখতে সাহায্য করে, তবে আপনি কোন ফ্রেমওয়ার্ক ব্যবহার করেন তার উপর নির্ভর করে পারমজেনে আপনার প্রকৃত ফাঁস হতে পারে, যা শেষ পর্যন্ত পুনরায় চালু করতে বাধ্য করে।


@ আইউইন - জাভাঅপশনগুলি এসবিটি-র জন্য ডিফল্ট হিপস্পেস পরিবর্তন করে নি। আমি jconsole এ চেক করেছি এবং এটি কেবল -xmx512M দেখায়। এমনকি আমি B / .sbtconfig এ SBT_OPTS যুক্ত করলেও আমি এটি এখনও jconsole এ পেয়েছি: -Xmx512M -Xms256M -Xmx1G -XX: MaxPermSize = 256M -XX: + UseConcMarkSweepGC। আপনি কি সামনে Xmx512 দেখতে পাচ্ছেন? এটি বিল্ড.স্কালা থেকে জাভাঅপশনগুলি কীভাবে চয়ন করে না তা কিছু। কোন পয়েন্টার?
আনন্দ

@ এবং সম্ভবত 0.13 এ জিনিসগুলি কিছুটা আলাদাভাবে কাজ করছে? আমি কিছু আপডেট করে দিলে আমি উত্তরটি আপডেট করব (কিছুক্ষণ সময় নিতে পারে), আপনি যদি মাঝামাঝি সময়ে এটি বের করেন তবে আমাকে জানান।
iwein

@ আইউইন আমি আমার বিল্ড.স্কালায় নিম্নলিখিতটি ব্যবহার করেছি এবং এটি কার্যকর হয়েছে। দৌড়ে কাঁটাচামচ: = সত্য, রানে জাভাঅ্যাপশনগুলি ++ = সিক ("- এক্সএম 256 এম", "-Xmx2048 এম", "-এক্সএক্স: + ইউজকনকমার্কসুইপজিসি")। উত্তর পোস্টের জন্য পোস্টটি দেখুন stackoverflow.com/questions/27372468/… । ধন্যবাদ!
আনন্দ

4
এফওয়াইআই আপনি .sbtoptsফাইলের মতো একই সিনট্যাক্স ব্যবহার করে আপনার এসবিটি প্রকল্পের মূলের মধ্যে একটি ফাইলও তৈরি করতে পারেন /usr/local/etc/sbtopts। এটি আপনার প্রকল্পকে স্ব-অন্তর্নিহিত করে তোলে, যা সিআই পরিস্থিতিতে খুব কার্যকর হতে পারে।
বয়স মুইজ

উইন্ডোজে 0.13.9 (0.13.6 হতে পারে) ব্যবহার করে ফাইলটি সি: \ প্রোগ্রাম ফাইল (x86) \ এসবিটি \ কনফিড \ sbtconfig.txt। ডিফল্টরূপে ফাইলটিতে "-Xmx512M" ছিল যা জবাব ছাড়া এই উত্তরে দেখানো হয়। আমি নিশ্চিত করতে পারি যে এই ফাইলটি পড়ছে যে এসবিটি এসেম্বলি -XX সম্পর্কিত একটি সতর্কতা জারি করে: ম্যাক্স্পার্মসাইজ এবং যখন আমি সেই মানটি পরিবর্তন করি তখন সতর্কতাটি আমি প্রবেশ করানো মানটি দেখায় এবং এটি "256 এম" মানটি এটি প্রদর্শিত হয় না।
নাইট আউল


43

আপনি যদি লিনাক্স শেলের উপর এসবিটি চালান, আপনি ব্যবহার করতে পারেন:

env JAVA_OPTS="-Xmx512m" sbt run

আমার এসবিটি প্রকল্পটি চালানোর জন্য এটি আমার ব্যবহৃত ব্যবহৃত আদেশ।


4
আপনাকে অনেক ধন্যবাদ. জানতে একটি দুর্দান্ত আদেশ। আমি কখনই সেই "এনভিভ" সম্পর্কে জানতাম না এবং এই জাতীয় সরঞ্জামটি বহুবার মিস করেছি।
ইভান

4
হুম, এটি আমার পক্ষে কাজ করে না! আমার override def forkউপরের সমাধানটি দরকার ছিল । (এসবিটি 0.7.7)
স্কট মরিসন

4
আপনার এসবিটি ফাইলটি তার নিজস্ব জেভিএ_ওপিটিএস নির্দিষ্ট করে, এমন ক্ষেত্রে এগুলি ওভাররাইট করা হবে। তারপরে আপনি -smx পতাকাটি সরাতে বা এটি আপনার সর্বাধিক স্তরের আকারে স্যুইচ করতে সরাসরি আপনার এসবিটি ফাইলটি সংশোধন করতে পারেন।
nnythm

23

.sbtconfigএসবিটি দিয়ে শুরু করে হ্রাস করা হয়েছে 0.13.6। পরিবর্তে, আমি এই বিকল্পগুলি /usr/local/etc/sbtoptsনিম্নলিখিত উপায়ে কনফিগার করেছি :

-J-Xms512M
-J-Xmx3536M
-J-Xss1M
-J-XX:+CMSClassUnloadingEnabled
-J-XX:+UseConcMarkSweepGC
-J-XX:MaxPermSize=724M
-J-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

4
-J-Xss1Mবড় কেস ক্লাসগুলির জন্য কিছুটা কম, 4 এম নিরাপদ বলে মনে হচ্ছে।
মারিউস সৌটিয়ার

7

আমি জানি একটি উপায় আছে। পরিবেশ পরিবর্তনশীল JAVA_OPTS সেট করুন।

JAVA_OPTS='-Xmx512m'

কমান্ড প্যারামিটার হিসাবে এটি করার কোনও উপায় আমি খুঁজে পাইনি।


7

পরিবেশ পরিবর্তনশীল সহ সেটিংয়ের জন্য JAVA_OPTS ব্যবহার করুন।

স্বতন্ত্র বিকল্পগুলির জন্য এসবিটি করতে -জেএক্স বিকল্পগুলি ব্যবহার করুন, উদাহরণস্বরূপ -J-Xmx2048 -J-XX: ম্যাক্সপার্মসাইজ = 512

এসবিটি-র নতুন সংস্করণগুলিতে একটি "-মেম" বিকল্প রয়েছে।


5

javaOptions += "-XX:MaxPermSize=1024"আমাদের build.sbt আমাদের জন্য কাজ আমরা যখন java.lang.OutOfMemoryError যখন SBT মাধ্যমে Specs2 পরীক্ষা চালানো নিক্ষিপ্ত এইজন্য হয়েছিল উপরে @iwein দ্বারা সমর্থিত হয়।


4
@ উয়েপ্লোনাস এটি প্রশ্নের উত্তর দেয়।
ভাসিলিনভিকভ

3

পরিবেশের পরিবর্তনশীল _JAVA_OPTIONS, যা সেট করা দরকার। একবার আপনি _JAVA_OPTIONS সেট করলেন এবং যখন আপনি sbt করবেন, এসবিটি JAVA_OPTIONS এবং মানগুলি ব্যবহার করে বার্তাটি প্রদর্শন করবে।

বিকল্প হিসাবে আপনি sbt বা .scala ফাইল যেমন জাভা অপশন সেট করতে পারে

javaOptions += "-Xmx1G"

এসবিটি শেল থেকে আপনি জাভাঅপশন প্রদর্শন করতে পারেন যেগুলি সেট করা মানগুলি দেখতে পারে।


1
    javaOptions in Test += "-Xmx1G"

এটি পরীক্ষার জন্য JVM বিকল্পগুলি সেট করে। Jvm forking ( fork in Test := true) এর সাথেও কাজ করে ।


4
এই সেটটি কোথায় build.sbt?
জাভাদবা

যে কোনও জায়গায়, যদি আপনার 1 মডিউল প্রকল্প থাকে। সংজ্ঞাগুলির ক্রমটি এসবিটিতে সাধারণত আসে না। আপনার যদি একাধিক মডিউল থাকে তবে তা javaOptions in ThisBuild += "-Xmx1G"javaOptions in (ThisBuild, Test) += "-Xmx1G"
কোনও একটিতে

1

sbt আপনাকে JVM বিকল্পগুলি তালিকাভুক্ত করতে দেয় যা আপনার প্রকল্পের নামক কোনও ফাইলটিতে চালাতে হবে

.jvmopts

আপনার প্রকল্পের মূল মধ্যে। তারপরে আপনি চান জাভা বিকল্পগুলি যুক্ত করুন

cat .jvmopts
-Xms512M
-Xmx4096M
-Xss2M
-XX:MaxMetaspaceSize=1024M

এটি পরীক্ষিত এবং উইন্ডোজ 10 https://www.lagomframework.com/docamentation/1.4.x/scala/JVMMmmoryOnDev.html এ কাজ করে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.