「java类生命周期」java生命周期的概念
本篇文章给大家谈谈java类生命周期,以及java生命周期的概念对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
java的类加载后什么时候会被释放?
首先,"java的类在第一次需要创建类的实例(对象)时被加载"这个说的不对\x0d\x0a\x0d\x0ajava中类被使用就就会时就会被加载到内存(比如反射等)\x0d\x0a然后回答你的问题。\x0d\x0a\x0d\x0a首先要介绍下相关知识(基础知识纯属拷贝):\x0d\x0a\x0d\x0a首先来了解一下jvm(java虚拟机)中的几个比较重要的内存区域\x0d\x0a\x0d\x0a方法区:在java的虚拟机中有一块专门用来存放已经加载的类信息、常量、静态变量以及方法代码的内存区域,叫做方法区。\x0d\x0a常量池:常量池是方法区的一部分,主要用来存放常量和类中的符号引用等信息。\x0d\x0a堆区:用于存放类的对象实例。\x0d\x0a栈区:也叫java虚拟机栈,是由一个一个的栈帧组成的后进先出的栈式结构,栈桢中存放方法运行时产生的局部变量、方法出口等信息。当调用一个方法时,虚拟机栈中就会创建一个栈帧存放这些数据,当方法调用完成时,栈帧消失,如果方法中调用了其他方法,则继续在栈顶创建新的栈桢。\x0d\x0a 除了以上四个内存区域之外,jvm中的运行时内存区域还包括本地方法栈和程序计数器,这两个区域与java类的生命周期关系不是很大,在这里就不说了,感兴趣可以自己百度一下。\x0d\x0a\x0d\x0a其实类在JVM里面有以下几个阶段:\x0d\x0a\x0d\x0a加载 -- 连接 -- 初始化 -- 使用 -- 卸载 \x0d\x0a\x0d\x0a主要给你说明卸载:\x0d\x0a在类使用完之后可能会被卸载,可能性如下:\x0d\x0a如果有下面的情况,类就会被卸载:\x0d\x0a该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。\x0d\x0a加载该类的ClassLoader已经被回收。\x0d\x0a该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。\x0d\x0a 如果以上三个条件全部满足,jvm就会在方法区垃圾回收的时候对类进行卸载,类的卸载过程其实就是在方法区中清空类信息,java类的整个生命周期就结束了。
Java类的生命周期包括哪几个阶段
加载:查找并加载类的二进制数据
连接:分为三个小阶段:
验证:确保被加载的类的正确性
准备:为类的静态变量分配内存,并将其初始 化为默认值
解析:把类中的符号引用转换为直接引用
初始化:为类的静态变量赋予正确的初始值
使用:又分为主动使用和被动使用。
卸载:由JVM自带的类加载器所加载的类,在JVM的生命周期中,始终不会被卸载。但是由用户自定义的类加载器所加载的类是可以被卸载的。
以上只是做部分说明。 要细说的话,内容还是很多的。
java中变量的生命周期是怎样的?
这个要从作用域开始说起。
像局部变量的作用域就是他的生命周期。
比如if ,for ,switch等等这些。
出了这个结构就销毁了。
方法里的局部变量,在方法调用完就销毁。
如果是类的成员变量,在类的相应的对象销毁的时候销毁。
上面说的是普通变量,如果是静态变量的时候,从程序开始,到程序结束。
变量的生命周期要看你把这个变量声明在哪个语句模块中,如果是类的成员变量,则其声明周期贯穿整个其对象的生命周期,如果是方法内的变量(局部变量),则仅仅在该方法内有效,出了方法体则无效,失去意义;static是修饰静态代码块或者成员变量或者方法的,其方法或者代码块的生命周期横跨整个应用的生命周期。final修饰的变量只是作为一个常量(定义的标准)来用而已,其生命周期同一般变量,当然接口中的变量默认都是final的。
类加载的生命周期
一个类型(泛指类或接口)从被加载到虚拟机内存,到卸载出内存为止,整个生命周期将会经历 加载 、 验证 、 准备 、 解析 、 初始化 、 使用 和 卸载 七个阶段,其中验证、准备、解析三个阶段合并称为 连接 。
其中,加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类型的加载过程必须按照此顺序(加载和连接阶段会交叉进行,且加载开始时间始终早于连接)。
解析的位置并不固定 。某些情况下,它可以在初始化阶段之后开始,目的是 支持 Java 语言的运行时绑定特性 (也成为动态绑定和晚期绑定)。
Java 虚拟机规范未规定什么情况下需要开始类加载过程的第一个阶段 加载 ,可由虚拟机具体实现自由把握。
初始化阶段则严格规定有且仅有六种情况需要即刻对类进行 初始化 :
对于这六种会触发类型进行初始化的场景,其行为称为 主动引用 。除此之外,所有引用类型的方式都不会触发初始化,称为 被动引用 。
以下三种场景即为被动引用的典型场景:
另外,接口初始化时,不要求其父接口全部都完成初始化,只有使用到父类时才会进行初始化。
java线程的生命周期有哪些
生命周期的五种状态
新建(new Thread)
当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)。
例如:Thread t1=new Thread();
就绪(runnable)
线程已经被启动,正在等待被分配给CPU时间片,也就是说此时线程正在就绪队列中排队等候得到CPU资源。例如:t1.start();
运行(running)
线程获得CPU资源正在执行任务(run()方法),此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束。
死亡(dead)
当线程执行完毕或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态等待执行。
自然终止:正常运行run()方法后终止
异常终止:调用stop()方法让一个线程终止运行
堵塞(blocked)
由于某种原因导致正在运行的线程让出CPU并暂停自己的执行,即进入堵塞状态。
正在睡眠:用sleep(long t) 方法可使线程进入睡眠方式。一个睡眠着的线程在指定的时间过去可进入就绪状态。
正在等待:调用wait()方法。(调用motify()方法回到就绪状态)
被另一个线程所阻塞:调用suspend()方法。(调用resume()方法恢复)
java类生命周期的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java生命周期的概念、java类生命周期的信息别忘了在本站进行查找喔。