`

JVM调优系列:(三)(转)

    博客分类:
  • JVM
 
阅读更多

转自:http://blog.csdn.net/opensure/article/details/46715705

 

类加载机制

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调优笔记.docx

    ### 马士兵JVM调优笔记知识点梳理 #### 一、Java内存结构 Java程序运行时,其内存被划分为几个不同的区域,包括堆内存(Heap)、方法区(Method Area)、栈(Stack)、程序计数器(Program Counter Register)以及...

    monkey老师的jvm 调优

    《Monkey老师的JVM调优深度解析》 在Java开发领域,JVM(Java Virtual Machine)是每一个程序员都需要深入了解的关键组成部分。Monkey老师的JVM调优课程,无疑为我们提供了一个宝贵的平台,来深入探究JVM的工作原理...

    JVM系列之性能调优参考手册(实践篇).pdf

    3. 不稳定参数(不稳定参数):以“-XX”开头,这些是非标准化参数,主要用于JVM调优和Debug。它们可以开启或关闭某些特性,或者对某些特性设置具体的数值。例如,“-XX:+UseConcMarkSweepGC”用于启用CMS垃圾回收器...

    JVM 调优演示-JVM.zip

    JVM调优是一项重要的技能,它能够帮助我们优化应用程序的性能,减少内存消耗,提高响应速度,确保系统的稳定性和可扩展性。本资料"JVM 调优演示-JVM.zip"包含了一个名为"JVM-master"的项目,我们可以从以下几个方面...

    Jvm调优练习-jvm-tuning.zip

    JVM调优涉及到调整一系列参数,以优化应用程序的性能,包括内存分配、垃圾收集策略、线程管理以及编译器优化等。 【描述】"Jvm调优练习-jvm-tuning" 暗示了这个压缩包可能包含一系列实验或教程,帮助用户通过实际...

    JVM调优详解学习教程(共12节).zip

    本教程将深入探讨JVM调优的各个方面,帮助开发者优化Java应用程序的执行环境,确保系统资源得到最佳利用。 首先,我们要了解JVM的工作原理。JVM是一个运行Java字节码的虚拟计算机,它负责类加载、内存管理、垃圾...

    JVM调优的测试项目-JVM-subject.zip

    这个名为"JVM-subject-master"的项目,很可能是包含了一系列的测试用例、脚本和分析报告,用于模拟不同的工作负载,帮助开发者实践和理解上述的JVM调优知识点。通过深入研究和实践这个项目,可以提升我们的JVM调优...

    jvm调优学习-optimizeJVM.zip

    "jvm调优学习-optimizeJVM.zip" 文件可能包含了一系列关于JVM调优的学习资料,特别是"optimizeJVM-develop"这个子文件可能涵盖了开发阶段的JVM优化实践。 1. **JVM架构** - 类加载器:负责加载类文件,包括启动类...

    jvm调优,内存管理

    进行JVM调优前,我们需要借助一系列的工具来帮助我们了解当前系统的状态和瓶颈所在。常见的测量工具有: - **GC Log**: 用于记录垃圾回收的日志信息,通过分析这些日志可以帮助我们理解GC的行为模式及其效率。 - **...

    JVM调优

    本篇将围绕“JVM调优”这一主题,深入探讨相关知识点。 首先,我们要理解JVM的基本结构,它主要由类加载器(ClassLoader)、运行时数据区(Runtime Data Area)、执行引擎(Execution Engine)、本地方法接口(Native ...

    JVM实战-JVM调优案例分析与MyEclipse性能调优实战

    ### JVM实战-JVM调优案例分析与MyEclipse性能调优实战 #### 实验背景与目标 在现代软件开发过程中,提升开发效率是至关重要的环节之一。MyEclipse和Eclipse作为主流的集成开发环境(IDE),被广泛应用于Java项目的...

    JVM优化3(Tomcat参数调优,JVM参数调优,jvm字节码,代码优化).pdf

    本篇文件内容主要介绍了JVM优化的第三部分,重点围绕Tomcat参数调优、JVM参数调优、JVM字节码优化以及代码优化等几个方面。下面是针对这些知识点的详细解释: 1. Tomcat参数调优 在Tomcat参数调优部分,首先介绍了...

    JVM入门实战/arthas实战/垃圾回收算法/垃圾回收器/jvm内存模型分析

    本系列课程从JVM基础到高级实战,老师手把手教你如何进行JVM调优,思路清晰,没有废话,旨在挑战高薪。 课程亮点: 1、基于阿里arthas进行JVM调优; 2、基于代码排查OOM问题,拒绝空讲; 3、总结JVM通用的调优思路;...

    weblogic jvm调优

    ### WebLogic JVM调优:利用JVM查找WebLogic内存泄露原因 #### 一、引言 在企业级应用开发和运维过程中,WebLogic作为一个广泛使用的Java应用服务器,其性能优化和故障排查至关重要。特别是在面对复杂的企业级应用...

    JVM_GC调优

    ### JVM_GC调优详解 #### 一、JVM体系结构概览 Java虚拟机(JVM)作为Java程序的运行环境,其内部结构复杂且高效。为了更好地理解JVM_GC调优,我们首先来了解一下JVM的基本组成部分。 1. **类装载器子系统(Class ...

    JvmTune:jvm调优相关示例

    `JvmTune`项目提供了一系列的JVM调优示例,旨在帮助开发者更好地理解和实践JVM的优化技巧。 首先,我们需要了解JVM的内存模型。JVM内存主要分为堆内存(Heap)和非堆内存(Non-Heap)两大部分。堆内存主要用于对象...

    SpringBoot 深度调优,让你的项目飞起来!1

    其次,**JVM调优**是另一个关键环节。Java虚拟机(JVM)的性能直接影响到Spring Boot应用的运行效率。Oracle官方提供了一份JVM调优指南([参考链接]...

    JVM体系结构与GC调优

    **JVM体系结构与GC调优** Java虚拟机(JVM)是Java应用程序的核心组成部分,它为Java程序提供了跨平台的运行环境。了解JVM的体系结构和垃圾收集(Garbage Collection, GC)机制对于优化Java应用性能至关重要。 **1...

Global site tag (gtag.js) - Google Analytics