Java运行环境、执行过程和JVM入门

Java运行过程

JVM

概念性的东西也不多说了,JVM的体系结构如下:

在系统监控和分析中,我们主要关心的是堆和栈

  • 栈是运行时单位,堆是存储单位
  • 栈解决程序运行问题,堆解决数据存储问题
  • 堆中存的是对象,栈中存的基本数据类型和堆中对象的引用
  • 栈代表了处理逻辑,而堆代表了数据
  • 栈异常:java.lang.StackOverflowError
  • 堆异常:java.lang.OutOfMemoryError

Java运行过程内存分配

Java中程序执行过程及内存分配情况:

  • 栈:保存局部变量的值,包括:1.用来保存基本数据类型的值;2.保存类的实例,即堆区对象的引用(指针)。也可以用来保存加载方法时的帧。
  • 堆:用来存放动态产生的数据,比如new出来的对象。注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。
  • 代码段:用来存放从硬盘上读取的源程序代码。 - 类
  • 数据段:用来存放static定义的静态成员

基础类型(4类8种)占一块内存,引用类型占两块内存。
具体请参考此Blog:java内存分配分析

对象气球

对象就像一个充满氢气的气球,我们没有办法直接去得到它,要想对它的使用都必须通过一根连着它的绳子来访问,这根绳
子就是对象的引用。

  1. 一根绳子同时只能连着一个气球,就像一个引用同时只能指向一个对象;
  2. 可以用多根绳子同时连接一个气球,也就是可以有多个引用同时指向同一个对象;
  3. 如果某个气球没有任何绳子连着它,那它就会飞走,同样,某个对象如果没有引用连接它,它就会成为垃圾,等着被java的垃圾收集器回收;
  4. 如果某根绳子没有连接任何气球,那么它就是一个空引用,对它的访问没有意义。
  5. 同样,某个引用如果没有指向对象,那么对它的访问将会抛出NullPointerException

Notes:图片和说明文字来自网络,有问题请告之。

唐胡璐 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
分享创造价值,您的支持将鼓励我继续前行!