JVM调优系列:(三)类加载机制

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的关系图:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-18 07:52:31

JVM调优系列:(三)类加载机制的相关文章

[转] JVM 调优系列 & 高并发Java系列

1.JVM调优总结(1):一些概念:http://www.importnew.com/18694.html 2.JVM调优总结(2):基本垃圾回收算法:http://www.importnew.com/18740.html 3.JVM调优总结(3):垃圾回收面临的问题:http://www.importnew.com/18747.html 4.JVM调优总结(4):分代垃圾回收:http://www.importnew.com/19255.html 5.JVM调优总结(5):典型配置:http:

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

跟踪收集算法: 复制(copying): 将堆内分成两个相同空间,从根(ThreadLocal的对象,静态对象)开始访问每一个关联的活跃对象,将空间A的活跃对象全部复制到空间B,然后一次性回收整个空间A.因为只访问活跃对象,将所有活动对象复制走之后就清空整个空间,不用去访问死对象,不需要标记骤,所以遍历空间的成本较小,但需要巨大的复制成本和较多的内存. 标记清除(mark-sweep): 收集器先从根开始访问所有对象,标记活跃对象.然后再遍历一次整个内存区域,把所有没有标记活跃的对象进行回收处理

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

JVM常用调试用参数: –verbose:gc在虚拟机发生内存回收时在输出设备显示信息 -Xloggc:filename把GC相关日志信息记录到文件以便分析 -XX:-HeapDumpOnOutOfMemoryError当首次遭遇OOM时导出此时堆中相关信息 -XX:OnError="<cmdargs>;<cmd args>" 出现致命ERROR之后运行自定义命令 -XX:-PrintClassHistogram遇到Ctrl-Break后打印类实例的柱状信息,与

JVM调优系列:(二)JVM运行时数据区域

1) Method Area 2) Heap 3) Java Stacks 4) PC Registers 5) Native Method Stacks JAVA的JVM的内存模型大致可分为3个区: 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令) 2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身 栈区: 线程在执行一个Java方法时候,它的PC寄存器总是指向下一条需要执行的指令, 而它

JVM调优系列:(一)什么是JVM

SUN的JDK从1.3.1开始使用HotSpot虚拟机技术,主要使用C++实现,JNI接口部分用C实现. JAVA原先是把源代码编译为字节码在虚拟机执行,这样执行速度较慢.而HotSpot编译器将常用的部分代码编译为本地(native)代码,这样显著高了性能. HotSpot包括一个解释器和两个编译器,解释与编译混合执行模式,默认启动解释执行. 编译器:java源代码被编译器编译成class文件(字节码),java字节码在运行时可以被动态编译(JIT)成本地代码 解释器: 解释器用来解释clas

JVM调优总结(三) 基本垃圾回收算法

可以从不同的的角度去划分垃圾回收算法: 按照基本回收策略分 引用计数(Reference Counting): 比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回收时,只用收集计数为0的对象.此算法最致命的是无法处理循环引用的问题. 标记-清除(Mark-Sweep): 此算法执行分两阶段.第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除.此算法需要暂停整个应用,同时,会产生内存碎片. 复制(Copying): 此算

老男孩教育高端技术沙龙活动分享--JAVA JVM调优实战

本周末举办!,禁止空降,报名截止到5月8日19点报名方式见咨询QQ:  41117397 70271111电话: 01060747396  18911718229 18600338340官方群 246054962 208160987(标明51CTO) 报名条件:1.曾经支持关注老男孩博客及视频的朋友,需提供截图3条以上支持老男孩教育的评论(灌水不算).2.VIP运维班学员月薪低于9000(以提交的OFFER为准)或者没有实际维护JAVA环境(tomcat,resin等)的禁止报名.3.第10期以

SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行)

前言 本篇继续玩转模块的内容,关于索引在SQL Server的位置无须多言,本篇将分析如何利用Hint引导语句充分利用索引进行运行,同样,还是希望扎实掌握前面一系列的内容,才进入本模块的内容分析. 闲言少叙,进入本篇的内容. 技术准备 数据库版本为SQL Server2012,利用微软的以前的案例库(Northwind)进行分析,部分内容也会应用微软的另一个案例库AdventureWorks. 相信了解SQL Server的朋友,对这两个库都不会太陌生. 一.并行Hint提示 (MAXDOP N

jvm原理及性能调优系列(jvm调优)

个人认为jvm调优主要通过以下方法解决 1.设置合适的最大堆内存(新生代和老生代的最大和值)和最小堆内存(jvm启动时占用的操作系统内存大小),及设置好堆的比例分配. 2.设置合适的新生代 因为对其对系统性能和GC回收有一定的影响. 3.设置合适的持久代 因为其直接决定系统可以支持多少个类定义和多少个常亮. 4.设置合适的线程栈 否则系统可能因为线程所需资源和空间不够而异常退出.