簡體   English   中英

初始Java堆大小意味着什么?

[英]initial Java heap size means?

所以我有一個使用Java堆的程序

-Xms5g -Xmx12g 

我已將初始Java堆大小設置為5gb,將最大堆大小設置為12gb

但是當我查看任務管理器或資源監視器時,我的程序僅使用400mb。

所以這是我的問題:

  1. 初始Java堆大小是什么意思?
  2. 如果我將初始Java堆大小設置為5gb,為什么我只看到程序上的RAM使用為400mb,而不是5gb,怎么會這樣呢? 因為初始堆意味着最小大小,對嗎?

-Xmx最大堆大小是堆可以增長到的最大大小。

-Xms初始堆大小是堆范圍的大小。 在不觸發完整GC的情況下,它不會使用超過此數量的空間。

但是,該堆分為多個區域,例如說您有一個5 GiB的初始堆,

  • 伊甸園大小為200 MB
  • 兩個100 MB的幸存者空間
  • 4.6 GB的租用空間。

當您開始使用內存時,在Linux上按需分配了被觸摸的頁面(4 KiB區域)(除非您使用選項來對它們全部進行預修飾)

您的Eden空間將很快被使用,因此前200 MB的使用速度非常快(如果在調用main之前就已經使用了很多)。 幸存者空間將在幾次較小的收集之后使用,但是最初它們可能不會被全部使用,例如說它們從未填充到超過50 MB(100 MB可用空間中),此時觸摸的總內存為200 MB + 2 * 50 MB。

一些大的對象直接進入租用空間,但是對於大多數應用程序,租用空間在很大程度上占用了較小的,壽命長的對象。 可以說,在進行了許多次較小的收集之后,大約100 MB的對象已被提升到永久性空間。

此時,即使擴展區為5 GB,也只能觸摸或分配200 + 2 * 50 + 100 MB的內存。

簡而言之,Linux延遲分配頁面,因此您必須寫頁面以使用內存。

下面以-Xms5g參數-Xms5g的最簡單的程序占用5 GB以上的內存

public static void main(String[] args) throws Exception {
  Thread.currentThread().join();
}

您正在查看錯誤的流程,或者平台有一些非常特殊的東西。 可能是因為您在Windows上,而是在查看“工作集”而不是“專用字節”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM