【JVM】Java内存区域管理

2017-02-07  本文已影响114人  maxwellyue

内容比较浅显,主要是整体结构的梳理,错误之处,欢迎指出!

java内存管理.png

1、JVM的内部结构

JVM(Java Virtual Machine)是内存的管理者。首先看JVM的内部结构图


jvm.png jvm.gif

如图所示,JVM主要包括两个子系统和两个组件。两个子系统分别是Class loader(类加载器)子系统和Execution engine(执行引擎) 子系统;两个组件分别是Runtime data area (运行时数据区域)组件和Native interface(本地接口)组件。

各部分的作用如下:

2、关于Runtime Data Area

我们关心的有:

public class Test{  
    public static void main(String args[]){  
        int date = 9;
        //date为局部变量,基本类型,引用和值都存在栈中。
        
        Test test = new Test();
        //test为对象引用,存在栈中,对象(new Test())存在堆中。
       
        test.change(date); 
        //方法中i为局部变量,引用和值存在栈中。
        //当方法change执行完成后,i就会从栈中消失。
        
        BirthDate d1= new BirthDate(7,7,1970);
        //d1为对象引用,存在栈中,对象(new BirthDate())存在堆中;
        //其中d,m,y为局部变量存储在栈中,
        //且它们的类型为基础类型,因此它们的数据也存储在栈中;
        //day,month,year为成员变量,它们存储在堆中(new BirthDate()里面)。
        //当BirthDate构造方法执行完之后,d,m,y将从栈中消失。
        //main方法执行完之后,date变量,test,d1引用将从栈中消失,
        //new Test(),new BirthDate()对象实例将等待垃圾回收。
    }    
    public void change(int i){  
        i = 1234;  
    }  
}
class BirthDate {  
    private int day;  
    private int month;  
    private int year;      
    public BirthDate(int d, int m, int y) {  
        day = d;   
        month = m;   
        year = y;  
    }  
    省略get,set方法………  
}  

一个关于final的小问题:final只对引用的"值"(也即它所指向的那个对象的内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象的变化,final是不负责的。

3、Java对象的分配和释放

Java中,内存管理是JVM自动进行的,无需人为干涉。创建对象或者变量时, JVM会自动分配内存。当JVM发现某些对象不再需要的时候,就会对该对象占用的内存进行重分配(释放)操作,而且使得分配出来的内存能够提供给所需要的对象。对象的释放则是由垃圾回收机制决定和执行的(监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等)。

4、内存溢出和内存泄漏

4.1 内存溢出

引用自:Java 内存溢出的常见情况和处理方式java中三种常见内存溢出错误的处理方法

4.2 内存泄漏

5、垃圾回收机制

6、JVM性能调优(待补充)

上一篇下一篇

猜你喜欢

热点阅读