参考文档,Java编程思想、面试详解:http://www.cnblogs.com/java1024/p/7685400.html
一、寄存器、位(bit)、字节(byte)
寄存器:
概念:最快的存储单元,处于处理器内部,数量有限,按需分配,不能直接控制;
大小:和系统有关,32位系统就是寄存器的大小位32位,64位系统指的就是寄存器的大小为64位;
字节:一位等于8字节,存储空间最小的计量单位,字母与数字一个占用一个字节,汉字一个占用俩个字节;
位:内存中最小的数据单元,只能为0或者1;
二、java的内存模型
JVM虚拟机规范中将Java运行时数据分为6种
1、什么是JVM?
JVM及JAVA字节码代码运行的平台,将字节码文件翻译为对应运行平台的机器指令(也是JVM的与平台无关性)
2、jdk、jre、jvm的分类;
jvm:java虚拟机,java字节码文件的运行平台;
jre:java的运行环境,由jvm、java自带的类库组成;
jdk:java的开发工具包,由编译、运行环境、以及丰富的类库组成;
三者之间的关系:jdk包含jre包含JVM;
3、运行时的数据分类:
1)、程序计数器(程序计数寄存器):
定义:一种数据结构:用于保存当前正在执行的程序的内存地址;(与线程相关)
作用:每个线程都具有独立的程序计数器,且互不影响,多线程的实现及为轮流切换并分配处理器的执行时间来实现;
ps:若为native修饰的方法,计数器值为空(undefined);
2)、JVM的栈:
定义:
(1)类似于C中的栈;
(2)内存地址不连续;
(3)每个线程都具有自己的栈,线程私有的,与线程的生命周期相同;
(4)作用:(相较于局部变量而言)基本类型的变量,(相较于局部变量而言)引用类型变量的引用,以及函数调用的现场,操作栈;
ps:操作栈:https://blog.csdn.net/luzhensmart/article/details/81349398
(5)栈中存储的是栈帧(stackFrame)
StackFrame组成:局部变量(及方法中的所有的局部变量)、执行环境、操作数栈;
执行环境:解析器对于java字节码解析过程中的重要信息,例如上次调用的方法、 局部变量的指针、操作数栈的栈顶以及栈顶指针;
操作数栈:存储运算所需要的操作数和结果;
生命周期:在方法调用前被创建,且在某一个线程中,某个时间点只有一个栈在执行(currentFrame);
(6)栈的分类:固态和动态。动态栈按照线程的需要分配
ps:(1)原理:位于RAM(随机访问存储区),通过堆栈指针的上下移动来决定是分配内存还是释放内存(向上移动为释放,向下移动为分配新的内存),且在java中要将其放在堆栈内存中,则必须明确说明其生命周期,及在堆栈中的信息都是有确切的生命周期的,这也是其缺点,不够灵活;
(2) 函数调用的现场:就是运行当前函数的地方也在堆栈中;
3) 本地方法栈:为native修饰的方法所服务
ps:什么是Native:与abstract类似,只写方法名,不写方法体,区别:native修饰的方法是有实现体的,只不过不是java代码实现的;
4)java堆(通用的内存池(RAM),存放java所有的对象(引用对象)):
(1)作用:用来存放对象的信息,引用类型变量;
(2)与栈的区别:除了存储数据的卡类型不同外,栈是运行时单位,解决程序的运行问题,堆是存储单位,解决数据存储;
(3)特点:所有的线程所共享的;gc器会监视所有的new的对象,并且辨别那些不需要使用的对象,然后释放内存,不需要手动调用;
ps:数组也是引用对象类型
5)方法区:各个线程的共享区域(与堆类似);
作用:存储虚拟机加载的类的信息、常量、静态变量、编译后的代码;
6)运行时常量池:
方法区的一部分,存储常量的地方(编译时的数字常量,方法或者域的引用);
ps:非RAM内存;
概念:存在于程序之外,不受任何程序的控制;例子:流对象与持久化对象;