JAVA总结系列(一)JVM概要

一、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 invoke dynamic 允许方法调用可以在运行时指定类和方法,不必在编译的时候确定

    所以常用的方法是, 
    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 Collector Concurrent 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值