zoukankan      html  css  js  c++  java
  • JVM内存模型

    实际上,JVM内存可以分为堆(Heap),栈(Track),方法区(Method Area)

    堆(Heap):

    ①JVM管理的内存中最大的一块,唯一的目的就是存放对象实例,比如 Object obj = new Object(); new Object() 就存放在堆中

    如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出 OutOfMemoryError 异常

    ③该区域被所有线程共享

    栈(track):

    ①每个线程有自己的独立的栈

    ②这个独立的栈用来存储方法参数、局部变量、临时变量

    如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError 异常

    ④如果虚拟机栈可以动态扩展,当扩展时无法申请到足够的内存时会抛出OutOfMemoryError 异常

    方法区(Method Area):

    ①存放已被JVM加载的类的信息:

      类的基本信息:每个类的全限定名、每个类的直接超类的全限定名、该类是类还是接口、该类型的访问修饰符、直接超接口的全限定名的有序列表

      已装载类的详细信息:运行时常量池静态变量、字段信息、方法信息、到类classloader的引用、到类class的引用

    当方法区无法满足内存分配需求时,将抛出 OutOfMemoryError 异常

    ③该区域被所有线程共享

    下面举例:

    对于成员变量和局部变量:成员变量就是方法外部,类的内部定义的变量;局部变量就是方法或语句块内部定义的变量。局部变量必须初始化。 
    形式参数是局部变量,局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。 
    成员变量存储在堆中的对象里面,由垃圾回收器负责回收。 
    如以下代码:

    class BirthDate {
        private int day;
        private int month;
        private int year;
        BirthDate(int day, int month, int year) {
            this.day = day;
            this.month = month;
            this.year = year;
        }
        // 省略get,set方法………
    }
    
    public class Test {
        public static void main(String[] args) {
            int date = 9;
            Test test = new Test();
            test.change(date);
            BirthDate d1 = new BirthDate(7, 7, 1970);
        }
        private void change(int i) {
            i = 1234;
        }
    }

    对于以上这段代码,date为局部变量,i,d,m,y都是形参为局部变量,day,month,year为成员变量。下面分析一下代码执行时候的变化: 
    1. main方法开始执行:int date = 9; 
    date局部变量,基础类型,引用和值都存在栈中。 
    2. Test test = new Test(); 
    test为对象引用,存在栈中,对象(new Test())存在堆中。 
    3. test.change(date); 
    i为局部变量,引用和值存在栈中。当方法change执行完成后,i就会从栈中消失。 
    4. BirthDate d1= new BirthDate(7,7,1970);  
    d1 为对象引用,存在栈中,对象(new BirthDate())存在堆中,其中d,m,y为局部变量存储在栈中,且它们的类型为基础类型,因此它们的数据也存储在栈中。 day,month,year为成员变量,它们存储在堆中(new BirthDate()里面)。当BirthDate构造方法执行完之后,d,m,y将从栈中消失。 
    5.main方法执行完之后,date变量,test,d1引用将从栈中消失,new Test(),new BirthDate()将等待垃圾回收。

    图片引用来自:

    https://blog.csdn.net/danielantony/article/details/53572358

    部分引用自:

    https://www.cnblogs.com/dingyingsi/p/3760447.html

    https://www.cnblogs.com/liujunming/p/4391401.html

    https://www.cnblogs.com/langtianya/p/4441206.html

     

  • 相关阅读:
    VS2008 环境中完美搭建 Qt 4.7.4 静态编译的调试与发布 Inchroy's Blog 博客频道 CSDN.NET
    编写可丢弃的代码
    c++ using namespace std; 海明威 博客园
    解决MySQL server has gone away
    nginx upstream 调度策略
    (2006, 'MySQL server has gone away') 错误解决 dba007的空间 51CTO技术博客
    Linux IO模型漫谈(2) 轩脉刃 博客园
    redis源码笔记 initServer 刘浩de技术博客 博客园
    MySQLdb批量插入数据
    词库的扩充百度百科的抓取你知道这些热词吗? rabbit9898 ITeye技术网站
  • 原文地址:https://www.cnblogs.com/convict/p/10871034.html
Copyright © 2011-2022 走看看