JVM学习

JVM
 
 
jvm是什么
是一种规范,是虚构出来的计算机,有自己的指令集、汇编语言
 
java执行过程
.java文件经过javac编译为.class文件
调用的时候.class和java相关类库被ClassLoader装载到内存
之后通过java解释器和JIT即时编译器(经常执行的在JIT中走,反之走解释器),   
之后通过执行引擎执行,再到硬件
 
 
jvm跨平台
jvm是跨语言的平台,只要能编译或生成或形成的.class文件的语言,都可以使用JVM
 
 
jvm文档规范查询
 
JDK JRE JVM关系
 
 
什么是class文件
class文件是二进制字节流
    编译前
 
 
    编译后
 
 
    字节码
 
*u1 u2 u4(u后面跟几,就是几个字节)
 
class文件解析
ca fe ba be是表示这个文件是一个class文件
00 00 小版本号(这是16进制的,转成10进制,就是版本号0)
00 34 大版本号(这是16进制的,转成10进制,就是版本号52)
00 10 是常量池里面的常量数量,因为是两个字节表示的,所以最多存放65535个字节(2的16次方减1),常量池编号从1开始
*大小版本号放在一起,就是52.0,就是当前版本号
 
什么是垃圾:
    当对象没有引用指向的时候就是垃圾
 
C/C++回收方法:
    手动回收
 
定位垃圾:
  • 引用计数器:
    • 对象被引用一次就计数+1,引用完就-1,到0就回收
  • 根查找器(根可达):
    • 从根部开始找起,能找到的都不是垃圾,反之就是垃圾,就回收
 
java虚拟机最好的书
    java虚拟机规范
 
垃圾回收机制
     Mark-Sweep(标记清除):将垃圾找到并清除,缺点是碎片化
 
     Coppying (标记清除):不管内存多大,分成两半,只使用一半.回收时将正在使用的拷贝到其中一半,另一半集中清除,坏处是浪费空间
     
 
     Mark-Compact(标记整理):边使用边整理,使用中的放前面,没使用放后面.缺点是效率低
 
 
十种垃圾回收器
 
分代模型:将内存区域分为新生代和老年代
    新生代:新new出来的对象,一次就能回收掉的
        使用拷贝算法回收
    老年代:长时间未被回收掉的
        使用标记清除和标记整理
 
    eden:对象诞生
    survivor:eden中GC介入后,剩余的对象.拷贝到survivor并清除eden,GC再次介入后,剩余的对象.拷贝到另一个survivor,反复拷贝清除,直到年龄达到tenured默认年龄阈值
    tenured:多次GC没有清除掉的对象达到年龄阈值,拷贝到tenured
 
 
 
逃逸:不能有方法引用这个对象,野指针
标量替换:将对象转换成基础数据类型替换掉
放在栈上的对象:没有被引用的被创建的对象
放在堆上的对象:
    对象大的话直接放入老年代,FullGC
    对象小的话
        判断Tlab(线程本地分配缓冲区:JVM给每个线程分配的区域),如果线程的区域够了就直接被回收,如果线程区域不够,则进入eden
 
分代模型通常成对出现:
ParNew-CMS
    ParNew:暂停正在运行的业务线程,多线程回收,约等于Parallel Scavenge,专门配合CMS使用
 
 
    CMS:垃圾回收线程和工作线程同时运行(并发),好处是不会卡
        初始标记:找出根对象(耗时几百毫秒),
        并发标记:运行时监控工作线程并标记
            问题1:
                浮动垃圾:标记的时候变成垃圾
            问题2:
                错标:标记为垃圾之后,又被调用
        重新标记:修正错标
        并发清理:清理垃圾
 
 
Serial-Serial Old:
    Serial:暂停正在运行的业务线程,执行回收(存在于理论中,早期版本jdk使用,单线程处理,新生代回收)
 
 
    Serial Old:暂停正在运行的业务线程,执行回收(存在于理论中,早期版本jdk使用,单线程处理,老年代回收)
 
 
Parallel Scavenge - Parallel Old
    Parallel Scavenge:暂停正在运行的业务线程,多线程回收(java1.8默认,新生代)
 
 
    Parallel Old:暂停正在运行的业务线程,多线程回收(java1.8默认,老年代)
 
PS:并不是线程越多回收效率越高,因为N核CPU执行N+M个线程的时候,因为需要轮流执行线程,计算机会将资源浪费在线程调度上
 
 
 
 
 
 
 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值