আমার জাভাতে সার্ভারের জন্য সিপিইউ এবং মেমরির ব্যবহার পরীক্ষা করা দরকার, যে কেউ কীভাবে এটি করতে পারে তা জানেন?
আমার জাভাতে সার্ভারের জন্য সিপিইউ এবং মেমরির ব্যবহার পরীক্ষা করা দরকার, যে কেউ কীভাবে এটি করতে পারে তা জানেন?
উত্তর:
আপনি যদি জভিএম-তে মেমরির জন্য বিশেষভাবে সন্ধান করছেন:
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/>");
তবে এগুলি কেবল অনুমান হিসাবে নেওয়া উচিত ...
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
এখানে জেভিএম-তে উপলব্ধ মেমরির পরিমাণ ফেরৎ দেয় যা খুব আলাদা
আপনি যদি সান জেভিএম ব্যবহার করে থাকেন এবং অ্যাপ্লিকেশনটির অভ্যন্তরীণ মেমরির ব্যবহারে আগ্রহী হন (আপনার অ্যাপ্লিকেশনটি বরাদ্দ মেমরির মধ্যে কতটা বেশি) আমি জেভিএম বিল্ট-ইন আবর্জনা সংগ্রহের লগিং চালু করতে পছন্দ করি। আপনি কেবল স্টার্টআপ কমান্ডে -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
থেকে এখানে
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);
operatingSystemMXBean.getProcessCpuLoad();
? ওরাকল ডকুমেন্টেশন অনুসারে, এই পদ্ধতিটি জাভা ভার্চুয়াল মেশিন প্রক্রিয়াটির জন্য "সাম্প্রতিক সিপিইউ ব্যবহার" ফিরিয়ে দেয় "" তবুও আমি আপনার পদ্ধতি এবং এই পদ্ধতির মধ্যে তুলনামূলকভাবে বড় সংখ্যার পার্থক্য দেখছি।
OperatingSystemMXBean
ক্লাস রয়েছে। একটি ইন্টারফেস দেওয়া হয় java.lang
। তবে এর মধ্যে আরও একটি সংস্করণ রয়েছে যা এটিকে প্রসারিত করে com.sun.management
। আমি সেই পদ্ধতির কথা উল্লেখ করছিলাম সেটি OperatingSystemMXBean
মেমরির ব্যবহারের জন্য, নিম্নলিখিতগুলি কাজ করবে,
long total = Runtime.getRuntime().totalMemory();
long used = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
সিপিইউ ব্যবহারের জন্য আপনাকে এটি পরিমাপ করার জন্য একটি বাহ্যিক অ্যাপ্লিকেশন ব্যবহার করতে হবে।
জাভা ০.৫ থেকে জেডিকে একটি নতুন সরঞ্জাম নিয়ে আসে: জে কনসোল যা আপনাকে সিপিইউ এবং মেমরির যে কোনও 1.5 বা তার পরে জেভিএমের ব্যবহার দেখাতে পারে। এটি এই প্যারামিটারগুলির চার্টগুলি করতে পারে, সিএসভিতে রফতানি করতে পারে, লোড হওয়া শ্রেণীর সংখ্যা, দৃষ্টান্তের সংখ্যা, ডেডলকস, থ্রেড ইত্যাদি প্রদর্শন করে ...
আপনি যদি এখানে অনেক উত্তরে পোস্ট করা রানটাইম / টোটাল মেমোরি সলিউশনটি ব্যবহার করেন (আমি এটি অনেক কিছু করেছি) তবে যদি আপনি মোটামুটি নির্ভুল / ধারাবাহিক ফলাফল চান তবে প্রথমে দুটি আবর্জনা সংগ্রহের জন্য বাধ্য করতে ভুলবেন না।
দক্ষতার জন্য জাভা সাধারণত কোনও জিসি জোর করার আগে আবর্জনা সমস্ত মেমরি পূরণ করতে দেয় এবং তারপরেও এটি সাধারণত সম্পূর্ণ জিসি হয় না, তাই রানটাইম.ফ্রিমিমারি () এর জন্য আপনার ফলাফল সর্বদা ফ্রি মেমরির "আসল" পরিমাণের মধ্যে থাকতে পারে ।
প্রথম জিসি সবকিছু পায় না, এটি বেশিরভাগ ক্ষেত্রেই পায়।
আপসুইংটি হ'ল আপনি যদি কেবল ফ্রি মেমোরি () কল করেন তবে আপনি এমন একটি নম্বর পাবেন যা একেবারে অকেজো এবং বিভিন্নভাবে পরিবর্তিত হয়, তবে 2 জিসি প্রথমটি করলে এটি খুব নির্ভরযোগ্য गेজ g এটি রুটিনটিকে অনেক ধীর করে দেয় (সেকেন্ড, সম্ভবত)।
জাভার রানটাইম অবজেক্টটি জেভিএমের মেমরির ব্যবহারের প্রতিবেদন করতে পারে। সিপিইউ ব্যবহারের জন্য আপনাকে ইউনিক্সের শীর্ষ বা উইন্ডোজ প্রসেস ম্যানেজারের মতো একটি বাহ্যিক ইউটিলিটি ব্যবহার করতে হবে।
জে কনসোল একটি চলমান জাভা অ্যাপ্লিকেশন পর্যবেক্ষণ করার একটি সহজ উপায় বা আপনি নিজের অ্যাপ্লিকেশন সম্পর্কে আরও বিস্তারিত তথ্য পেতে কোনও প্রোফাইলার ব্যবহার করতে পারেন। আমি এটির জন্য নেটবিয়ানস প্রোফাইলার ব্যবহার করতে পছন্দ করি ।
আমি সিপিইউ লোড ট্র্যাক করার জন্য নিম্নলিখিত পদ্ধতিটি যুক্ত করব:
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();
}
আপনি এখানে আরও পড়তে পারেন
YourKit জাভা প্রোফাইলার একটি চমৎকার বাণিজ্যিক সমাধান। আপনি সিপিইউ প্রোফাইলিং এবং মেমরি প্রোফাইলিংয়ের ডক্সে আরও তথ্য পেতে পারেন ।
আপনি যদি টোম্যাট ব্যবহার করে থাকেন তবে পিএসআই প্রোবটি পরীক্ষা করে দেখুন যা আপনাকে অভ্যন্তরীণ এবং বাহ্যিক মেমরির ব্যবহারের পাশাপাশি অন্যান্য ক্ষেত্রের উপর নজর রাখতে দেয়।
Eclipse এর জন্য, আপনি মেমরির ব্যবহার এবং আরও তথ্যের বিশ্লেষণের জন্য টিপিটিপি (টেস্ট এবং পারফরম্যান্স সরঞ্জাম প্ল্যাটফর্ম) ব্যবহার করতে পারেন