JVM、栈、堆

JVM执行程序的过程:1、加载.class文件(字节码);2、管理并分配内存;3、执行垃圾收集

JVM、栈、堆


JVM规范为了允许native代码可以调用java代码,以及允许java代码调用native方法,
还规定每个java线程拥有自己的独立的native方法栈
JVM、栈、堆
1、JVM规范让每个java线程拥有自己的独立的JVM栈,也就是java方法的调用栈;
2、JVM里的堆heap,特指用于存放java对象的内存区域。java对象全部都在堆上,
是动态内存分配意义上的堆:用于管理动态生命周期的内存区域;
3、JVM的堆被同一个JVM实例中的所有java线程共享。它通常有某种自动内存管理机制所管理,
这种机制通常叫做垃圾回收gc。JVM规范并不强制要求JVM实现采用哪种GC算法。

(1)栈是负责运行时的单位,而堆是负责存储信息的单位。
(2)从线程共享的方面来看,堆和栈的分离,可以使堆的信息是线程共享的,
   这样就为了多线程同时访问一个对象提供了可能。而这样方式对于数据交互是有效的,
   而且堆中的共享常量和缓存可以给多个栈访问,节约了空间。
(3)面向对象就是栈和堆的完美结合。平时一般创建一个对象是不是就是把事物的特征抽象出来。
   但是调用方法呢?是不是就是相当于处理一个个的逻辑,既然是逻辑是不是就是跟栈密切
   相关?所以说面向对象的实现跟堆和栈的结合是分不开的。
java的程序是在栈中运行的,在传递参数的时候,栈中只存在传基本类型和对对象的引用的问题,
   并没有传对象的本身。
传递的参数如果是基本类型的话,就不能够更改他的值,如果传的是对象的引用,我们可以改变
   对象里面的属性、成员变量等。
   
JVM内存分3个分区
   1、堆(Heap) -- 只存对象本身,不存基本类型和引用对象。
                  JVM只有一个堆区,并被所有线程共享。
   2、栈(Stack)-- 栈中只保存基础数据类型的对象和对象引用。
                  每个线程一个栈区,每个栈区中的数据都是私有的,其他栈不能访问。
  栈分三个部分:基本类型变量区,执行环境上下文,操作指令区。
   3、方法区 -- 又叫静态区,跟堆一样,被所有线程共享。
                方法区包含所有的class和static变量
方法区包含的都是在整个程序中永远唯一的元素。