জাভা অ্যাপ্লিকেশনটির ভিতর থেকে কীভাবে ভিএম আর্গুমেন্ট পাবেন?


162

আমার জেভিএমকে পাস করার মতো কোনও বিকল্প স্পষ্টভাবে সেট করা আছে বা এর ডিফল্ট মান আছে কিনা তা আমাকে পরীক্ষা করে দেখতে হবে।

আরও সুনির্দিষ্ট হওয়ার জন্য: আমার ডিফল্টের তুলনায় উচ্চতর নেটিভ স্ট্যাক আকারের সাথে একটি নির্দিষ্ট থ্রেড তৈরি করতে হবে, তবে ব্যবহারকারী যদি -Xssডিফল্ট স্ট্যাকের আকারের সাথে সমস্ত থ্রেড তৈরি করতে চান তবে বিকল্পটি নির্দিষ্ট করে এই জাতীয় জিনিসগুলি নিজেই যত্ন নিতে চায় case (যা ব্যবহারকারীরা -Xss বিকল্পে নির্দিষ্ট করবেন)।

আমি java.lang.Systemএবং এর মতো ক্লাস চেক করেছি java.lang.Runtimeতবে এগুলি আমাকে ভিএম যুক্তি সম্পর্কিত কোনও দরকারী তথ্য দিচ্ছে না।

আমার প্রয়োজনীয় তথ্যগুলি পাওয়ার কোনও উপায় আছে?

উত্তর:


183

এই কোডের সাহায্যে আপনি JVM টি যুক্তি পেতে পারেন:

import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
...
RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
List<String> arguments = runtimeMxBean.getInputArguments();

দুর্ভাগ্যক্রমে আপনি যদি প্রধান শ্রেণীর নাম কমান্ড লাইনে দেওয়া হয় তা পেতে পারেন না।
ড্যানিয়েল

@ ড্যানিয়েল, এটি আপনার প্রধান শ্রেণির নামটি পাওয়া উচিত: final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); final String mainClassName = stackTrace[stackTrace.length - 1].getClassName());
লাজ

3
যদি আপনি গ্যারান্টিযুক্ত হন যে ওরাকলের জেভিএম চলমান আছে এবং যুক্তিগুলি পার্স করার কোড রয়েছে যা দরকারী হতে পারে।
ল্যাজ

2
@ ভ্যালকান যে ভিএম যুক্তি পায় না। এটিতে মূল শ্রেণীর নাম এবং মূল পদ্ধতিতে আরোগুলি অ্যারে রয়েছে।
ডাকোঙ্গি

@ ডাকাঙ্গি আমি কখনই বোঝায়নি যে ভিএম যুক্তিগুলি sun.java.commandসিস্টেমের সম্পত্তিটিতে রয়েছে; আমি বলেছিলাম যে সম্পত্তিটি মূল শ্রেণীর নাম অর্জন করতে ব্যবহার করা যেতে পারে (যদিও আমি উল্লেখ করিনি, যেমন @ লাজ উল্লেখ করেছেন যে সম্পত্তিটি কেবল ওরাকলের জেভিএম-তে উপস্থিত রয়েছে)।
এফটিহম্পসন

206

প্রারম্ভকালে এটি পাস -Dname=value

এবং তারপরে আপনার কোডটিতে আপনার ব্যবহার করা উচিত

value=System.getProperty("name");

যে মান পেতে


4
আমি এটি এক্সডিবাগ পেতে ব্যবহার করতে পারি না
পিটারটেক

20
এই উত্তরটি কেন এত উত্সাহিত করা হয়েছে তা নিশ্চিত নন, এটি কেবলমাত্র অ্যাপ্লিকেশন প্যারামিটারগুলি (-D দিয়ে সুনির্দিষ্ট) পুনরুদ্ধার করে, ভিএম প্যারামিটারগুলি নয় (-এক্স দ্বারা নির্দিষ্ট করা)। প্রশ্নটি বিশেষত-এক্স প্যারাম সম্পর্কে।
ক্লিবার্জ

4
আমি এখানে এসেছি কারণ আমি বিশ্বাস করি যে প্রকারের পরামিতিগুলি -Dname=valueJVM আর্গুমেন্ট এবং আর্গুমেন্টের কোনও অন্তর্নিহিত পার্থক্য নেই -X। প্রকৃতপক্ষে, তারা উভয় জাভাতে পাস হয়েছে এবং কমান্ড লাইনে অ্যাপ্লিকেশন নয় এবং উদাহরণ হিসাবে প্রমাণ হিসাবে, আপনি উভয় হিসাবে পাস করতে পারেন -Drun.jvmArguments=...। আমি বিশ্বাস করি এজন্যই এটি উত্সাহিত।
কেপ

এটি মূল পোস্টারগুলির প্রয়োজনীয়তার কোনও উত্তর দেয় না।
ডান.এম ব্যবহারকারী 2321368

4
হতে পারে ! "কোডে ভিএম বিকল্পগুলি কীভাবে পড়তে হবে" এবং সে কারণেই এটি প্রাসঙ্গিকভাবে অনুসন্ধান করার সময় এটি শীর্ষে
উঠে আসে

4

আমি খুঁজে পেয়েছি যে হটস্পট-ক্লায়েন্ট এবং-সার্ভার ব্যতীত পরিচালনা শিমের সমস্ত ভিএম আর্গুমেন্টের তালিকা করে। সুতরাং, আপনি যদি ভিএম নাম থেকে স্বীকৃত / সংরক্ষণকার যুক্তি অনুমান করেন এবং এটি রানটাইম ম্যানেজমেন্ট বিনের তালিকায় যুক্ত করেন, আপনি আর্গুমেন্টের সম্পূর্ণ তালিকা পাবেন।

এসএসসিসিই এখানে:

import java.util.*;
import java.lang.management.ManagementFactory;

class main {
  public static void main(final String[] args) {
    System.out.println(fullVMArguments());
  }

  static String fullVMArguments() {
    String name = javaVmName();
    return (contains(name, "Server") ? "-server "
      : contains(name, "Client") ? "-client " : "")
      + joinWithSpace(vmArguments());
  }

  static List<String> vmArguments() {
    return ManagementFactory.getRuntimeMXBean().getInputArguments();
  }

  static boolean contains(String s, String b) {
    return s != null && s.indexOf(b) >= 0;
  }

  static String javaVmName() {
    return System.getProperty("java.vm.name");
  }

  static String joinWithSpace(Collection<String> c) {
    return join(" ", c);
  }

  public static String join(String glue, Iterable<String> strings) {
    if (strings == null) return "";
    StringBuilder buf = new StringBuilder();
    Iterator<String> i = strings.iterator();
    if (i.hasNext()) {
      buf.append(i.next());
      while (i.hasNext())
        buf.append(glue).append(i.next());
    }
    return buf.toString();
  }
}

আপনি যদি একটিতে যুক্তি চান তবে ছোট করা যেতে পারে List<String>

চূড়ান্ত দ্রষ্টব্য: কমান্ড লাইনের যুক্তিগুলির মধ্যে ফাঁকা থাকার বিরল ক্ষেত্রে পরিচালনা করার জন্য আমরা এটি বাড়িয়ে দিতে চাই।


হ্যাঁ, ঠিক আছে। চিয়ার্স :)
স্টেফান রেইচ

2

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

সূর্য ওয়েবসাইটটিতে প্রযুক্তি রয়েছে:

http://java.sun.com/javase/6/docs/technotes/guides/management/mxbeans.html


0

আপনি যদি আপনার জাভা প্রক্রিয়াটির পুরো কমান্ড লাইনটি চান, আপনি ব্যবহার করতে পারেন: JvmArguments.java (সর্বাধিক ইউনিক্স বাস্তবায়ন কভার করতে জেএনএ + / প্রোক এর সংমিশ্রণ ব্যবহার করে)

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