JVM系列(四)生命周期和classloader

  大体上,class的生命周期是这样子的:

加载相关内容

classLoader是什么?通过一个类的全限定名,获取这个类的二进制字节码。

区分两种classLoader:

1、bootStrap,C++实现,是虚拟机的一部分;

2、其他,java实现,虚拟机外部,继承自java.lang.ClassLoader。

另外一种区分方式:

1、启动 Bootstrap Classloader

主要面对JAVA_HOME/LIB目录

2、扩展Extention Classloader

主要面对JAVA_HOME/lib/ext目录

3、application classloader。

面对ClassPath目录。

classLoader的层次关系:双亲委托模型。

使用这个模型的好处是判定父类是否被加载过,避免重复加载。

连接

  • 验证
  • 准备
  • 解析
  • 是否初始化判定

初始化

一个类被直接引用则初始化,否则就是被动引用,不会初始化

使用

卸载

是否被卸载的判定:

  • 该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。
  • 加载该类的ClassLoader已经被回收。
  • 该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。

怎样卸载?

在方法区中清空类信息

有道云笔记:http://note.youdao.com/share/?id=08b5ff2bbad87e4e784104126c5f06f6&type=note

时间: 2025-01-02 20:51:04

JVM系列(四)生命周期和classloader的相关文章

JVM系列(四) - JVM垃圾回收算法

前言 前面介绍了Java内存运行时区域,其中 程序计数器.虚拟机栈.本地方法栈 三个区域随线程而生,随线程而灭:栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作.每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这几个区域的内存分配和回收都具备确定性.在这几个区域内不需要过多考虑回收的问题,因为方法结束或线程结束时,内存自然就跟随着回收了. Java堆 和 方法区 则不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样.我们只

精通Hibernate——Java对象在JVM中的生命周期

当应用程序通过new语句创建一个对象时,JVM会为这个对象分配一块内存空间,只要这个对象被引用变量引用,他就一直存在在内存当中.当这个对象不被任何对象引用的时候,他的生命周期就意味着结束,JVM会在适当的时候回收这个对象.下面通过代码来演示下生命周期: Customer c = new Customer("Tom",new HashSet()); Order o1 = new Order("Tom_order001",null); Order o2 = new Or

React 源码剖析系列 - 生命周期的管理艺术

目前,前端领域中 React 势头正盛,很少能够深入剖析内部实现机制和原理. 本系列文章 希望通过剖析 React 源码,理解其内部的实现原理,知其然更要知其所以然. 对于 React,其组件生命周期(Component Lifecycle)是它的核心概念,本文从源码入手,来剖析 React 生命周期的管理艺术. 阅读本文需要对 React 有一定的了解,如果你不知何为组件的生命周期,请详读 React 生命周期的文档. 如果你对 React 组件的生命周期存在些许疑惑,如生命周期如何顺序管理:

[转]JVM系列四:生产环境参数实例及分析【生产环境实例增加中】

原文地址:http://www.cnblogs.com/redcreen/archive/2011/05/05/2038331.html java application项目(非web项目) 改进前: -Xms128m-Xmx128m-XX:NewSize=64m-XX:PermSize=64m-XX:+UseConcMarkSweepGC-XX:CMSInitiatingOccupancyFraction=78-XX:ThreadStackSize=128-Xloggc:logs/gc.log

JVM系列四:生产环境参数实例及分析【生产环境实例增加中】

java application项目(非web项目) 改进前: -Xms128m-Xmx128m-XX:NewSize=64m-XX:PermSize=64m-XX:+UseConcMarkSweepGC-XX:CMSInitiatingOccupancyFraction=78-XX:ThreadStackSize=128-Xloggc:logs/gc.log-Dsun.rmi.dgc.server.gcInterval=3600000-Dsun.rmi.dgc.client.gcInterva

JVM 类型的生命周期学习

Java虚拟机通过装载.连接和初始化一个JAVA类型,使该类型可以被正在运行的JAVA程序所使用,其中,装载就是把二进制形式的JAVA类型读入JAVA虚拟机中:而连接就是把这种读入虚拟机的二进制形式的类型数据合并到虚拟机的运行时状态中去. 连接阶段分为三个子步骤----验证.准备和解析. "验证"步骤确保了JAVA类型数据格式正确并且适用于JAVA虚拟机使用. "准备"步骤负责为该类型分配它所需的内存,比如为它的类变量分配内存. "解析"步骤则负

JVM生命周期

JVM生命周期可以分为以下三个阶段 启动:任何class文件的main函数都可认为是jvm示例的起点. 运行:以main函数为起点,后续的线程都由它启动,包括守护线程和用户线程.main方法启动的线程是用户线程,守护线程是JVM自己使用的线程如GC线程. 退出&异常退出:用户线程完全退出了,jvm示例结束生命周期. JVM退出可能原因分析 (1)执行了System.exit()方法. (2)程序正常运行结束(程序的运行,是启动JVM的一个进程,进程中包含一个主线程去运行应用程序) (3)程序运行

jvm系列(八):jvm知识点总览-高级Java工程师面试必备

在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功.对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内功直接去伤人,只能靠招式,利刃上优势来取胜了,但是练到高手之后,内功就更主要了.一个内功低的人招式在奇妙也打不过一个内功高的人.比如,你剑法再厉害,一剑刺过来,别人一掌打断你的剑,你还怎么使剑法,你一掌打到一个武功高的人身上,那人没什么事,却把你震伤了,你还怎么打.同样两者也是相辅相成的,内功深厚之后,原来普通的一招一式威力也会倍增. 对于搞开发的我们其实也是

java类生命周期详细解析

(一)详解java类的生命周期 引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告诉你“怎样做”,但至于“为什么这样做”却不多说,所以造成大家在基础和原理方面的知识比较匮乏,所以笔者今天就斗胆来讲一下这个问题,权当抛砖引玉,希望对在这个问题上有疑惑的朋友有所帮助,文中有说的不对的地方,也希望各路高手前来指正. 首先来了解一下jvm(java虚拟机)