1. 程式人生 > >驗證執行時常量池在JDK1.7被移到Java堆中

驗證執行時常量池在JDK1.7被移到Java堆中

JDK1.6程式碼執行及其結果

/**
 * VM options:-Xms10M -Xmx20M -XX:PermSize=10M -XX:MaxPermSize=10M -XX:-UseGCOverheadLimit
 */
public class StringIntern {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        int i = 0;
        while(true){
            list.add(String.valueOf(i++).intern());
        }
    }
}

JDK1.6執行結果
JDK1.7程式碼執行及其結果

/**
 * VM options:-Xms10M -Xmx20M -XX:PermSize=10M -XX:MaxPermSize=10M -XX:-UseGCOverheadLimit
 */
public class StringIntern {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        int i = 0;
        while(true){
            list.add(String.valueOf(i++).intern());
        }
    }
}

JDK1.8執行結果

從上面的Java6,Java7,Java8的執行結果可以看出,在Java6時丟擲永久代異常,說明執行時常量池存在於方法區,在Java7中丟擲堆異常,說明執行時常量池此時在Java堆中了,Java8不支援PerSize永久代的參說設定,Java8永久代已被移除

相關推薦

驗證執行常量JDK1.7Java

JDK1.6程式碼執行及其結果 /** * VM options:-Xms10M -Xmx20M -XX:PermSize=10M -XX:MaxPermSize=10M -XX:-UseGCOverheadLimit */ public class

02.字串常量 ? class常量? 執行常量?

java物件建立流程: 簡介: 這幾天在看Java虛擬機器方面的知識時,看到了有幾種不同常量池的說法,然後我就去CSDN、部落格園等上找資料,裡面說的內容真是百花齊放,各自爭豔,因此,我好好整理了一下,將我自認為對的理解寫下來與大家共同探討: 在Java的記憶體分配中,總共3種

jvm虛擬機器 class檔案常量執行常量

jvm虛擬機器 class檔案常量池與執行時常量池 class檔案常量池 java檔案編譯後生成class檔案,裡面存有兩部分內容: 類的版本、欄位、方法、介面等描述資訊。(欄位是指我們平時在介面或類裡宣告的各種變數 int a 等) 常量池:存放編譯期生成的字

String的intern()方法 與執行常量(方法區)

String的intern()方法 與執行時常量池(方法區) 在你看這篇文章時我假設你已經瞭解jvm記憶體 1.String.intern()是一個Native方法,作用是:如果字串常量池存在字串相等(equals() )的字串物件,就返回此常量池中的String物件。否則將Stri

JVM 記憶體模型:執行常量

1. 前言 最近研究Java基礎知識。發現Java執行時常量池和String字串有些一些細節的地方,值得我們注意的地方,最為一個Java開發人員對於這種java基本特性和JVM虛擬機器的記憶體模型我們需要去深入研究和掌握。 2. 執行時常量池 執行時常量池存在於方法區中,用於存放

℃江的觀後感 -- Java 虛擬機器的方法區、直接記憶體和執行常量

方法區 我們知道方法區,當然是和方法有關,Java虛擬機器的作用就兩個,儲存、運算。其實我們叫其方法區,說明和儲存東西有關,但是存什麼呢?這塊儲存的是虛擬機器載入的類資訊,常亮,靜態變數和有個就是即使編譯後的程式碼等資料。方法區一般在hotspot被稱為永久代

Java記憶體區域——直接記憶體和執行常量

執行時常量池是屬於方法區的一塊,class檔案中除了有類的版本、欄位、方法、介面等描述資訊以外,還有一項資訊就是常量池,那麼,這個常量池是幹什麼的呢?它就是用來存放編譯期生成的各種字面量以及符號引用,這部分內容將在類載入後,進入方法區的執行時常量池中存放。舉個例子 基本

後端---Java常量(字串常量、class常量執行常量)

在Java的記憶體分配中,總共3種常量池: 在JDK1.7之前執行時常量池邏輯包含字串常量池存放在方法區, 此時hotspot虛擬機器對方法區的實現為永久代 在JDK1.7 字串常量池被從方法區拿到了堆中, 這裡沒有提到執行時常量池,也就是說字串常量池被單獨拿到堆,執行時常量池剩下

Java虛擬機器的靜態常量執行常量

(靜態)常量池:用於存放編譯器生成的各種字面量和符號引用(符號引用區別於直接引用,後者在class位元組碼檔案被虛擬機器解析之後,符號引用將被替換為直接引用)。 執行時常量池:(靜態)常量池中的內容在類載入(這裡的類載入指class位元組碼檔案經過載入連線初始化的過程)後存放入方法區的執

常量執行常量

一、執行時常量池簡介 執行時常量池(Runtime Constant Pool),它是方法區的一部分。Class檔案中除了有類的版本、欄位、方法、介面等描述等資訊外,還有一項資訊是常量池(Constant Pool Table),用於存放編譯期生成的各種字面量和符號引用,這部分內容將在類載入後存放到常量池中。

Java常量(字串常量、class常量執行常量)

簡介: 這幾天在看Java虛擬機器方面的知識時,看到了有幾種不同常量池的說法,然後我就去CSDN、部落格園等上找資料,裡面說的內容真是百花齊放,各自爭豔,因此,我好好整理了一下,將我自認為對的理解寫下來與大家共同探討: 在Java的記憶體分配中,總共3種常量

String放入執行常量的時機與String.intern()方法解惑

執行時常量池概述 Java執行時常量池中主要存放兩大類常量:字面量和符號引用。字面量比較接近於Java語言層面的常量概念,如文字字串、宣告為final的常量值等。 而符號引用則屬於編譯原理方面的概念,包括了下面三類常量: - 類和介面的全限定名(包名+類

JVM執行資料區域 —— 程式計數器、Java虛擬機器棧、本地方法棧、Java、方法區、執行常量

java虛擬機器執行時資料區域的概括圖如下所示: 下面將對執行時資料區進行講解 程式計數器 1、說明:程式計數器可以看做是當前執行緒所執行的位元組碼的行號指示器。其實通俗點講就是記錄class檔案執行到哪一行 2、注意的點: (1)因為CPU執

Java 中級 學習筆記 1 JVM的理解以及新生代GC處理流程和常量執行常量、字串常量的理解

寫在最前 從畢業到現在已經過去了差不多一年的時間,工作還算順利,但總是離不開CRUD ,我覺得這樣下去肯定是不行的,溫水煮青蛙,勢必有一天,會昏昏沉沉的迷失在溫水裡。所以,需要將之前學習JAVA 當中一些中高階部分的知識需要進行學習和記錄,並將其整理部落格,一起成長,一起努力。 JVM JAVA虛擬機器在執行

JVM詳解之:執行常量

[toc] # 簡介 JVM在執行的時候會對class檔案進行載入,連結和初始化的過程。class檔案中定義的常量池在JVM載入之後會發生什麼神奇的變化呢?快來看一看吧。 # class檔案中的常量池 之前我們在講class檔案的結構時,提到了每個class檔案都有一個常量池,常量池中存了些什麼東西呢

Class常量執行常量、字串常量的一些思考

## Class常量池、執行時常量池、字串常量池 ### class常量池 java程式碼經過編譯之後都成了xxx.class檔案,這是java引以為傲的可移植性的基石。class檔案中,在CAFEBABE、主次版本號之後就是常量池入口了,入口是一個u2型別的資料,也就是佔據2個位元組,用來給常量池的容量

C#兩種常量型別,readonly(執行常量)與const(編譯常量)

C#中有兩種常量型別,分別為readonly(執行時常量)與const(編譯時常量),本文將就這兩種型別的不同特性進行比較並說明各自的適用場景。 工作原理 readonly為執行時常量,程式執行時進行賦值,賦值完成後便無法更改,因此也有人稱其為只讀變數

JVM 常量、運行常量、字符串常量

methods pen one jdk 1.7 number open nature isp var 常量池:   即class文件常量池,是class文件的一部分,用於保存編譯時確定的數據。 保存的內容如下圖:    1 D

Linux安裝JDK錯誤:-bash: /usr/java/jdk1.7.0_71/bin/java: /lib/ld-linux.so.2: bad ELF interpreter:

安裝JDK出現錯誤:-bash: /usr/java/jdk1.7.0_71/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: No such fi 1、錯誤描述:安裝好jdk之後,通過java -version,javac,java等命令

IntelliJ IDEA-2018.2執行發生異常: Error:(1, 1) java: 非法字元: '\ufeff' (十八)

原因:    Eclipse智慧的把UTF-8+BOM檔案轉為普通的UTF-8檔案,Windows記事本在修改UTF-8檔案時自作聰明地在檔案開頭新增BOM導致的,所以才會導致IDEA不能正確讀取.java檔案從而程式出錯。   解決:在IDEA中