আমি জাভাতে সিপিইউ এবং মেমরির ব্যবহার কীভাবে চেক করব?


97

আমার জাভাতে সার্ভারের জন্য সিপিইউ এবং মেমরির ব্যবহার পরীক্ষা করা দরকার, যে কেউ কীভাবে এটি করতে পারে তা জানেন?



উত্তর:


73

আপনি যদি জভিএম-তে মেমরির জন্য বিশেষভাবে সন্ধান করছেন:

Runtime runtime = Runtime.getRuntime();

NumberFormat format = NumberFormat.getInstance();

StringBuilder sb = new StringBuilder();
long maxMemory = runtime.maxMemory();
long allocatedMemory = runtime.totalMemory();
long freeMemory = runtime.freeMemory();

sb.append("free memory: " + format.format(freeMemory / 1024) + "<br/>");
sb.append("allocated memory: " + format.format(allocatedMemory / 1024) + "<br/>");
sb.append("max memory: " + format.format(maxMemory / 1024) + "<br/>");
sb.append("total free memory: " + format.format((freeMemory + (maxMemory - allocatedMemory)) / 1024) + "<br/>");

তবে এগুলি কেবল অনুমান হিসাবে নেওয়া উচিত ...


সুতরাং আমি যদি একিপ্সিতে রান্নিন হয়ে থাকি তবে এটি আমার গ্রহগ্রহের সেটিংসের উপর নির্ভর করবে?
কফি

4
মনে রাখবেন যে এটি আসল ব্যবহৃত মেমরি নয় - এটি 'বরাদ্দ মেমরি' যার অর্থ জাভা বরাদ্দ করা হিপ, তাই আপনার যদি -Xms90g থাকে এবং আপনার অ্যাপ্লিকেশনটি খুব লাইটওয়েট হয় তবে আপনি এখনও 90m এর চেয়ে বড় কিছু হিসাবে বরাদ্দকৃত স্মৃতি পাবেন । নীচে "অজানা (ইয়াহু)" মুছে ফেলা উত্তর দেখুন (যা প্রথম নজরে আলাদা হতে পারে)
0fnt

শুধু কৌতূহলী, কেন এগুলি কেবল অনুমান করা উচিত?
কম্পিউটার

@ কম্পিউটারবিজ্ঞানী কারন ফ্রি আসলে যা ফ্রি (জিসি পোস্ট করা) তা আসলে এটি জিসির অপেক্ষায় থাকা অবজেক্টগুলি দেখায় না। আরও সঠিকভাবে পেতে, এই উত্তরের আগে 2 টি আবর্জনা সংগ্রহ চালান। আপনি যদি জিসির সাথে বা এটি ছাড়া চেষ্টা করেন তবে আপনি জিসি পরবর্তী মানগুলি খুব সামঞ্জস্যপূর্ণ দেখতে পাবেন তবে প্রিজিসি সাধারণত কমপক্ষে দ্বিগুণ হবে।
বিল কে

@ এসবেলিয়াকভ আপনি জাভাসিসমন ( github.com/jezhumble/javasysmon ) ব্যবহার করতে পারেন , যদিও আমি আপনাকে একটি নতুন প্রশ্ন খোলার পরামর্শ দিচ্ছি এবং আমি এর উত্তর দেব। গিটহাবের লাইব্রেরিতে একটি ত্রুটি রয়েছে এবং 32 বিটটিকে 64 বিট হিসাবে স্বীকৃতি দেওয়া হয়েছে তবে আমি বিভিন্ন জারগুলিকে মিশ্রণের আশেপাশে একটি কাজ পেয়েছি [ github.com/goxr3plus/XR3Player/blob/master/resources/libs/… ]।
GOXR3PLUS 25'17

20
package mkd.Utils;

import java.io.File;
import java.text.NumberFormat;

public class systemInfo {

    private Runtime runtime = Runtime.getRuntime();

    public String Info() {
        StringBuilder sb = new StringBuilder();
        sb.append(this.OsInfo());
        sb.append(this.MemInfo());
        sb.append(this.DiskInfo());
        return sb.toString();
    }

    public String OSname() {
        return System.getProperty("os.name");
    }

    public String OSversion() {
        return System.getProperty("os.version");
    }

    public String OsArch() {
        return System.getProperty("os.arch");
    }

    public long totalMem() {
        return Runtime.getRuntime().totalMemory();
    }

    public long usedMem() {
        return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
    }

    public String MemInfo() {
        NumberFormat format = NumberFormat.getInstance();
        StringBuilder sb = new StringBuilder();
        long maxMemory = runtime.maxMemory();
        long allocatedMemory = runtime.totalMemory();
        long freeMemory = runtime.freeMemory();
        sb.append("Free memory: ");
        sb.append(format.format(freeMemory / 1024));
        sb.append("<br/>");
        sb.append("Allocated memory: ");
        sb.append(format.format(allocatedMemory / 1024));
        sb.append("<br/>");
        sb.append("Max memory: ");
        sb.append(format.format(maxMemory / 1024));
        sb.append("<br/>");
        sb.append("Total free memory: ");
        sb.append(format.format((freeMemory + (maxMemory - allocatedMemory)) / 1024));
        sb.append("<br/>");
        return sb.toString();

    }

    public String OsInfo() {
        StringBuilder sb = new StringBuilder();
        sb.append("OS: ");
        sb.append(this.OSname());
        sb.append("<br/>");
        sb.append("Version: ");
        sb.append(this.OSversion());
        sb.append("<br/>");
        sb.append(": ");
        sb.append(this.OsArch());
        sb.append("<br/>");
        sb.append("Available processors (cores): ");
        sb.append(runtime.availableProcessors());
        sb.append("<br/>");
        return sb.toString();
    }

    public String DiskInfo() {
        /* Get a list of all filesystem roots on this system */
        File[] roots = File.listRoots();
        StringBuilder sb = new StringBuilder();

        /* For each filesystem root, print some info */
        for (File root : roots) {
            sb.append("File system root: ");
            sb.append(root.getAbsolutePath());
            sb.append("<br/>");
            sb.append("Total space (bytes): ");
            sb.append(root.getTotalSpace());
            sb.append("<br/>");
            sb.append("Free space (bytes): ");
            sb.append(root.getFreeSpace());
            sb.append("<br/>");
            sb.append("Usable space (bytes): ");
            sb.append(root.getUsableSpace());
            sb.append("<br/>");
        }
        return sb.toString();
    }
}

আমার যে বিষয়টি শুরু হয়েছে তা ওএস-তে উপলব্ধ মেমরির পরিমাণ সম্পর্কে জিজ্ঞাসা করেছিল। freeMemoryএখানে জেভিএম-তে উপলব্ধ মেমরির পরিমাণ ফেরৎ দেয় যা খুব আলাদা
তাগর

আপনার ক্লাসিটি সিস্টেমআইনফোন একটি মূলধন এবং আপনার পদ্ধতিগুলির তথ্য (), ওএসনাম (), মেমিএনফো () দিয়ে শুরু হয় না তা কি অদ্ভুত নয়?
Drswaki69

18

আপনি যদি সান জেভিএম ব্যবহার করে থাকেন এবং অ্যাপ্লিকেশনটির অভ্যন্তরীণ মেমরির ব্যবহারে আগ্রহী হন (আপনার অ্যাপ্লিকেশনটি বরাদ্দ মেমরির মধ্যে কতটা বেশি) আমি জেভিএম বিল্ট-ইন আবর্জনা সংগ্রহের লগিং চালু করতে পছন্দ করি। আপনি কেবল স্টার্টআপ কমান্ডে -verbose: gc যোগ করুন।

সান ডকুমেন্টেশন থেকে:

কমান্ড লাইন আর্গুমেন্ট-ভারবোজ: প্রতিটি সংগ্রহে জিসি তথ্য মুদ্রণ করে। নোট করুন যে -verbose: gc আউটপুটটির ফর্ম্যাটটি J2SE প্ল্যাটফর্মের প্রকাশের মধ্যে পরিবর্তিত হতে পারে। উদাহরণস্বরূপ, এখানে একটি বৃহত সার্ভার অ্যাপ্লিকেশন থেকে আউটপুট দেওয়া হয়েছে:

[GC 325407K->83000K(776768K), 0.2300771 secs]
[GC 325816K->83372K(776768K), 0.2454258 secs]
[Full GC 267628K->83769K(776768K), 1.8479984 secs]

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

325407K->83000K (in the first line)

যথাক্রমে আবর্জনা সংগ্রহের আগে এবং পরে লাইভ অবজেক্টের সম্মিলিত আকার নির্দেশ করুন। ছোট সংগ্রহের পরে গণনাটিতে এমন অবজেক্টগুলি অন্তর্ভুক্ত থাকে যা অগত্যা জীবিত নয় তবে পুনরুদ্ধার করা যায় না, কারণ তারা সরাসরি জীবিত, বা কারণ তারা মেয়াদী প্রজন্মের মধ্যে রয়েছে বা রেফারেন্স হয়েছে। প্রথম বন্ধনে সংখ্যা

(776768K) (in the first line)

স্থায়ী প্রজন্মের স্থান গণনা না করে মোট উপলব্ধ স্থান, যা বেঁচে থাকা জায়গাগুলির মধ্যে মোট গাদা বিয়োগফল। গৌণ সংগ্রহটি এক সেকেন্ডের প্রায় এক চতুর্থাংশ লেগেছিল।

0.2300771 secs (in the first line)

আরও তথ্যের জন্য দেখুন: http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html


17

থেকে এখানে

    OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
    RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
    int availableProcessors = operatingSystemMXBean.getAvailableProcessors();
    long prevUpTime = runtimeMXBean.getUptime();
    long prevProcessCpuTime = operatingSystemMXBean.getProcessCpuTime();
    double cpuUsage;
    try
    {
        Thread.sleep(500);
    }
    catch (Exception ignored) { }

    operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
    long upTime = runtimeMXBean.getUptime();
    long processCpuTime = operatingSystemMXBean.getProcessCpuTime();
    long elapsedCpu = processCpuTime - prevProcessCpuTime;
    long elapsedTime = upTime - prevUpTime;

    cpuUsage = Math.min(99F, elapsedCpu / (elapsedTime * 10000F * availableProcessors));
    System.out.println("Java CPU: " + cpuUsage);

4
আর স্মৃতি সম্পর্কে?
ড্যানিয়েল ডি লিয়ন

4
<মেমরিপুল এমএক্সবিয়ান> মেমরিপুলগুলি = নতুন অ্যারেলিস্ট <মেমরিপুল এমএক্সবিয়ান> (ম্যানেজমেন্টফ্যাক্টরি.মেটরিপুল এমএক্সবিয়ানস ()) তালিকা; দীর্ঘ ব্যবহৃতহ্যাপমেমরিএফটারলাস্টজিসি = 0; (মেমরিপুলএমএক্সবিয়ান মেমরিপুল: মেমরিপুল) এর জন্য {যদি (মেমরিপুল.সেটটাইপ ()। সমান (মেমরিটাইপ.এইচইপি)) {মেমরি ইউজেজ পুলকোলকশনমেমরিউজেজ = মেমরিপুল.সেটকলেশন ইউজেজ (); UsedHeapMemoryAfterLastGC + = পুলকোলকশন মেমরি ইউজ.সেটস (); }}
danieln

4
সিপিইউ ব্যবহারের পুনরুদ্ধারের একমাত্র উত্তরের জন্য আপনাকে ধন্যবাদ।
ম্যাথিউউ 14'15

4
এটি করা এবং সহজভাবে করার মধ্যে পার্থক্য কী operatingSystemMXBean.getProcessCpuLoad();? ওরাকল ডকুমেন্টেশন অনুসারে, এই পদ্ধতিটি জাভা ভার্চুয়াল মেশিন প্রক্রিয়াটির জন্য "সাম্প্রতিক সিপিইউ ব্যবহার" ফিরিয়ে দেয় "" তবুও আমি আপনার পদ্ধতি এবং এই পদ্ধতির মধ্যে তুলনামূলকভাবে বড় সংখ্যার পার্থক্য দেখছি।
ইশনার্ক

4
@ রবহল এখানে দুটি OperatingSystemMXBeanক্লাস রয়েছে। একটি ইন্টারফেস দেওয়া হয় java.lang। তবে এর মধ্যে আরও একটি সংস্করণ রয়েছে যা এটিকে প্রসারিত করে com.sun.management। আমি সেই পদ্ধতির কথা উল্লেখ করছিলাম সেটি OperatingSystemMXBean
হ'ল

9

জেএমএক্স, দ্য এমএক্সবিয়ানস (থ্রেডএমএক্সবিয়ান ইত্যাদি) আপনাকে মেমোরি এবং সিপিইউ ব্যবহার দেবে।

OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
operatingSystemMXBean.getSystemCpuLoad();

8

মেমরির ব্যবহারের জন্য, নিম্নলিখিতগুলি কাজ করবে,

long total = Runtime.getRuntime().totalMemory();
long used  = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();

সিপিইউ ব্যবহারের জন্য আপনাকে এটি পরিমাপ করার জন্য একটি বাহ্যিক অ্যাপ্লিকেশন ব্যবহার করতে হবে।


6

জাভা ০.৫ থেকে জেডিকে একটি নতুন সরঞ্জাম নিয়ে আসে: জে কনসোল যা আপনাকে সিপিইউ এবং মেমরির যে কোনও 1.5 বা তার পরে জেভিএমের ব্যবহার দেখাতে পারে। এটি এই প্যারামিটারগুলির চার্টগুলি করতে পারে, সিএসভিতে রফতানি করতে পারে, লোড হওয়া শ্রেণীর সংখ্যা, দৃষ্টান্তের সংখ্যা, ডেডলকস, থ্রেড ইত্যাদি প্রদর্শন করে ...


4

আপনি যদি এখানে অনেক উত্তরে পোস্ট করা রানটাইম / টোটাল মেমোরি সলিউশনটি ব্যবহার করেন (আমি এটি অনেক কিছু করেছি) তবে যদি আপনি মোটামুটি নির্ভুল / ধারাবাহিক ফলাফল চান তবে প্রথমে দুটি আবর্জনা সংগ্রহের জন্য বাধ্য করতে ভুলবেন না।

দক্ষতার জন্য জাভা সাধারণত কোনও জিসি জোর করার আগে আবর্জনা সমস্ত মেমরি পূরণ করতে দেয় এবং তারপরেও এটি সাধারণত সম্পূর্ণ জিসি হয় না, তাই রানটাইম.ফ্রিমিমারি () এর জন্য আপনার ফলাফল সর্বদা ফ্রি মেমরির "আসল" পরিমাণের মধ্যে থাকতে পারে ।

প্রথম জিসি সবকিছু পায় না, এটি বেশিরভাগ ক্ষেত্রেই পায়।

আপসুইংটি হ'ল আপনি যদি কেবল ফ্রি মেমোরি () কল করেন তবে আপনি এমন একটি নম্বর পাবেন যা একেবারে অকেজো এবং বিভিন্নভাবে পরিবর্তিত হয়, তবে 2 জিসি প্রথমটি করলে এটি খুব নির্ভরযোগ্য गेজ g এটি রুটিনটিকে অনেক ধীর করে দেয় (সেকেন্ড, সম্ভবত)।


3

জাভার রানটাইম অবজেক্টটি জেভিএমের মেমরির ব্যবহারের প্রতিবেদন করতে পারে। সিপিইউ ব্যবহারের জন্য আপনাকে ইউনিক্সের শীর্ষ বা উইন্ডোজ প্রসেস ম্যানেজারের মতো একটি বাহ্যিক ইউটিলিটি ব্যবহার করতে হবে।


2

জে কনসোল একটি চলমান জাভা অ্যাপ্লিকেশন পর্যবেক্ষণ করার একটি সহজ উপায় বা আপনি নিজের অ্যাপ্লিকেশন সম্পর্কে আরও বিস্তারিত তথ্য পেতে কোনও প্রোফাইলার ব্যবহার করতে পারেন। আমি এটির জন্য নেটবিয়ানস প্রোফাইলার ব্যবহার করতে পছন্দ করি ।


2

মেগাবাইটে বর্তমান মেমরির ব্যবহার গণনা করার জন্য এখানে কয়েকটি সাধারণ কোড দেওয়া হয়েছে:

double currentMemory = ( (double)((double)(Runtime.getRuntime().totalMemory()/1024)/1024))- ((double)((double)(Runtime.getRuntime().freeMemory()/1024)/1024));

2

আমি সিপিইউ লোড ট্র্যাক করার জন্য নিম্নলিখিত পদ্ধতিটি যুক্ত করব:

import java.lang.management.ManagementFactory;
import com.sun.management.OperatingSystemMXBean;

double getCpuLoad() {
    OperatingSystemMXBean osBean =
        (com.sun.management.OperatingSystemMXBean) ManagementFactory.
        getPlatformMXBeans(OperatingSystemMXBean.class);
    return osBean.getProcessCpuLoad();
}

আপনি এখানে আরও পড়তে পারেন



1

আপনি যদি টোম্যাট ব্যবহার করে থাকেন তবে পিএসআই প্রোবটি পরীক্ষা করে দেখুন যা আপনাকে অভ্যন্তরীণ এবং বাহ্যিক মেমরির ব্যবহারের পাশাপাশি অন্যান্য ক্ষেত্রের উপর নজর রাখতে দেয়।


0

Eclipse এর জন্য, আপনি মেমরির ব্যবহার এবং আরও তথ্যের বিশ্লেষণের জন্য টিপিটিপি (টেস্ট এবং পারফরম্যান্স সরঞ্জাম প্ল্যাটফর্ম) ব্যবহার করতে পারেন

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