黎梨苗 劉欣
摘 要:Java程序中,java虛擬機將內存分成了兩大部分,每部分的功能不同,這與我們通常所說的內存有著一定的區(qū)別。那么,java虛擬機是如何進行內存的分功的呢?本文將結合簡單實例對java程序中的內存進行詳細解析。
關鍵詞:java虛擬機內存棧內存堆內存
Java程序中的內存分為兩大部分:一部分叫做棧(Stack)內存,另一部分叫堆(heap)內存。棧內存用來存放基本數(shù)據(jù)類型和引用數(shù)據(jù),基本數(shù)據(jù)類型如int,short,byte,float等;引用數(shù)據(jù)類型如類,接口,注解等。堆內存用來存放類中的實例化對象即用new關鍵字創(chuàng)建的對象,如 new animal(),這個數(shù)據(jù)就存放堆內存里。通過一個簡單實例對兩部分內存做詳細分析。[1]
一、簡單實例
class Student{
int age;String name;
Student (int age,String name){
this age=age;String name=name;}
void listening(){
System.out.print(“學生正在聽課”);}
public static void main(String[] args){
Student stu1=new Student(8,”張三”);
Student stu1=new Student(12,”李四”);
stu1.listening();}}
二、實例內存分配解析
上述實例中,定義了兩個基本數(shù)據(jù)類型的變量age與name;一個一般方法;在主函數(shù)內創(chuàng)建了兩個對象。內存分配解析如下:
棧內存用來存放基本數(shù)據(jù)類型的變量及對象的引用地址,在實例中的基本數(shù)據(jù)類型為int age、String name; 對象的引用為 Student stu1、Student stu2.而堆內存用來存放new出來的對象即存放上例中的new Student(8,”張三”)與new Student(12,”李四”),如圖中所示。另外,通常在堆內存又細分出一塊內存空間叫常量池,用來存放不常改變的量,如static修飾的量,final修飾的量,字符串常量及方法,顯然,常量池里所存放的內容具有所有實例共享的特征。實例內存分配如圖1所示。[2]
三、內存運行機制
在講內存運行機制之前,我們首先必須了解JVM即Java虛擬機,Java程序是在JVM上運行的,它是連接操作系統(tǒng)與Java程序之間的紐帶,Java程序有個特點“一次編譯,到處運行”,這正是JVM所起的作用,體現(xiàn)了Java的平臺無關性,可見,JVM在Java程序運行中起著至關重要的作用,程序的內存分配都是在JVM中進行。現(xiàn)結合上述簡單實例將Java的內存運行機制講述如下:
計算機把class student整個程序信息調入計算機內存,一旦運行程序時,JVM開始對class student整個信息進行內存分配;
1. 程序運行時,JVM自動尋找main方法,執(zhí)行第一句代碼,創(chuàng)建兩個student類的對象,在棧中分配一塊內存,存放兩個指向堆內存的對象指針215346和140345。
2.JVM讀到下面兩條語句時,
Student stu1=new Student(8,”張三”);
Student stu1=new Student(12,”李四”);
檢測到age,name是局部變量,因此會把age,name放在棧中,把對象指針指向堆內存的內容即把相應的“8,張三”與“12,李四”賦給age與name.[3]
3.當上面兩條語句執(zhí)行完了,JVM立即釋放變量ageg與name;但stu1與stu2還在堆中,并沒有釋放掉,因為可能還有其他變量指向這兩個變量。
4.JVM繼續(xù)讀取語句stu1.listening();這時從常量池中調用listening()方法給stu1對象來完成操作,JVM完成對象stu1對listening()方法的算法計算。由于listening()方法是存放于常量池中供所有類對象共享的,因此,JVM運行完語句stu1.listening()后,listening方法依舊在常量池中。
以上就是Java中內存機制運行的介紹。
結語
棧內存的數(shù)據(jù)和堆內存的數(shù)據(jù)不是同步釋放的。方法結束時,棧中的局部變量立即釋放,但是堆中對象不一定釋放。因為可能有其他變量也指向了這個對象,直到棧中沒有變量指向堆中的對象時,它才釋放,并且還不是馬上釋放,要等垃圾回收掃描時才可以被釋放。
參考文獻
[1]章婧,盧凱,周旭,Java內存行為研究,小型微型計算機系統(tǒng),2011, 32(8):1617-1621.
[2]李杰文,Java程序內存使用分析技術研究,中國礦業(yè)大學,2016,10(12):32-37.
[3]彭天昊,JAVA語言內存分配的探討,凱里學院學報,2009, 27(6):93-95.