萌新入门:JavaSE引入——内存分析,生命周期以及程序的加载

欢迎指正!

内存分析

首先,我们要了解什么是程序,什么是进程。
程序:可以执行的文件,是代码编完并且修复bug之后,没运行的状态,它保存在硬盘当中,一种静态概念。
进程:正在执行的文件,是一种动态概念。
运行起来的程序:指载入到内存的可执行文件,这个时候,操作系统会开启一个进程来执行内存中的这个文件对象,如果想要关闭一个程序.可以直接结束它对应的进程。
内存划分
1.程序计数器
较小,可以看做是当前线程执行的字节码的位置指示器
2. 方法区
用来存放我们的程序文件,和载入程序后的那个程序文件对象,Java中指的是class文件;
方法没有被调用前以及代码段,都会保存在方法区,还有运行时常量池
3. 栈内存
也叫虚拟机栈/VM栈。它遵循的规则是先进后出
构成元素:
栈空间:以栈数据结构为模型开辟的一段内存空间
栈帧:栈内存中,每个栈元素都叫栈帧
栈底元素:最先进入的元素
栈顶元素:最后进入的元素
栈操作: 压栈 弹栈
方法是放到栈内存的,包括局部变量
注意: 栈内存是用来执行方法的:“方法调用就是压栈,方法执行结束就是弹栈”
4. 本地栈
本地栈是为JVM提供使用native方法的服务
5. 堆内存
堆内存是用来保存对象的
每个对象空间分为三大块
数据部分:成员变量
头部 : hashcode值
类型:是哪个类型创建的,引用对应的类

生命周期

一个程序的生命周期可以粗略的分为

  • 编写
  • 编译
  • 运行
  1. 开启java虚拟机,然后把程序名对应的 .class文件载入到jvm划分的空间中,保存在静态区
  2. jvm自动调用main方法
  3. main方法被调用,会在栈内存开辟栈帧
  4. jvm静态方法调用流程
    在main方法中没有调用其他方法的时候,就直接执行,完事之后弹栈,程序销毁,
    如果main方法中有其他方法调用
    1.本类方法(一个类里面的方法)
    如果在main方法中,调用了本类的方法,就会在main方法栈帧的上面,再开辟一个栈帧,用来保存调用 的方法如果被调用的方法中还有其他方法调用,同上,再开辟栈帧
    一直到被调用的这个方法执行完成,然后弹栈,再接着main方法中的调用处接着向后执行,一直到main执行结束,main栈帧弹栈,程序销毁,如果调用的方法有返回值,会把对应的值放入临时空间中,携带返回调用处
    2.其他类方法:先把对应的类,载入静态区,其他流程同上
    怎么算方法执行完成呢?
    1.最后一条语句执行结束,碰到方法体的大括号
    2.或者碰到return语句

程序的加载

分为静态加载和动态加载
静态加载:就是在程序刚执行的时候,就把相关的所有文件一次性加载到内存中,缺乏灵活性。
动态加载:就是程序在执行的时候,只加载和它相关的文件,当用到其他文件再载入,相对来说更灵活,利于拓展。

Java里面用到的是动态加载

猜你喜欢

转载自blog.csdn.net/lfz9696/article/details/107730192