关于java内存说明的一些帖子整理(待研究)

来源:互联网 发布:蜀山缥缈录女捏脸数据 编辑:程序博客网 时间:2024/06/04 18:55
最近项目周期很紧所以暂时回复不了什么,下下周应该能稍微解脱一两天吧,到时候画些图来说明这个。大家有兴趣讨论的请先踊跃发表见解哦~

先简单写几句:

1、一定要留意,JVM规范所规定的“概念中的JVM”与实际的JVM实现是可以有差异的。所以请区分清楚“堆”、“栈”在概念中与实际实现中的不同。我猜多数Java程序员更关心(或者说更有用)的是概念中的JVM的状况,但请千万不要想当然的认为实际上也必须要那样实现。
不过,作为一种现象,我们可以观察到用解释器实现的JVM会比用JIT编译器/混合模式方式实现的JVM要更接近于概念中的JVM。

2、请留意,“地址”、“指针”、“引用”等是不同抽象层次的概念,并不等价。
·引用可以用指针来实现,也可以用handle(一般翻译为“句柄”?总之很怪)来实现;
·指针里可以直接包含地址,也可以包含地址的某种映射关系(例如HotSpot中的compressedOop);
·地址可以是不同意义上的地址,在常见的Linux、Windows等现代操作系统上一般有虚拟内存系统,因而所谓“地址”在这里一般指虚拟内存的地址而不是所谓的“物理内存地址”。“物理内存”是一个经常被滥用、误用的词,也要注意判断。

后面几点没有特别说明的话都是针对概念上的JVM而言的。

3、Java是一种静态与动态类型相结合的强类型语言,表现在:
·Java的变量有类型,值也有类型,而且变量与值的类型并不需要精确一致,只要满足赋值匹配的约束即可;
·Java变量的类型可以是原始类型或引用类型的,其中引用类型又包括类类型、接口类型与数组类型;
·Java值的类型也可以是原始类型或引用类型的,其中引用类型的值包括指向类的实例的引用或者指向数组实例的引用;
·Java的类型系统中,所有与原始类型相关的操作都可以在Java源码编译时完成类型检查,并且在运行时不需要做额外的检查来保证类型安全;而引用类型的相关操作中有部分带有运行时检查的必要,例如强制向下类型转换、对元素为引用类型的数组的元素赋值,等等;
·Java中虚方法的实际调用目标在Java源码编译时无法确定,概念上需要在运行时根据值的实际类型来分派,与上一条提到的动态类型检查一起表现了Java的动态性。

4、原始类型的变量如果是成员变量,那么它的存储空间就正好是其所在对象中的一部分,是在Java堆上的。引用类型的变量……嗯回头有空画图了再详细说。

5、原始类型变量之间的==与!=所做的是相等性比较——值是否相等,而引用类型变量之间的==与!=做的是同一性比较——是否指向同一对象。其实如果可以理解“引用”的本质就是多了一个间接层的话,这个非常好理解,因为引用间的比较实质上也是值比较。这跟“Java中方法调用的参数传递全部是按值传递”底下的道理是一样的。

6、如果把方法的代码看作它的“静态”部分,而把一次方法调用需要记录的临时数据看做它的“动态”部分,那么每个方法的代码是只有一份的,存储于JVM的方法区中;每次某方法被调用,则在该调用所在的线程的的Java栈上新分配一个栈帧,用于存放临时数据,在方法返回时栈帧自动撤销;

7、Java程序中没有全局变量的概念。相似的概念只有“静态变量”。概念上它也是存储在方法区里的。

于是……等我回头画图吧,呵呵 ^_^
原创粉丝点击