রানটাইম.জেটআরটাইম ()। টোটাল মেমোরি () এবং ফ্রিমেমরি () কী?


146

আমি ভাবছিলাম যে রানটাইম.সেটআরটাইম () .টোটমেমোরি () , রানটাইম.সেটআরটাইম ()। ফ্রিমেমরি () এবং রানটাইম.জেটআরটাইম ()। ম্যাক্সেমোরি () কী )

আমার উপলব্ধিটি হল, Runtime.getRuntime().totalMemory()আমার প্রক্রিয়াটি যে মোট স্মৃতি ব্যবহার করছে তা ফিরিয়ে দেয়। এটা কি ঠিক?

কীভাবে freeMemory()এবং maxMemory()?

উত্তর:


195

এপিআই অনুসারে

totalMemory()

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

maxMemory()

জাভা ভার্চুয়াল মেশিনটি ব্যবহারের চেষ্টা করবে এমন সর্বোচ্চ পরিমাণে মেমরি ফিরিয়ে দেয়। যদি অন্তর্নিহিত সীমা না থাকে তবে মান Long.MAX_VALUE প্রদান করা হবে।

freeMemory()

জাভা ভার্চুয়াল মেশিনে মুক্ত মেমরির পরিমাণ ফেরত দেয় Return জিসি পদ্ধতিতে কল করার ফলে ফ্রি মেমোরির দ্বারা ফিরে আসা মান বাড়তে পারে।

আপনার প্রশ্নের রেফারেন্স ইন, maxMemory()ফেরৎ -Xmxমান।

আপনি কেন ভাবছেন যে সেখানে মোট মেমোরি () এবং একটি ম্যাক্সেমোরি (কেন) রয়েছে । উত্তরটি হ'ল জেভিএম অলসভাবে স্মৃতি বরাদ্দ করে। আপনাকে জাভা প্রক্রিয়াটি যেমন শুরু করতে দেয় তা বলুন:

java -Xms64m -Xmx1024m Foo

আপনার প্রক্রিয়াটি mb৪ এমবি মেমরি দিয়ে শুরু হয় এবং যদি এটির (1024 মিটার) বেশি প্রয়োজন হয় তবে এটি মেমরি বরাদ্দ করবে। Foo- এর জন্য JVM- র কাছে বর্তমানে উপলব্ধ totalMemory()মেমরির পরিমাণের সাথে সম্পর্কিত । যদি জেভিএমকে আরও মেমরির প্রয়োজন হয় তবে এটি অলসভাবে এটিকে সর্বোচ্চ মেমোরি পর্যন্ত বরাদ্দ করবে । আপনার সাথে চালানো হলে , মান আপনি থেকে পাওয়া এবং সমান হবে।-Xms1024m -Xmx1024mtotalMemory()maxMemory()

এছাড়াও, আপনি যদি ব্যবহৃত মেমরির পরিমাণটি নির্ভুলভাবে গণনা করতে চান তবে আপনি নিম্নলিখিত গণনা সহ এটি করুন:

final long usedMem = totalMemory() - freeMemory();

-Xmxমান সরাসরি প্রাথমিক প্রভাবিত বলে মনে হয় maxMemory()তবে আমি রিপোর্ট দেখেছি মান maxMemory()যখন প্রোগ্রাম চলছে, অল্প পরিমাণ দ্বারা বৃদ্ধি, সম্ভবত ~ 1%।
H2ONaCl

2
এটি কীভাবে আলাদা Debug.getNativeHeapFreeSize()?
ইগোরগানাপলস্কি

@ H2ONaCl হ্যাঁ, এটি সামান্য পরিবর্তিত হতে পারে, কারণ জেভিএম এর UseAdaptiveSizePolicyডিফল্টরূপে সক্ষম করা হয়েছে। এবং বিটিডাব্লু: maxMemory()= Xmx- একক বেঁচে থাকার জায়গার আকার। কেন? কারণ একই সময়ে, কেবলমাত্র একটি জীবিত স্থান ব্যবহার করা যেতে পারে।
জি ডেমেকি

236

নাম এবং মানগুলি বিভ্রান্তিকর। আপনি যদি নিখরচায় মুক্ত মেমরির সন্ধান করছেন তবে আপনাকে নিজের দ্বারা এই মানটি গণনা করতে হবে। আপনি যা পান তা তা নয়freeMemory();

নিম্নলিখিত গাইড দেখুন:

মোট মনোনীত মেমরি , এটি কনফিগার করা -Xmx মানের সমান হবে :

Runtime.getRuntime () maxMemory ()।

বর্তমান বরাদ্দ করা ফ্রি মেমরি , হ'ল নতুন অবজেক্টের জন্য প্রস্তুত বরাদ্দ স্থান । সতর্কতা এটি মোট বিনামূল্যে উপলব্ধ মেমরি নয়:

Runtime.getRuntime () freeMemory ()।

মোট মেমরি বরাদ্দ মোট বরাদ্দ স্থান সংরক্ষিত জাভা প্রক্রিয়ার জন্য:

Runtime.getRuntime () totalMemory ()।

ব্যবহৃত মেমরি , গণনা করতে হবে:

ব্যবহৃতমেমোরি = রানটাইম.জেটআরটাইম ()। মোটমেমোরি () - রানটাইম.সেটআরটাইম ()। ফ্রিমোমরি ();

মোট বিনামূল্যে মেমরি , গণনা করতে হবে:

ফ্রিমেরি = রানটাইম.জেটআরটাইম ()। ম্যাক্সেমোরি () - ব্যবহৃতমেমরি;

একটি ছবি পরিষ্কার করতে সহায়তা করতে পারে:

জাভা রানটাইম স্মৃতি


1
এ থেকে কি আলাদা Debug.getMemoryInfo()?
ইগোরগানাপলস্কি

1
নোট: ব্যবহৃত মেমরি পারে আর রেফারেন্সড বস্তু ধারণ আগামী জিসি ভেসে করা হবে না।
গ্যাব 好人 好人

@ চেনি, নিখরচায় এবং মুক্তবিহীন মেমরিটি দখল করা হবে কারণ জাভা বাইট কোড নির্দেশাবলী কেবলমাত্র "এক্সএমএক্স - Usedmemory" মেশিনে avlbl থাকলে প্রসেসর দ্বারা প্রক্রিয়াজাত করা হবে। এক্সএমএক্স হ'ল ব্যালনের সর্বাধিক ক্ষমতার মতো যা মেশিনে এএলবিএল বাতাস থেকে বায়ু প্রাপ্তির সাথে পূরণ করতে পারে, শীঘ্রই এটি বায়ু পেলে তা পূরণ করা হবে এবং এক্সএমএক্স সীমা ছাড়িয়ে গেলে এটি বিস্ফোরণ হবে। তবে মোট ফ্রিম্মোমরি জেভিএমের জন্য মেশিনে প্রকৃত এভবিএল মেমরিটি বলতে পারবে না, তবে কেবল এনএমবিআরই আছে সেখানে কোনও উপায়ই আমি মেশিনে আসল এএলবিএল মেমরিটি জানতে পেরেছিলাম যাতে আমি জানতে পারি যে আরকিডি মেমরিটি অ্যাভিএলবিএল কিনা জেভিএম পুনর্বিবেচনার জন্য নয় প্রক্রিয়া?
মারিয়া

12

এটি আরও ভালভাবে বুঝতে, নিম্নলিখিত প্রোগ্রামটি চালান (jdk1.7.x এ):

$ java -Xms1025k -Xmx1025k -XshowSettings:vm  MemoryTest

এই মুদ্রণ করবে JVM অপশন এবং ব্যবহৃত , বিনামূল্যে , মোট এবং সর্বোচ্চ JVM পাওয়া মেমরির।

public class MemoryTest {    
    public static void main(String args[]) {
                System.out.println("Used Memory   :  " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) + " bytes");
                System.out.println("Free Memory   : " + Runtime.getRuntime().freeMemory() + " bytes");
                System.out.println("Total Memory  : " + Runtime.getRuntime().totalMemory() + " bytes");
                System.out.println("Max Memory    : " + Runtime.getRuntime().maxMemory() + " bytes");            
        }
}

8

অন্যান্য সমস্ত উত্তরের কোডযুক্ত সংস্করণ (লেখার সময়):

import java.io.*;

/**
 * This class is based on <a href="http://stackoverflow.com/users/2478930/cheneym">cheneym</a>'s
 * <a href="http://stackoverflow.com/a/18375641/253468">awesome interpretation</a>
 * of the Java {@link Runtime}'s memory query methods, which reflects intuitive thinking.
 * Also includes comments and observations from others on the same question, and my own experience.
 * <p>
 * <img src="https://i.stack.imgur.com/GjuwM.png" alt="Runtime's memory interpretation">
 * <p>
 * <b>JVM memory management crash course</b>:
 * Java virtual machine process' heap size is bounded by the maximum memory allowed.
 * The startup and maximum size can be configured by JVM arguments.
 * JVMs don't allocate the maximum memory on startup as the program running may never require that.
 * This is to be a good player and not waste system resources unnecessarily.
 * Instead they allocate some memory and then grow when new allocations require it.
 * The garbage collector will be run at times to clean up unused objects to prevent this growing.
 * Many parameters of this management such as when to grow/shrink or which GC to use
 * can be tuned via advanced configuration parameters on JVM startup.
 *
 * @see <a href="http://stackoverflow.com/a/42567450/253468">
 *     What are Runtime.getRuntime().totalMemory() and freeMemory()?</a>
 * @see <a href="http://www.oracle.com/technetwork/java/javase/memorymanagement-whitepaper-150215.pdf">
 *     Memory Management in the Sun Java HotSpot™ Virtual Machine</a>
 * @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html">
 *     Full VM options reference for Windows</a>
 * @see <a href="http://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html">
 *     Full VM options reference for Linux, Mac OS X and Solaris</a>
 * @see <a href="http://www.oracle.com/technetwork/articles/java/vmoptions-jsp-140102.html">
 *     Java HotSpot VM Options quick reference</a>
 */
public class SystemMemory {

    // can be white-box mocked for testing
    private final Runtime runtime = Runtime.getRuntime();

    /**
     * <b>Total allocated memory</b>: space currently reserved for the JVM heap within the process.
     * <p>
     * <i>Caution</i>: this is not the total memory, the JVM may grow the heap for new allocations.
     */
    public long getAllocatedTotal() {
        return runtime.totalMemory();
    }

    /**
     * <b>Current allocated free memory</b>: space immediately ready for new objects.
     * <p>
     * <i>Caution</i>: this is not the total free available memory,
     * the JVM may grow the heap for new allocations.
     */
    public long getAllocatedFree() {
        return runtime.freeMemory();
    }

    /**
     * <b>Used memory</b>:
     * Java heap currently used by instantiated objects. 
     * <p>
     * <i>Caution</i>: May include no longer referenced objects, soft references, etc.
     * that will be swept away by the next garbage collection.
     */
    public long getUsed() {
        return getAllocatedTotal() - getAllocatedFree();
    }

    /**
     * <b>Maximum allocation</b>: the process' allocated memory will not grow any further.
     * <p>
     * <i>Caution</i>: This may change over time, do not cache it!
     * There are some JVMs / garbage collectors that can shrink the allocated process memory.
     * <p>
     * <i>Caution</i>: If this is true, the JVM will likely run GC more often.
     */
    public boolean isAtMaximumAllocation() {
        return getAllocatedTotal() == getTotal();
        // = return getUnallocated() == 0;
    }

    /**
     * <b>Unallocated memory</b>: amount of space the process' heap can grow.
     */
    public long getUnallocated() {
        return getTotal() - getAllocatedTotal();
    }

    /**
     * <b>Total designated memory</b>: this will equal the configured {@code -Xmx} value.
     * <p>
     * <i>Caution</i>: You can never allocate more memory than this, unless you use native code.
     */
    public long getTotal() {
        return runtime.maxMemory();
    }

    /**
     * <b>Total free memory</b>: memory available for new Objects,
     * even at the cost of growing the allocated memory of the process.
     */
    public long getFree() {
        return getTotal() - getUsed();
        // = return getAllocatedFree() + getUnallocated();
    }

    /**
     * <b>Unbounded memory</b>: there is no inherent limit on free memory.
     */
    public boolean isBounded() {
        return getTotal() != Long.MAX_VALUE;
    }

    /**
     * Dump of the current state for debugging or understanding the memory divisions.
     * <p>
     * <i>Caution</i>: Numbers may not match up exactly as state may change during the call.
     */
    public String getCurrentStats() {
        StringWriter backing = new StringWriter();
        PrintWriter out = new PrintWriter(backing, false);
        out.printf("Total: allocated %,d (%.1f%%) out of possible %,d; %s, %s %,d%n",
                getAllocatedTotal(),
                (float)getAllocatedTotal() / (float)getTotal() * 100,
                getTotal(),
                isBounded()? "bounded" : "unbounded",
                isAtMaximumAllocation()? "maxed out" : "can grow",
                getUnallocated()
        );
        out.printf("Used: %,d; %.1f%% of total (%,d); %.1f%% of allocated (%,d)%n",
                getUsed(),
                (float)getUsed() / (float)getTotal() * 100,
                getTotal(),
                (float)getUsed() / (float)getAllocatedTotal() * 100,
                getAllocatedTotal()
        );
        out.printf("Free: %,d (%.1f%%) out of %,d total; %,d (%.1f%%) out of %,d allocated%n",
                getFree(),
                (float)getFree() / (float)getTotal() * 100,
                getTotal(),
                getAllocatedFree(),
                (float)getAllocatedFree() / (float)getAllocatedTotal() * 100,
                getAllocatedTotal()
        );
        out.flush();
        return backing.toString();
    }

    public static void main(String... args) {
        SystemMemory memory = new SystemMemory();
        System.out.println(memory.getCurrentStats());
    }
}

7

রানটাইম # টোটাল মেমোরি - মেমরি যা জেভিএম এতক্ষণ বরাদ্দ করেছে। এটি প্রয়োজনীয়ভাবে যা ব্যবহার করা হচ্ছে বা সর্বোচ্চ নয়।

রানটাইম # সর্বোচ্চ মেমোরি - সর্বাধিক পরিমাণ মেমরি যা জেভিএম ব্যবহারের জন্য কনফিগার করা হয়েছে। আপনার প্রক্রিয়া এই পরিমাণে পৌঁছে গেলে, জেভিএম আরও বেশি বরাদ্দ করবে না এবং এর পরিবর্তে আরও বেশি বার জিসিকে বরাদ্দ দেবে না।

রানটাইম # ফ্রি মেমোরি - আমি নিশ্চিত নন যে এটি সর্বাধিক বা অব্যবহৃত মোট অংশ থেকে পরিমাপ করা হয়েছে কিনা। আমি অনুমান করছি এটি মোট অংশের একটি পরিমাপ যা অব্যবহৃত।


5

জেভিএম হিপ আকার আবর্জনা-সংগ্রহ ব্যবস্থার দ্বারা বর্ধনযোগ্য এবং সঙ্কুচিত হতে পারে। তবে, এটি সর্বোচ্চ মেমরির আকারের চেয়ে বেশি বরাদ্দ করতে পারে না: রানটাইম.ম্যাক্স মেমরি ory এটি সর্বাধিক স্মৃতির অর্থ। টোটাল মেমরির অর্থ বরাদ্দ হওয়া গাদা আকার। এবং ফ্রি মেমরির অর্থ মোট স্মৃতিতে উপলব্ধ আকার size

উদাহরণস্বরূপ) java -Xms20M -Xmn10M -Xmx50M ~~~। এর অর্থ হল যে jvm হ্যাপ 20 এম শুরুতে (এমএস) বরাদ্দ করা উচিত। এই ক্ষেত্রে, মোট স্মৃতি 20M হয়। ফ্রি মেমরি 20M- ব্যবহৃত আকার। যদি আরও গাদা প্রয়োজন হয়, জেভিএম আরও বেশি বরাদ্দ দেয় তবে 50 এম (এমএক্স) এর বেশি হতে পারে না। সর্বাধিক ক্ষেত্রে, মোট স্মৃতি 50M এবং বিনামূল্যে আকার 50M- ব্যবহৃত আকার। ন্যূনতম আকারের (এমএন) হিসাবে, যদি গাদাটি বেশি ব্যবহার না করা হয় তবে jvm হিপ আকারটি 10M এ সঙ্কুচিত করতে পারে।

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


1

আপনি এমবি ফর্ম্যাটে ফলাফলগুলি দেখতে পারবেন , 1024 x 1024 বিভাজন সহ যা 1 এমবি সমান ।

int dataSize = 1024 * 1024;

System.out.println("Used Memory   : " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())/dataSize + " MB");
System.out.println("Free Memory   : " + Runtime.getRuntime().freeMemory()/dataSize + " MB");
System.out.println("Total Memory  : " + Runtime.getRuntime().totalMemory()/dataSize + " MB");
System.out.println("Max Memory    : " + Runtime.getRuntime().maxMemory()/dataSize + " MB");  
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.