Java程式設定最小和最大堆大小


Java堆是用於儲存物件並在Java虛擬機器中將其表示為例項的特定記憶體區域。只要環境中執行著某些應用程式,Java堆就可以在兩個執行緒之間共享。堆在棧記憶體中排序,並在物件在JVM中建立後遵循後進先出 (LIFO) 方法

當堆記憶體的大小與棧相比時,垃圾收集器會自動清除多餘的物件。在Java中,堆記憶體分為三個部分:

  • 新生代堆

  • 老年代堆

  • 永久代堆

新生代堆 - 在特定操作期間分配到記憶體的新建立的物件。

  • 它有兩個主要部分:伊甸園區倖存者區。倖存者區可以分為兩個部分:Survivor1Survivor2

  • 新建立的物件由伊甸園區函式空間處理。

  • 如果伊甸園區已滿,則會發生次要垃圾回收,並且活動物件將移動到倖存者區。

  • 倖存者區操作之後,整個節點將被轉移到老年代堆

老年代堆 - 當分配的年齡與新生代匹配時,它們將移動到老年代部分。它是長期存活物件的記憶體區域。主要垃圾回收操作在老年代部分執行以收集一些死亡物件。

永久代堆 - 可以使用永久代來儲存元資料。它是類和方法包的過程。Java虛擬機器也為永久代有一個完整的目錄。此空間中的垃圾由完全垃圾回收操作的一部分清理。

在Java中設定最小和最大堆大小的演算法

  • 步驟1 - 開始

  • 步驟2 - 宣告一個數組。

  • 步驟3 - 從索引1開始排序。

  • 步驟4 - 不要從0開始排序。

  • 步驟5 - 如果可用,左子節點位於[2*i]。

  • 步驟6 - 如果可用,右子節點位於[2*i+1]。

  • 步驟7 - 如果可用,父節點位於[i/2]。

  • 步驟8 - 結束

語法

Heapify(array, size, i)
  set i as largest
  leftChild = 2i + 1
  rightChild = 2i + 2
  
  if leftChild > array[largest]
set leftChildIndex as largest
  if rightChild > array[largest]
set rightChildIndex as largest

  swap array[i] and array[largest]

MaxHeap(array, size)
  loop from the first index of non-leaf node down to zero
call heapify

For Min-Heap operation, leftChild and rightChild both will must be larger than the parent for all.

在此語法中,我們應用了堆邏輯來構建設定Java最小和最大堆大小的程式碼。這裡有兩個可能的函式:

  • wrapper.java.initmemory - 最小堆大小。預設值為256 MB

  • wrapper.java.maxmemory - 最大堆大小。預設值為1024 MB

不同的方法

以下是設定最小和最大堆大小的不同方法:

使用執行時類

我們編寫了這個Java程式,可以使用它來顯示堆記憶體統計資訊。請看。

示例1

import java.io.*;
import java.lang.*;
import java.util.*;
public class heapMemorybytp {
   public static void main(String[] args){
      double mb = 1000000;
      Runtime r = Runtime.getRuntime();
      System.out.println("Max memory alloted"+ " " + r.maxMemory() / mb);
      System.out.println("Initial memory present"+ " " + r.totalMemory() / mb);
      System.out.println("Free memory available"+ " " + r.freeMemory() / mb);
      System.out.println("Consume memory by the process"+ " "+ (r.totalMemory() - r.freeMemory()) / mb);
   }
}

輸出

Max memory alloted 1073.741824
Initial memory present 270.532608
Free memory available 268.466176
Consume memory by the process 2.066432

使用 -Xmx 

如果我們想在Java中設定最大堆值,我們可以使用Java直譯器的-Xmx選項。

最大堆的操作如下:

  • getMax() − 它返回根元素作為最大值。此操作的時間複雜度為O(1)

  • extractMax() − 從最大堆中移除最大元素。此操作的時間複雜度為O(Log n),因為此操作需要透過在移除根節點後呼叫heapify() 方法來維護堆屬性。

  • insert() − 插入一個新鍵需要O(Log n) 時間。我們在樹的末尾新增一個新鍵。如果新鍵小於其父鍵,則我們不需要執行任何操作。否則,我們需要向上遍歷以修復違反的堆屬性。

示例2

import java.io.*;
import java.lang.*;
import java.util.*;
public class heaptheMemorybytp {
   public static void main(String[] args){
      double mb = 10000000;
      Runtime r = Runtime.getRuntime();
      System.out.println("Max memory alloted here" + " " + r.maxMemory() / mb);
      System.out.println("Initial memory we have here available" + " " + r.totalMemory() / mb);
      System.out.println("Free memory we have now" + " " + r.freeMemory() / mb);
      System.out.println("Consumed memory by the process"+ " "+ (r.totalMemory() - r.freeMemory()) / mb);
   }
}

輸出

Max memory alloted here 107.3741824
Initial memory we have here available 27.0532608
Free memory we have now 26.8466176
Consumed memory by the process 0.2066432

示例2 A

public class maxHeapoperation {
   public int capacity;
   public int [] mH;
   public int currentSize;
   public maxHeapoperation(int capacity){
      this.capacity=capacity;
      mH = new int [capacity+1];
      currentSize =0;
   }
   public void createHeap(int [] arrA){
      if(arrA.length>0){
         for(int i=0;i<arrA.length;i++){
            insert(arrA[i]);
         }
      }
   }
   public void display(){
      for(int i=1;i<mH.length;i++){
         System.out.print(" " + mH[i]);
      }
      System.out.println("");
   }
   public void insert(int x) {
      if(currentSize==capacity){
         System.out.println("heap is full");
         return;
      }
      currentSize++;
      int idx = currentSize;
      mH[idx] = x;
      bubbleUp(idx);
   }
   public void bubbleUp(int pos) {
      int parentIdx = pos/2;
      int currentIdx = pos;
      while (currentIdx > 0 && mH[parentIdx] < mH[currentIdx]) {
         swap(currentIdx,parentIdx);
         currentIdx = parentIdx;
         parentIdx = parentIdx/2;
      }
   }
   public int extractMax() {
      int max = mH[1];
      mH[1] = mH[currentSize];
      mH[currentSize] = 0;
      sinkDown(1);
      currentSize--;
      return max;
   }

   public void sinkDown(int k) {
      int greatest = k;
      int leftChildIdx = 2 * k;
      int rightChildIdx = 2 * k+1;
      if (leftChildIdx < heapSize() && mH[greatest] < mH[leftChildIdx]) {
         greatest = leftChildIdx;
      }
      if (rightChildIdx < heapSize() && mH[greatest] < mH[rightChildIdx]) {
         greatest = rightChildIdx;
      }
      if (greatest != k) {
         swap(k, greatest);
         sinkDown(greatest);
      }
   }
   public void swap(int a, int b) {
      int temp = mH[a];
      mH[a] = mH[b];
      mH[b] = temp;
   }
   public boolean isEmpty() {
      return currentSize == 0;
   }
   public int heapSize(){
      return currentSize;
   }
   public static void main(String args[]){
      int arrA [] = {16,10,97,7,10,2001,31,10,22};
      System.out.print("Original Array Is Here: ");
      for(int i=0;i<arrA.length;i++){
         System.out.print("" + arrA[i]);
      }
      maxHeapoperation m = new maxHeapoperation(arrA.length);
      System.out.print("\nMax-Heap After Operation : ");
      m.createHeap(arrA);
      m.display();
      System.out.print("Extract Max Hep After Operation:");
      for(int i=0;i<arrA.length;i++){
         System.out.print("" + m.extractMax());
      }
   }
}

輸出

Original Array Is Here: 16 10  97  7  10 2001  31  10 22
Max-Heap After Operation : 9722 31107 1016 010
Extract Max Hep After Operation:9731  221610  101070

使用 -Xms 

如果我們想在Java中設定最小堆值,我們可以使用Java直譯器的-Xms選項。

最小堆的操作如下:

  • getMin() − 它返回根元素作為最小值。此操作的時間複雜度為O(1)。

  • extractMin() − 從最小堆中移除最小元素。此操作的時間複雜度為O(Log n),因為此操作需要透過在移除根節點後呼叫heapify()來維護堆屬性。

  • insert() − 插入一個新鍵需要O(Log n) 時間。我們在樹的末尾新增一個新鍵。如果新鍵大於其父鍵,則我們不需要執行任何操作。否則,我們需要向上遍歷以修復違反的堆屬性。

示例3

import java.io.*;
import java.lang.*;
import java.util.*;
public class heaptheMemorybytp {
   public static void main(String[] args){
      double mb = 10000000;
      Runtime r = Runtime.getRuntime();
      System.out.println("Max memory we have in hand"+ " " + r.maxMemory() / mb);
      System.out.println("Initial memory has given"+ " " + r.totalMemory() / mb);
      System.out.println("Free memory is available here" + " " + r.freeMemory() / mb);
      System.out.println("Consume memory by the process"+ " "+ (r.totalMemory() - r.freeMemory()) / mb);
   }
}

輸出

Max memory we have in hand 107.3741824
Initial memory has given 27.0532608
Free memory is available here 26.8466176
Consume memory by the process 0.2066432

示例3 A

public class minHeapoperation {
   public int capacity;
   public int [] mH;
   public int currentSize;
   public minHeapoperation (int capacity){
      this.capacity=capacity;
      mH = new int [capacity+1];
      currentSize =0;
   }
   public void createHeap(int [] arrA){
      if(arrA.length>0){
         for(int i=0;i<arrA.length;i++){
            insert(arrA[i]);
         }
      }
   }
   public void display(){
      for(int i=1;i<mH.length;i++){
         System.out.print(" " + mH[i]);
      }
      System.out.println("");
   }
   public void insert(int x) {
      if(currentSize==capacity){
         System.out.println("Heap is full. I Am Really Sorry Buddy!");
         return;
      }
      currentSize++;
      int idx = currentSize;
      mH[idx] = x;
      bubbleUp(idx);
   }

   public void bubbleUp(int pos) {
      int parentIdx = pos/2;
      int currentIdx = pos;
      while (currentIdx > 0 && mH[parentIdx] > mH[currentIdx]) {

         swap(currentIdx,parentIdx);
         currentIdx = parentIdx;
         parentIdx = parentIdx/2;
      }
   }

   public int extractMin() {
      int min = mH[1];
      mH[1] = mH[currentSize];
      mH[currentSize] = 0;
      sinkDown(1);
      currentSize--;
      return min;
   }

   public void sinkDown(int k) {
      int smallest = k;
      int leftChildIdx = 2 * k;
      int rightChildIdx = 2 * k+1;
      if (leftChildIdx < heapSize() && mH[smallest] > mH[leftChildIdx]) {
         smallest = leftChildIdx;
      }
      if (rightChildIdx < heapSize() && mH[smallest] > mH[rightChildIdx]) {
         smallest = rightChildIdx;
      }
      if (smallest != k) {

         swap(k, smallest);
         sinkDown(smallest);
      }
   }

   public void swap(int a, int b) {
      int temp = mH[a];
      mH[a] = mH[b];
      mH[b] = temp;
   }
   public boolean isEmpty() {
      return currentSize == 0;
   }

   public int heapSize(){
      return currentSize;
   }

   public static void main(String args[]){
      int arrA [] = {16,10,1997,7,10,2001,10,31,2022};
      System.out.print("Original Array Set Is Here, Have A Look : ");
      for(int i=0;i<arrA.length;i++){
         System.out.print("  " + arrA[i]);
      }
      minHeapoperation m = new minHeapoperation (arrA.length);
      System.out.print("\nMin-Heap Is Here Buddy : ");
      m.createHeap(arrA);
      m.display();
      System.out.print("Extract Min Heap After The Operation:");
      for(int i=0;i<arrA.length;i++){
         System.out.print("  " + m.extractMin());
     }
   }
}

輸出

Original Array Set Is Here, Have A Look :16  10  1997  7  10  2001  10  31  2022
Min-Heap Is Here Buddy :  7 10 10 16 10 2001 1997 31 2022
Extract Min Heap After The Operation:  7  10  10  10  16  31  1997  2001  2022

結論

在今天的這篇文章中,我們學習了透過遵循語法和演算法,使用一些可能的Java程式碼來設定最小和最大堆大小的過程。希望這篇文章能幫助您理解這裡提到的堆大小過程的操作方法。

更新於:2024年10月15日

瀏覽量:586

開啟您的職業生涯

完成課程獲得認證

開始
廣告
© . All rights reserved.