在C++领域,关于C++的内存存储,结构等等,有一本书:深度探索C++对象模型,讲解的非常透彻。而Java确把这一工作交给了虚拟机来处理。我们首先来看看关于内存的问题。1.问题:1)java 的局部变量存在那里,类型怎么存放的?2)static 变量3)final 变量4)met ...
在C++领域,关于C++的内存存储,结构等等,有一本书:深度探索C++对象模型,讲解的非常透彻。
而Java确把这一工作交给了虚拟机来处理。
我们首先来看看关于内存的问题。
1.问题:
1)java 的局部变量存在那里,类型怎么存放的?
2)static 变量
3)final 变量
4)method是存放的那里的
5)class类 & 内部类 是如何存放
2.java虚拟机运行是数据区
2.1程序计数器
线程隔离数据,记录当前线程执行的位置。
PC计数器
由于Java虚拟机的多线程,是由线程轮换的方式分配CPU的。所以线程切换后,需要恢复到原来执行的地方
没有线程都需要一块内存来记录这个执行位置,此内存是线程私有的。
2.2Java虚拟机栈
这个栈就是我们常见的java 面试题中一般会问 heap & stack 的区别。 这里的stack就是我们说的虚拟机栈。
这个栈是存放每个method执行的时候的局部变量表,动态连接,方法出口等信息。
局部变量表存放:局部变量类型,已经基本类型的变量。
栈中可以理解为存放对象的引用,为对象本身存放在堆。
如果申请的内存不够,就会OOM。
2.3本地方法栈
这个东西同Java虚拟机栈非常类似,这里存放这native方法的一些信息。
2.4Java堆
千呼万唤始出来,对象实例就是存放在这个地方。也是java内存最大的地方。
GC的主要工作就是释放这里不用的内存。
这块区域为所有线程共享。所以android就会有activity或者service在非前台状态下,是否低优先级的情况。
2.5方法区
这块地方存放的就是已经加载的类信息,静态变量,常量等。
String abc = “abc”; 这后面的“abc”就存放在这里。
2.5.2 运行时常量区
java在非编译阶段,也可以是一种常量的形式,比如:
String str = "abc"+"d";
原标题:深入理解java虚拟机(1)
关键词:JAVA
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。