JVM总结

java的线程与系统线程是一一对应,当系统线程完成资源分配与初始化,就会调用java线程的run

JVM的运行时区域分为线程私有与线程共有

线程私有区域包含:程序计数器(记录所处行数)、虚拟机栈(存放调用应用方法的栈帧)、本地方法栈(存放调用系统方法的栈帧)

线程共有区域包含:方法区(永久代,存放类元数据以及常量池)、java堆(新生代、老年代,存放数组、对象)

备注:jdk1.8后,将类的元数据改为放在直接内存,字符串常量池与类的静态实例存放在java堆

java堆-新生代:包含eden、SurvivorTo、SurvivorFrom区域,会触发MinorGC

java堆-老年代:会触发MajorGC

垃圾回收算法有:标记清除(标记后清除,内存碎片大)、复制清除(复制挪一边后清除,需要大块内存)、标记整理、分代收集

垃圾回收器有:serial、parnew、parellal Scanvage;serial old、parellal old、cms;G1

serial:单线程,采用复制算法,是jvm在client模式下默认的新生代垃圾回收器

parnew:多线程版的serial新生代垃圾回收器,采用复制算法,是jvm在server模式下默认新生代垃圾回收器

parellal Scanvage:多线程,采用复制算法,相对于parnew更关注吞吐量

serial old:单线程,采用标记整理算法,是jvm在client模式下默认的年老代垃圾回收器

parellal old:多线程,采用标记整理算法,更关注吞吐量

CMS:并发标记清除,采用标记清除算法;垃圾回收过程包含:初始标记、并发标记、重新标记、并发清除,由于并发标记与并发清除都是耗时较长,但与用户线程一同工作,所以停顿时间非常短

G1:garbage first,因为采用了区域划分与区域优先机制,与CMS相比优点是内存碎片少、gc停顿时间更短;

 

实际应用中我们需要看具体的业务,是需要更大的吞吐量还是需要交互友好停顿时间更短,来使用不同的垃圾回收器,以及调整jvm不同的参数;了解内存结构后可以查看jvm的状态,可以使用arthas工具,或者jvm提供的自带工具,进行查看内存状态。

实战经验:有个项目经常过一段时间就出现OOM,查看日志没有异常,我们采用jvm工具看了下,堆占用内存最大的是xml转换遗留的对象,排查后发现一个xml转换的jar包产生的中间对象没有被回收,我们改用另外一个xml解析工具就没再出现OOM了

java类加载机制

包含:加载、验证、准备、解析、初始化、使用、卸载

加载:生成一个Class对象,作为类的数据入口

验证:验证Class文件字节流是否符合jvm规范

准备:为类变量分配内存以及初始值

解析:将常量池符号替换为直接引用过程

初始化:类加载的最后一个阶段,执行类构造器的过程;类构造器的方法体由类变量赋值以及静态语句块合并而成,jvm保证子类的构造器执行完之前,父类的构造器先执行完

备注:子类引用父类静态字段,只会触发父类初始化;定义对象数组,不会触发初始化;引用类的常量,不会触发类的初始化;通过类名获取Class对象不会触发初始化;通过Class.forName(initlalize为false)、ClassLoader的loadClass方法,也不会触发初始化

 

采用双亲委派机制,同一个类总是先由父类进行加载,保证不同加载器加载后得到的是同一个Object对象

了解类的加载机制,我们能在类的赋值这块更注意

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值