Java运行过程
JVM
概念性的东西也不多说了,JVM的体系结构如下:
在系统监控和分析中,我们主要关心的是堆和栈
- 栈是运行时单位,堆是存储单位
- 栈解决程序运行问题,堆解决数据存储问题
- 堆中存的是对象,栈中存的基本数据类型和堆中对象的引用
- 栈代表了处理逻辑,而堆代表了数据
- 栈异常:java.lang.StackOverflowError
- 堆异常:java.lang.OutOfMemoryError
Java运行过程内存分配
Java中程序执行过程及内存分配情况:
- 栈:保存局部变量的值,包括:1.用来保存基本数据类型的值;2.保存类的实例,即堆区对象的引用(指针)。也可以用来保存加载方法时的帧。
- 堆:用来存放动态产生的数据,比如new出来的对象。注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。
- 代码段:用来存放从硬盘上读取的源程序代码。 - 类
- 数据段:用来存放static定义的静态成员
基础类型(4类8种)占一块内存,引用类型占两块内存。
具体请参考此Blog:java内存分配分析
对象气球
对象就像一个充满氢气的气球,我们没有办法直接去得到它,要想对它的使用都必须通过一根连着它的绳子来访问,这根绳
子就是对象的引用。
- 一根绳子同时只能连着一个气球,就像一个引用同时只能指向一个对象;
- 可以用多根绳子同时连接一个气球,也就是可以有多个引用同时指向同一个对象;
- 如果某个气球没有任何绳子连着它,那它就会飞走,同样,某个对象如果没有引用连接它,它就会成为垃圾,等着被java的垃圾收集器回收;
- 如果某根绳子没有连接任何气球,那么它就是一个空引用,对它的访问没有意义。
- 同样,某个引用如果没有指向对象,那么对它的访问将会抛出NullPointerException
Notes:图片和说明文字来自网络,有问题请告之。