类加载机制

JVM的类加载是通过ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:

每个ClassLoader加载Class的过程是:

1.检测此Class是否载入过(即在cache中是否有此Class),如果有到8,如果没有到2

2.如果parent classloader不存在(没有parent,那parent一定是bootstrap),到4

3.请求parent classloader载入,如果成功到8,不成功到5

4.请求jvm从bootstrap classloader中载入,如果成功到8

5.寻找Class文件(从与此classloader相关的类路径中寻找)。如果找不到则到7.

6.从文件中载入Class,到8.

7.抛出ClassNotFoundException.

8.返回Class.

类执行机制

JVM的指令是从操作数栈中取得操作数,是基于栈的体系结构来执行class字节码的。线程创建后,都会产生程序计数器(PC)和栈(Stack),程序计数器存放下一条要执行的指令在方法内的偏移量,栈中存放一个个栈帧,每个栈帧对应着每个方法的每次调用,而栈帧又是有局部变量区,操作数栈和帧数据区组成,局部变量区用于存放方法中的局部变量和参数,操作数栈中用于存放方法执行过程中产生的中间结果。局部变量区和操作数栈的大小,编译器在编译时就确定了存放在class文件中.而帧数据区大小依赖于具体实现,这些信息用来支持常量池解析,正常方法返回以及异常派发机制.

32位HotSpot上要求64位/8字节对齐,HotSpot在C++代码中用instanceOopDesc类来表示Java对象,而该类继承oopDesc,oopDesc保存了java class的元数据信息,而Klass保存了java class的实际数据。klass就是用于描述GC堆上的对象的对针;如果一个对象的大小、域的个数与类型等信息不固定的话,它就需要特定的klass对象来描述。

instanceOopDesc用于表示Java对象,instanceKlass用于描述它,HotSpot并不把instanceKlass暴露给Java,而会另外创建对应的java.lang.Class对象,两者之间互相持有引用,如果自身却又有些不固定的信息需要被描述,因而又有instanceKlassKlass,如此下去会没完没了,所以有个klassKlass作为这个描述链上的终结符。

通过直接指针访问对象,klass的关系图:

在java中的引用主要有四种:

Strong reference:

强引用是JAVA中默认采用的一种方式,它会尽可能长时间的存活于 JVM 内,当没有任何对象指向它时 GC 执行后将会被回收。

Soft reference:

软引用的对象在GC的时候不会被回收,只有当内存不够用的时候才会真正的回收,因此软引用适合缓存的场合,这样使得缓存中的对象可以尽量的再内存中待长久一点。

软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,Java 虚拟机就会把这个软引用加入到与之关联的引用队列中.

Weak reference:

弱引用有利于对象更快的被回收,在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。

Phantom reference:

一个对象仅持有虚引用,那么它就和没有任何引用一样。虚引用主要用来跟踪对象被垃圾回收的活动,当垃 圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。构造 PhantomReference 时的第二个参数 ReferenceQueue(WeakReference & SoftReference 也可以有这个参数),PhantomReference 唯一的用处就是跟踪 referent 何时被 enqueue 到 ReferenceQueue 中.

 

可复活

当程序不再有任何引用变量引用Sample对象时,它就进入可复活状态, 垃圾回收器会准备释放它占用的内存,在释放之前,会调用它及其他处于可复活状态的对象的finalize()方法。

影子可触及

已经被断定不会被任何终结方法复活(终结方法已经被运行过了),并且影子引用对象触及。一旦某个被影子引用的对象变成影子可触及状态,垃圾收集器立即把该引用对象加入队列,由程序明确地清除。

不可触及

当对象处于不可触及状态时,垃圾回收器才会真正回收它们的内存。

JVM调优系列:(三)类加载和执行机制相关推荐

  1. JVM调优系列--Java命令选项(参数)--大全/详解/常用

    原文网址:JVM调优系列--Java命令选项(参数)--大全/详解/常用_IT利刃出鞘的博客-CSDN博客 简介 说明        本文介绍Java的java命令用法,包括:常用用法.选项大全. J ...

  2. JVM 调优系列之图解垃圾回收

    转载自  JVM 调优系列之图解垃圾回收 摘要: jvm必知系列,总结一些常见jvm回收机制,方便查阅 从这篇开始我们开始探讨一些jvm调优的问题.在jvm调优中一个离不开的重点是垃圾回收,当垃圾回收 ...

  3. JVM 调优系列之监控工具

    转载自  JVM 调优系列之监控工具 摘要: 项目部署线上之后,我们该如何基于监控工具来快速定位问题.... 通过上一篇的jvm垃圾回收知识,我们了解了jvm对内存分配以及垃圾回收是怎么来处理的.理论 ...

  4. 性能测试调优JVM调优(三)之JMeter使用

    本文章向大家介绍JVM调优(三)之JMeter使用,主要包括JVM调优(三)之JMeter使用使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下. JMete ...

  5. JVM 调优系列 1:“精通 JVM 调优,有过 JVM 调优经验”,简历敢写吗?薪资涨 5k 的技巧!

    文章目录 前言 一.部分大厂对于 JVM GC 的面试题 1.1.百度 1.2.顺丰 1.3.京东 1.4.淘宝 1.5.阿里.蘑菇街 二.Garbage Collectors(GC)作何使用 三.G ...

  6. oracle sql 执行计划分析_Oracle SQL调优系列之看懂执行计划explain

    1.文章写作前言简介 SQL调优系列博客链接:SQL调优专栏 之前曾经拜读过<收获,不止sql调优>一书,此书是国内DBA写的一本很不错的调优类型的书,是一些很不错的调优经验的分享.虽然读 ...

  7. ❤️三万字《图解 -JVM调优系列》带你从实战原理上重新认识堆区【建议收藏】❗❗❗

    vx公众号:码工是小希 关注选择"星标",重磅干货每日 送达! [如果你觉得文章对你有帮助,欢迎关注,点赞,留言哦] 礼多人不怪嘛,试着回复下:[路线],[秘籍],[实战],[简历 ...

  8. JVM调优系列:(五)JVM常用调试参数和工具

    转自:http://blog.csdn.net/opensure/article/details/46715769 JVM常用调试参数: –verbose:gc在虚拟机发生内存回收时在输出设备显示信息 ...

  9. JVM调优系列:(四)GC垃圾回收

    跟踪收集算法: 复制(copying): 将堆内分成两个相同空间,从根(ThreadLocal的对象,静态对象)开始访问每一个关联的活跃对象,将空间A的活跃对象全部复制到空间B,然后一次性回收整个空间 ...

最新文章

  1. [Swift]在不依赖三方库的情况下如何异步下载和缓存图片?
  2. 选择学习“下一个”程序语言
  3. 【转:理论知识】SAP在建工程转固定资产
  4. mySAP标准培训教材全套列表
  5. vc++.net 移植到 C#中的几点注意事项
  6. SpringCache @Cacheable 在同一个类中调用方法,导致缓存不生效的问题及解决办法...
  7. C++11 range-based for loop
  8. %Error opening tftp://255.255.255.255/network config
  9. 【转】sql语句优化工具LECCO SQL Expert
  10. docker ubuntu安装python_BAT架构师手把手教你如何使用Docker安装GPU版本caffe2
  11. 简单的全局异常统一处理
  12. java 设置内存参数_Java虚拟机内存参数设置
  13. 基于JAVA后勤管理系统计算机毕业设计源码+数据库+lw文档+系统+部署
  14. python,matlab 读取NIFTI(.nii)格式图像、FSL安装
  15. 电脑启动快捷键一览表
  16. 兰州大学百年校庆--风雨百年萃英路
  17. DC 逻辑综合的基本流程
  18. 前端开源库 CDN 加速
  19. 重装系统后发现只有系统盘c盘怎么办?
  20. 西工大机考《房地产法》大作业网考

热门文章

  1. Windows使用msi安装MySQL安装教程
  2. VRRP协议简介与实例配置
  3. 计算机科学入门指南游戏攻略,【基础攻略】从零开始新手入门指南
  4. 牛红红的日记(平平无奇拿下域控)
  5. java map判断是否有键_检查Java HashMap中是否存在给定键
  6. python web框架对比_Python六大开源框架对比
  7. undi是什么意思_undefined是什么意思啊
  8. oracle临时表的优点,详解Oracle临时表的几种用法和意义
  9. ext springmvc mysql_基于ExtJs6前台,SpringMVC-Spring-Mybatis,resteasy,mysql无限极表设计,实现树状展示数据(treepanel)...
  10. 装配图中齿轮的画法_装配图的规定画法 和特殊画法