zoukankan      html  css  js  c++  java
  • Java内存分析

    前言

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

    概述

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

     这里写图片描写叙述

    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++中的指针。构造函数,传值调用,传址调用等有帮助。

    假设展望一下这些基础知识的潜在价值,这也许对我今后优化自己的代码,降低内存消耗有帮助吧!

  • 相关阅读:
    Windows上使用“LogView”打开大文件
    windows CMD命令查看局域网内所有主机名及IP
    解决Sqlserver 2008 R2在创建登录名出错"此版本的 Microsoft Windows 不支持 MUST_CHANGE 选项。 (Microsoft SQL Server,错误: 15195)"
    解决 ASP.NET 编辑错误"CS0006: 未能找到元数据文件C:WINDOWSassemblyGAC_32System.EnterpriseServices2.0.0.0__b03f5f7f11d50a3aSystem.EnterpriseServices.dll"
    ASP 未结束的字符串常量
    Godaddy ssl续费更新问题总结
    [转]How to query posts filtered by custom field values
    SqlServer 在查询结果中如何过滤掉重复数据
    [UE4]C++的const类成员函数
    [UE4]C++三种继承方式
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7063986.html
Copyright © 2011-2022 走看看