Java内存区域和内存溢出异常
Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来——《围Java》·周志明 Java程序员将c++中繁琐的delete交给了虚拟机,虽然我们一直创建对象,但从未手动删除过对象,这一切正悄然发生着。我们把内存控制的权利交给了JVM,直到那一天,Java程序员终于想起了曾一度被他们支配的恐怖和被囚禁于鸟笼中的那份屈辱。 一、运行时数据区/内存模型 运行时数据可划分为若干个数据区域,其中有的属于线程共享,而又有些为线程私有。共享区域会随着虚拟机进程的启动而存在,而线程私有的区域会随着线程的启动和结束而建立和销毁。 二、程序计数器(Program Counter Register) 我更喜欢用“寄存器”的概念去理解他,我们知道在CPU中有寄存器用于保存指令地址和保存计算结果。类似的,程序计数器就像一个指针,保存了指向方法区中的方法字节码的地址,程序寄存器只占用很小的内存空间,是线程私有的,可以看做是当前线程所执行的字节码的行号指示器,如果你查看程序字节码,会发现很多指令,程序计数器按顺序存储这些字节码,执行引擎执行计数器中的字节码以实现循环、跳转、分支、线程恢复等操作。由于程序计数器是线程私有的,没一条线程都会有一个独立的程序计数器,所以各个线程之间的程序计数器互不影响,独立存储。如果正在执行的是本地方法