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方法的代码。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 22:32:25

Java内存分析的相关文章

学java教程之java内存分析

学编程吧学java教程之java内存分析发布了,欢迎大家通过xuebiancheng8.com来访问 java的内存模型是java中非常重要的知识,也是面试的时候重点. java虚拟机的内存模型中和我们打交道多的分为这么几个区域 堆区,栈区,方法区. 其中方法区又分为常量池,静态区和方法区. 这几部分分别是干嘛的呢,堆区是用来存放new出来的对象的,堆区是应用程序共享的区域. 栈区又叫方法栈,程序在运行的时候,代码要在方法栈中运行,运行的代码需要放在方法栈中来执行,然后寄存器一行一行加载执行.

java内存分析总结

1.自带的jconsole工具. (1)如果是从命令行启动,使 JDK 在 PATH 上,运行 jconsole 即可. (2)如果从 GUI shell 启动,找到 JDK 安装路径,打开 bin 文件夹,双击 jconsole . (3)当分析工具弹出时(取决于正在运行的 Java 版本以及正在运行的 Java 程序数量),可能会出现一个对话框,要求输入一个进程的 URL 来连接, 也可能列出许多不同     的本地 Java 进程(有时包含 JConsole 进程本身)来连接. 参照htt

关于java内存分析的探讨

这些天一直都想找个机会把Java内存方面的知识整理整理,毕竟任何知识都涉及到这方面.Java内存分析是java学习的一大重点. 下面我们进入正式话题讨论: 我们知道Java内存大致分为三块:如下图 我们先大致了解下java各分区的数据存放内容: 栈区:主要为方法服务,存在许许多多的方法栈帧,在方法栈帧里开辟局部变量开辟空间,基本类型按基本数据类型数据大小开辟空间,而引用类型则开辟四个字节大小. 堆区:主要存放创建的对象数据. 方法区:主要存放加载的类,静态变量,静态初始化块,常量,以及程序运行的

J2SE快速进阶——Java内存分析

程序的执行过程 要在Java中分析内存,我们先来了解一下程序的执行过程: 正如上图所示,大致分为3个步骤: 1.最开始,我们的程序是存在于硬盘中的,当启动运行时,程序会被加载(load)到内存中去,这里的内存可以看做我们的内存条: 2.此时,内存中除了存在刚加载的程序的代码,还存在操作系统本身的代码(好吧,此句可以当做废话→_→),操作系统会找到程序中的Main方法开始执行程序: 3.第三步就是本文的重点,系统在程序执行过程中对内存的管理.在Java中,内存大致会被分为四块--heap(栈).s

Java内存分析1 - 从两个程序说起

这次看一些关于JVM内存分析的内容. 首先来看两个程序,这里是程序一:JVMStackTest,看下代码: package com.zhyea.robin.jvm; public class JVMStackTest { private static int count = 0; private void recur() { ++count; recur(); System.out.println("recur()方法执行结束"); } public static void main(

java 内存分析之方法返回值二

package Demo; class Point { private double x, y; public Point(double x, double y) { this.x = x; this.y = y; } public double getX() { return x; } public void setX(double x) { this.x = x; } public double getY() { return y; } public void setY(double y)

java 内存分析之this

package Demo; /** * this 的值是当前对象的引用 * @author Aaron * */ public class Boy { private int age; public Boy(int age) { this.age = age; } public Boy work() { this.sayHi(); return this; } public void sayHi() { System.out.println("中华人民共和国"); } public s

菜鸟学Java(二十三)——Java内存分析

我们常说的Java内存主要分为四大块(寄存器不在考虑之内,我们无法用代码来操控它):stack(栈).heap(堆).data segment(数据区).code segment(代码区).它们的主要用途如下图所示: 而在上面四个当中,我们经常谈论的是右边那两个家伙--stack和heap.今天我们就来聊聊Java代码在运行的过程中,在stack和heap中到底是什么样子的吧. 我们先看下面一段代码: public static void main(String[] args) { TestRe

Java内存分析工具

内存分析工具 IDEA插件(VisualVM Launcher) 执行main函数的时候,同时启动jvisualvm,实时查看资源消耗情况.如图效果: Eclipse Memory Analyzer Open Source 原文地址:https://www.cnblogs.com/shengulong/p/11762236.html