JAVA总结系列(一)JVM概要
来源:互联网 发布:知乎 匿名用户 编辑:程序博客网 时间:2024/05/20 02:54
一、JVM结构
1、程序计数器:指向下一条要执行的指令
虚拟机栈中定义了两种异常,如果线程调用的栈深度大于虚拟机允许的最大深度,则抛出StatckOverFlowError(栈溢出);不过多数Java虚拟机都允许动态扩展虚拟机栈的大小(有少部分是固定长度的),所以线程可以一直申请栈,直到内存不足,此时,会抛出OutOfMemoryError(内存溢出)。
2、栈:局部变量表、操作栈、方法出口、动态链接
3、堆:所有的对象实例以及数组
4、方法区:final常量、类信息、静态变量、即时编译的代码
在方法区上定义了OutOfMemoryError:PermGen space异常,在内存不足时抛出
5、本地方法栈:为虚拟机的native方法服务
6、直接内存:JVM以外的机器内存
二、JVM类加载
Java虚拟机 类加载的过程
1、加载 二进制文件、方法区数据结构、JAVA堆上创建class实例
2、验证 文件格式验证、元数据验证、字节码验证、符号应用验证
3、准备 方法区,static filed分配内存,并设置final类型的初始值
4、解析 把类文件的常量池部分的符号引用转化为运行时常量池的直接引用。
1、解析类或接口
2、解析字段
3、解析类方法
4、解析接口方法
5、初始化 <clinit>
三、JVM方法调用
JVM方法调用:
4种运行速度为:invokestatic > invokespecial > invokevirual > invokeinterface。
jvm中方法调用指令有:
invokeinterface:调用接口方法;
invokespecial:专门用来调用父类方法、私有方法和初始化方法;
invokestatic:调用静态方法;
invokevirtual:调用对象的一般方法。
JDK1.7 invokedynamic允许方法调用可以在运行时指定类和方法,不必在编译的时候确定
所以常用的方法是,
1. 根据具体的业务要求,分离出常用的任务写成static方法,加快速度。有人也怀疑static方法会不会占用更多的内存,我认为不会,因为无论是什么样的方法都得占用方法区的空间,调用也是引用调用。再说对于现在上G的内存,我们写的几K的东西也算不上多大开销。
2. 遵循高内聚,低耦合的模式,一个类只对外提供必要的public个protected方法,大部分的内部逻辑就用private修饰,一来速度快,二来也免得别人调用起来方法太多看的麻烦。
3. 对于接口来说,不是接口用的越多越好,抽象出来的接口应该越精简越好,我的亲身体会是接口多了很麻烦,毕竟越灵活的东西越难理解。
四、JVM垃圾回收
1)典型的垃圾回收
Mark-Sweep(标记-清除)算法
Copying(复制)算法
Mark-Compact(标记-整理)算法
Generational Collection(分代收集)算法
2)典型的垃圾回收器
1. Serial Garbage Collector 串行垃圾回收
2. Parallel Garbage Collector 并行垃圾回收
3. CMS Garbage CollectorConcurrent Mark Sweep (CMS) Garbage Collector使用多个线程来扫描堆内存来标记需要回收的实例,然后再清除被标记的实例。CMS Garbage Collector只有在如下两种情景才会暂停所有的应用线程:
- 当标记永久代内存空间中的对象时;
- 当进行垃圾回收时,堆内存同步发生了一些变化。
相比Parallel Garbage Collector,CMS Garbage Collector使用更多的CPU资源来确保应用有一个更好的吞吐量。如果分配更多的CPU资源可以获得更好的性能,那么CMS Garbage Collector是一个更好的选择,相比Parallel Garbage Collector。
通过 XX:+USeParNewGC 参数来选用CMS Garbage Collector。
4. G1 Garbage Collector
G1 Garbage Collector用于大的堆内存区域。它将堆内存分割成多个独立区域(Region),然后并发地对它们进行垃圾回收。在释放内存后,G1还可以压缩空闲的堆内存。但是,CMS Garbage Collector是通过“Stop The World (STW)”来进行内存压缩的。G1优先收集可回收更多内存的区域。
通过 –XX:+UseG1GC 参数来选用G1 Garbage Collector。
Java 8 的改进
在用G1 Garbage Collector时,可以开启 -XX:+UseStringDeduplication 参数。它通过将重复的字符串移动到同一个 char 数组中来优化堆内存的使用。该选项在Java 8u20时引用进来。
1 0
- JAVA总结系列(一)JVM概要
- JVM(一)java的执行概要
- Java虚拟机JVM性能优化(一):JVM知识总结
- Java虚拟机JVM性能优化(一):JVM知识总结
- (一)线程------JVM体系结构与内存模型概要
- JVM系列之JVM体系(一)
- 深入浅出java虚拟机系列:(一)jvm 内存区域
- JVM系列文章(一):Java内存区域分析
- JVM系列文章(一):Java内存区域分析
- JVM系列文章(一):Java内存区域分析
- java事务学习笔记(一)--概要
- Java基础概要(一)
- Java基础概要总结
- java虚拟机内存管理机制(一):JVM内存管理总结
- SE for Android 系列之整体概要(一)
- SE for Android 系列之整体概要(一)
- SE for Android 系列之整体概要(一)
- SE for Android 系列之整体概要(一)
- 双飞翼布局
- sed使用
- [unity]批量处理图片资源
- 使用jQuery的data读取标签缓存数据 ( 二 )
- 软件下载地址
- JAVA总结系列(一)JVM概要
- python下ssh及sftp登录
- 2016.12.21C语言概述+linux下的C语言编程
- java中数据结构
- 在canvas中应用font-awesome字体
- javascript字典数据结构Dictionary实现
- 机器学习实战学习笔记6——AdaBoost
- 初级小白改bug心得
- S8.1_Struts2_Interceptor 拦截器的原理 拦截器与过滤器的区别 自定义拦截器 拦截器防止表单重复提交