1.JDK
Java程序开发的最小环境 ---
1)Java 开发工具
2)Java 虚拟机 JVM
3)Java API 类库
JER
Java程序执行的标准环境
1)Java 核心类库
2)Java 虚拟机
2.JAVA虚拟机
栈区 堆区 方法区 本地方法栈 (程序计数器 运行时常量池 直接内存)
程序计数器(私有):当前线程所执行的字节码的行号指示器
虚拟机栈(私有):用于支持虚拟机进行方法调用和方法执行的数据结构 存放方法参数和方法内部定义的局部变量 局部变量表 操作数栈 动态链接(指向运行时常量池的引用) 方法返回地址
本地方法栈:虚拟机栈为虚拟机执行的java方法服务,本地是为本地使用的本地操作系统服务
java堆:对象实例和数组
方法区:存储已经被虚拟机加载的类信息 常量 静态变量
堆区又分为新生代和老生代 新生代分伊甸园区 两个幸存区 伊甸园区内存分配比较大 两个幸存区较小 8:1:1
JVM的优化
3.Java历史版本特性
JavaSE5:泛型 增强循环 自动装箱与拆箱 枚举类 可变参数
JavaSE8 Lambda表达式 函数式接口
4.GC垃圾收集算法(堆)
确定垃圾的算法:引用计数法 可达性分析法
标记-清除算法 标记-整理算法 复制算法 分代收集算法
标记清除算法是最基础的收集算法,其他收集算法都是基于这种思想。标记清除算法分为“标记”和“清除”两个阶段:首先标记出需要回收的对象,标记完成之后统一清除对象。它的主要缺点:①.标记和清除过程效率不高 。②.标记清除之后会产生大量不连续的内存碎片。
标记整理,标记操作和“标记-清除”算法一致,后续操作不只是直接清理对象,而是在清理无用对象完成后让所有存活的对象都向一端移动,并更新引用其对象的指针。主要缺点:在标记-清除的基础上还需进行对象的移动,成本相对较高,好处则是不会产生内存碎片。
复制算法,它将可用内存容量划分为大小相等的两块,每次只使用其中的一块。当这一块用完之后,就将还存活的对象复制到另外一块上面,然后在把已使用过的内存空间一次理掉。这样使得每次都是对其中的一块进行内存回收,不会产生碎片等情况,只要移动堆订的指针,按顺序分配内存即可,实现简单,运行高效。主要缺点:内存缩小为原来的一半。
5.类加载器
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被Java虚拟机直接使用的Java类型,这就是虚拟机的类加载机制
类加载的全过程,加载,验证,准备,解析和初始化这五个阶段
类加载器实现了类的加载动作,同时唯一标示类
双亲委派模型
6.内存泄漏和内存溢出
内存泄漏是指分配的内存没有被回收回来
内存溢出是程序所需要的内存超出了系统所能分配的内存的上限
7.GC的两种判定方法 引用计数和引用链
8.volatile
volatile是Java虚拟机提供的最轻量级的同步机制。当一个变量被定义成volatile之后,具备两种特性:
1)保证此变量对所有线程的可见性。当一条线程修改了这个变量的值,新值对于其他线程是可以立即得知的。而普通变量做不到这一点。
2)禁止指令重排序优化。普通变量仅仅能保证在该方法执行过程中,得到正确结果,但是不保证程序代码的执行顺序。
9.Java中的四种引用
1)强引用 永远不会被垃圾回收器删除
2)软引用 内存不足时进行回收。可以做缓存用
3)弱引用 只要发现就进行回收。可以做缓存、存储元数据、大数据等用
4)虚引用 和没有引用一样,必须与引用队列一起使用。可以用于跟踪对象是否被回收。
网友评论