11.2面向对象 内存分析

JAVA 虚拟机 内存 分为三个区域 栈stack 堆heap 方法区method area (实际上方法区也在堆heap里面)
栈的特点
1.栈描述的是方法执行的内存模型 每个方法被调用 都会创建一个 栈帧 (存储局部变量 操作数 方法出口等) 记住局部变量 都在 方法的 栈帧 里面存储
2.JVM为每个线程创建一个栈
3.栈属于私有 不能共享
4. 栈的存储特性 先进后出 后进先出
5. 系统自动分配 速度快 是个连续的空间
在这里插入图片描述
方法调用分配一个栈帧 再调用 再分配 按照 先进后出 后进先出 的顺序
都调用完后 后面的先释放 最先执行的最后被释放

堆的特点 heap (一般代表对象信息 不代表类信息 类信息时指整个类的初始化 相当于第一个对象 但不是对象 方法区才是类信息)
1.堆用于存储创建好的对象和数组(数组也是对象)
2.JVM只有一个堆 被所有线程共享
3.堆是一个不连续的内存空间 分配灵活 速度慢

new XXX 就是在堆里面创建好了

方法区(又叫静态区)特点
1.jvm只有一个方法区 被所有线程共享
2.方法区实际上也是堆 只是用于存储类常量 相关的信息
3用来存放程序中永远不点地唯一内容 (类信息、Class对象、静态变量 字符串常量等)
方法区 在堆内

程序执行 分配过程
1 javac Student.java 编译 形成Class 用Java环境里面的编译器
2 java Student.class //从此开始调用虚拟机执行类
3 加载代码到空间 //首先把 Class对象(整体代码)、静态变量 静态方法 字符串常量 加载到 方法区(又叫静态区)
4 类的main 方法 Main是静态方法 (static 修饰的) 但他要放到栈里面 开辟栈空间 放到 栈的最底部
ps// 之所以可以执行这个这些方法 完全是因为 已经把代码放到了堆内的方法区
5 执行main方法的工程中 如果遇到局部变量 就放到分配好的栈帧里面
6 执行main方法的过程中, 如果遇到 方法 就再开辟一个栈帧
7 执行main方法的工程中 如果遇到新建的类 、 数组 就放到 公用堆 里面 (类的属性、方法 什么的 都再new 的那一刻 放进去 通过new 创建的类一切 都在共用堆里面 )
8 通过new复制到变量上 其实这个变量 是一个地址 地址不是固定的 直接syo可以打印 这个变量不是在类内 所以还是在栈帧里面分配这个变量
9. 如果通过变量调用 对类内的变量 进行字符串赋值 其实就是把方法区的字符串地址 给了 堆内方法的变量(类的变量一直存储在堆中,栈帧内被赋值的变量 只是得到了一个地址)
10.在这里插入图片描述
只要新建类 就执行以下
在这里插入图片描述
11 所有程序执行完 虚拟机一停止 全部清零

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值