Java程序执行内存分析(栈、堆、方法区)
我们结合实际程序例子来对Java程序执行的内存进行分析,以对java语言有个更深的了解
注意以下代码和实际逻辑做了一些简化,目的是能够将重点放在内存分析上,把最核心的拎出来
Computer类
public class Computer {
public String brand;
public String cpuSpeed;
}
Student类
public class Student {
public String name;
public Computer computer;
public void goToSchool() {
System.out.println("去学习");
}
}
我们就来分析执行以下代码的内存状态
public static void main(String[] args) {
Computer c1 = new Computer();
c1.brand="华硕";
Student s1 = new Student();
s1.name="张三"
s1.computer=c1;
Student s2 = new Student();
s2.name="李四";
s1.goToSchool();
}
首先我们需要了解几个概念:
1、在内存中分为所谓的栈、堆、方法区
栈:自动分配的连续的空间,后进先出,通常用于存放局部变量
堆:不连续的空间,用于存放new出来的对象
方法区:方法区也是堆,用于存放类的信息(如代码),static变量、常量池
现在我们开始真正的内存分析:
其实本质上会先加载调用main方法的那个类,并为main方法开辟一个栈帧来执行该方法,但是我们这里为了简便就不在讲述main方法的相关内存分析
1、Computer c1 = new Computer();
首先我们来看第一句代码
a、首先虚拟机会在内存中查找是否存在一个叫Computer的类,如果存在,就不用再加载,如果不存在,JVM虚拟机就会去classpath路径下,也就是项目目录下去查找并加载相关的类。类的加载机制是通过一个叫类加载器的机制来执行,类加载器的作用就是将某个类的字节码文件转化为方法区中的运行时数据结构,同时堆中生成一个代表这个类的java.lang.Class对象来作为访问方法区数据的入口。
简答点说,首先,虚拟机会让Computer这个类的class字节码文件转化为方法区的运行时数据结构,就是形成一个Computer类的模板在方法区中
那么这里为了能够更好的说明和理解java程序的运行机制,这里将加载的过程简化为在方法区中形成的运行时数据结构信息为类的代码 属性、方法、静态变量和方法、常量池
以下就是
Computer c1 = new Computer()
c1.brand="华硕";
过程的内存简单分析,注意这里尤其是运行时数据结构是不严谨的,因为真实的运行时数据结构很复杂,但是我们的基本原来是没有偏离的,所以是为了更好的理解才这么简化的,如果想要了解的话,可以深入了解一些内加载器和编译原理
这里从图中我们观察到一点就是在,在java中操作对象,本质上都是通过引用来完成的,除了一些基本累心的数据以外
同上理我们可以画出以下代码的内存分析图:
Student s1 = new Student();
s1.name="张三"
s1.computer=c1;
Student s2 = new Student();
s2.name="李四";
s1.goToSchool();
图片看起来虽然很凌乱,但你仔细观察,会发现其实就是各种引用,再记住那话,类是对象的模板,就可以很容易理解上图中的内存分析
上一篇: First Steps with TensorFlow
下一篇: 记一次“Axis2客户端调用产生大量CLOSE_WAIT连接”的解决过程 博客分类: 原创 axis2webserviceGCclose_wait
推荐阅读
-
Java程序执行内存分析(栈、堆、方法区)
-
详谈java 堆区、方法区和栈区
-
详谈java 堆区、方法区和栈区
-
内存分配及变量存储位置(堆、栈、方法区常量池、方法区静态区)
-
[二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义
-
荐 【探究JVM四】Java方法执行的线程内存模型——虚拟机栈 字节码指令追踪,万字长文深入探究内部结构
-
JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )(转载)
-
JAVA堆区栈区方法区
-
OOM实战:堆内存溢出 虚拟机栈和本地方法栈溢出 jvm栈容量太小 栈帧太大 栈太小,导致线程分配少,创建更多的线程将导致oom 方法区和运行时常量池溢出
-
java堆、栈、内存分析