Java内存分析

本文深入探讨Java内存分析,包括程序执行过程、内存分区以及类、对象、方法、继承、静态变量和字符串常量、多态的内存分配。通过理解这些内容,有助于优化代码并减少内存消耗。
摘要由CSDN通过智能技术生成

前言

  看代码,或许我们只能了解程序执行的先后顺序,通过内存分析,我们可以了解程序执行过程中的内存分配情况。前者是在时间维度上进行分析,后者是在空间维度上进行分析。本文目的就是将具体代码与其执行过程中的内存分配情况对应起来,使大家对这块内容有个清晰的认识。

概述

  根据下图,我们首先来介绍一下整个程序执行过程。主要分为三步:

 这里写图片描述

  1. 双击程序文件,将程序装载到内存中;
  2. 内存中本身有操作系统的代码,会找到代码中的main方法开始执行;
  3. 执行过程中的内存管理。

  补充:
  程序文件本身放在硬盘上,文件扩展名可以是.exe或者是.class等。
  内存管理即本文主要介绍的问题。内存管理过程中会将内存分为四块区域:堆区(Heap),栈区(Stack),数据区(Data Segment),代码区(Code Segment)
  总体而言,要记住以下四点:

  1.new出来的东西放到堆区;
  2.局部变量放到栈区;
  3.静态变量和字符串常量放到数据区;
  4.代码放到代码区。

  以上四点是根本准则,下面的就是具体要强调的细节了。

具体情况

类和对象

  程序执行过程中,定义的类的代码会加载到内存中的代码区;
  对象在实例化的过程中(new)产生。

这里写图片描述

  如上图所示,类C的代码会加载到代码区;在执行main方法时,c1和c2属于局部变量,会在栈区分配两块空间;new C()的过程中,会在堆区分配空间,这块空间属于某个对象,在该对象的控空间中,包括了成员变量的空间。

  备注:数组也属于引用类型,所以它的内存分配状况同对象。

方法

  方法执行时,首先为方法的形参分配空间,形参等同于局部变量,所以在栈内存分配空间。接着,采用值传递的方式,实参把值复制给形参。方法有返回值时,返回值也会在栈中有块临时内存,没有名字。
  方法执行完毕之后,为方法执行分配的局部变量及返回值的临时的空间消失。

继承

  如上图所示,如果“Class Student extends Person”,则在new Student ( )时,堆中分配的属于该对象的空间中,会同时有父对象的空间。即子类对象比父类对象大,子类对象拥有父类对象。同时具有this和super引用,分别指向整个对象和其中的父对象。

这里写图片描述

静态变量和字符串常量

  以下是一段具有静态成员变量和字符串常量的代码:

public class Cat {
    private static int sid = 0;//静态成员变量
    private String name; //成员变量
    int id;
    Cat(String name) {
        this.name = name;  
        id = sid++;
    }
    public void info(){
        System.out.println
               ("My name is "+name+" No."+id);
    }
    public static void main(String arg[]){       
        Cat mimi = new Cat("mimi"); //"mimi"为字符串常量      
        Cat pipi = new Cat("pipi");
        mimi.info(); 
        pipi.info();
    }
}

这里写图片描述

  如上图所示静态变量只有一份,存在于数据区;字符串常量也存在于数据区。

多态

  多态存在有三个条件:继承,重写,父类引用指向子类对象。内存分配情况同继承时的内存分配情况。只是当向上转型时,只能访问父类的成员变量,而在执行重写方法时,会根据实际绑定的子类对象,执行子类对象的方法。
  如:Animal a= new Dog();该对象只能访问name属性,不能访问子类对象的furColor属性。

  这里写图片描述

  动态决定执行哪段方法代码。Animal和Cat都有enjoy方法,当Animal a= new Cat(); a.enjoy();在执行过程中,会决定执行Cat中的enjoy方法的代码。

这里写图片描述

总结

  了解内存分配过程,就是在了解代码背后的故事,以上是基础的一些内容,如果要和之前学过的内容联系起来,我想这些知识或许对理解C++中的指针,构造函数,传值调用,传址调用等有帮助。如果展望一下这些基础知识的潜在价值,这或许对我今后优化自己的代码,减少内存消耗有帮助吧!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 36
    评论
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值