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)典型的垃圾回收器
四种Java垃圾收集器工作流程对比
1. Serial Garbage Collector 串行垃圾回收
2. Parallel Garbage Collector 并行垃圾回收
3. CMS Garbage CollectorConcurrent Mark Sweep (CMS) Garbage Collector使用多个线程来扫描堆内存来标记需要回收的实例,然后再清除被标记的实例。CMS Garbage Collector只有在如下两种情景才会暂停所有的应用线程:
  1. 当标记永久代内存空间中的对象时;
  2. 当进行垃圾回收时,堆内存同步发生了一些变化。
相比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
原创粉丝点击