- 浏览: 423648 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (239)
- java (59)
- JQuery (5)
- oracle (12)
- javascript (14)
- struts1 (1)
- spring (10)
- Quartz (2)
- ibatis (1)
- linux (32)
- weblogic (3)
- ibaits (2)
- servlet (1)
- log4j (5)
- 编程人生 (2)
- apache (3)
- window (3)
- web前端 (25)
- 错误集合 (2)
- 框架配置 (1)
- 开发工具 (15)
- 小插件应用 (1)
- lucene (1)
- sonar (1)
- velocity (1)
- 代码检查 (0)
- error (1)
- jndi (1)
- oracle函数 (1)
- tools (1)
- 代码管理 (3)
- mysql (4)
- maven (9)
- bat (1)
- git (3)
- aix (2)
- freemarker (1)
- svn (2)
- nginx (6)
最新评论
-
masuweng:
f
修改eclipse的内存 -
洞渊龙王:
...
maven-surefire-plugin学习 -
phf717601206:
WEB-INF/lib下就没有servlet-api.jar ...
Unable to read TLD "META-INF/c.tld"错误 -
sziitjiang:
很好,非常不错
Java读写excel之poi -
dengminghua1016:
doris1bruce 写道一、二、 ...
java创建对象的几种方式
-
一:Java虚拟机与程序的生命周期,如下几种情况Java虚拟机将结束生命周期
1,执行System.exit()方法
2,程序正常执行结束
3,程序执行过程中遇见到了异常或错误而异常终止
4,由于系统错误而导致Java虚拟机进程终止
二:Java程序对类的使用方式
1,主动使用(6种)
1):创建类的实例
2):访问某个类或静态变量,或者对静态变量赋值
3):调用类的静态方法
4):反射(如:Class.forName(“com.fov.IOTest”))
5):初始化一个类的子类
6):Java虚拟机启动的时候被标明的启动类(例如包含main方法的类)
只有当程序访问类的静态变量或静态方法确实在当前类或当前接口中定义时,才可以认为是对类或接口的主动使用
2,被动使用
除去主动使用外的都为被动使用
Java虚拟机必须在每个类或者接口被首次主动使用的时候才初始化他们
三:类的加载,连接与初始化
1,加载:是将类的.class文件的二进制文件读到内存中,将其放在运行时数据区的方法区里面,然后在堆内存创建一个java.lang.Class对象,用来封装在方法区内的数据结构。
1)加载类的方式:
1)),从本地系统中直接加载
2)),通过网络下载.class文件
3)),从zip,jar等归档文件中加载.class文件
4)),从专有的数据库中提取.class文件
5)),将Java源文件动态的编译为.class文件
2)类加载器种类:
1)),Java虚拟机自带的加载器
1))):根类加载器(Bootstrap)(c++编写无法在java代码中获得该类)
2))):扩展类加载器(Extension)(java实现)
3))):系统加载器(System)(java实现)
2)),用户自定义的类加载器
1))):java.lang.ClassLoader的子类
2))):用户可以通过定制类的加载方式
3),类加载器时间
1)):JVM允许类加载器在预料到某个类将要被使用的时候就预先加载它,如果预先加载的过程中遇到了某.class文件缺失或者错误,那么类加载器在程序首次使用该类的时候才报告错(LinkageError错误)
2)):如果该类一直没有被程序主动使用,那么类加载器就不会报告错误。
4),类加载器的父亲委托机制(Parent Delegation)
1)):根加载器(Bootstrap):该加载器没有父加载器。它负责加载虚拟机的核心类库,如 :java.lang.*,根加载器从系统属性sun.boot.class.path所指定的目录中加载类库,根加载器的实现依赖地层操作系统,它并没有继承java.lang.ClassLoader类
2)):扩展类加载器(Extension):它的父加载器为根类加载器〈父子加载器并不一定是继承关系〉,它从java.ext.dirs系统属性所指的目录中加载类库,或者从JDK的安装目录的jre//lib//ext子目录下加载类库,如果把用户创建的JAR文件放在这个目录下会自动被加载,该类是java.lang.ClassLoader类的子类。
3)):系统类加载器(System),也称为应用类加载器,它的父加载器为扩展加载器,它从环境变量classpath或者系统属性java.class.path所指定的目录加载类,它是用户自定的类加载器的默认父加载器,系统加载器是纯java类,是java.lang.ClassLoader类的子类。
5),定义类加载器
1)),如果某个类加载器能够加载一个类,那么该类加载器就称为定义类加载器,定义类加载器及起所有的子加载器都称为:初始类加载器
2)),当生成一个自定义的类加载器实例时,如果没有指定它的父加载器,那么系统加载器将是该类的父加载器。
3)),要创建类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的findClass(String name)方法即可,该方法根据参数指定的类的名字返回对应的Class对象的引用。
2,连接:
1)验证:确保被加载的类的正确性
类被加载后,就进去到连接阶段,连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行是环境中去。
验证内容:类文件结构检查,语义检查,字节码验证,二进制兼容性的验证
2)准备:为类的静态常量分配内存,并将其初始化为默认值
3)解析:把类中的符号引用转换为直接引用
3,初始化:为类的静态的变量赋予正确的初始值<用户所赋值>
类的初始化步骤
1),假如该类没有被加载和连接,那就先进行加载和连接
2),假如该类存在直接父类,并且该父类没有被初始化,那就初始化该类的父类(跟构造方法一样)<接口不会,只有当程序首次使用特定接口的静态变量的时候才会导致该接口被初始化>
3),假如该类中存在初始化语句,那就依次初始化这些语句。
类的初始化就是上面的6种主动方式,其他的被动使用都不会导致类的初始化
发表评论
-
org.apache.catalina.util.DefaultAnnotationProcessor cannot be cast to org.ap解决方案
2014-05-09 09:24 859是tomcat的lib文件夹jar包和项目的lib文件下的j ... -
基于mock对象和JUnit框架简化Spring Web组件单元测试(1)
2014-03-13 14:25 1779对于Java组件开发者来说,他们都盼望拥有一组能够对组件开 ... -
org.apache.taglibs.standard 转换成javax.servlet.jsp.tagext异常
2014-02-23 14:29 957java.lang.ClassCastExceptio ... -
acegi源码分析
2014-02-17 11:42 741AbstractProcessi ... -
深入研究java.lang.ThreadLocal类
2014-02-13 14:19 491一、概述 ThreadLocal是什么呢?其实Thr ... -
java synchronized详解
2014-02-13 09:38 723Java语言的关键字,当它用来修饰一个方法或者一个代码块的时 ... -
如何使用ide打jar包以及如何在cmd运行jar包
2013-12-02 00:05 1095一、怎么打jar包 第一步:选中要打jar包的工程 第二 ... -
window下Java环境配置
2013-08-29 13:54 4191.打开我的电脑--属性--高级--环境变量 ... -
Unable to read TLD "META-INF/c.tld"错误
2013-08-12 17:50 14226严重: Servlet.service() for ser ... -
According to TLD or attribute directive in tag file, attribute value does not ac
2013-07-28 23:39 15732jsp编译的时候失败,原因是servlet版本与jstl标 ... -
使用velocity启动项目报错
2013-05-21 12:12 11250启动tomcat时,出现 2007-3-15 16:42 ... -
文件解压和压缩
2013-04-14 20:42 954文件解压和压缩 /** * compress ... -
java操作properties属性文件
2013-04-14 20:40 1137java更新或增加 ... -
JAVA基本数据类型
2013-04-11 11:30 0数据类型 大小 范围 ... -
JAVA应用 之 排序
2013-02-25 10:36 867概述: 1.本文阐述对List(Array乱入)的 ... -
JAVA基础 之 Map
2013-02-25 10:27 950概述: 1.键值对,key-value,具有映射关 ... -
JAVA基础 之 Collections
2013-02-25 10:24 1271概述: 1.Collec ... -
java基础之异常
2013-02-25 09:55 924讲述: 1.五个关键字 1.tr ... -
java实现缓存技术
2013-01-27 12:48 0java实现缓存技术,有时候我们需要将一些数据缓存起来,什么时 ... -
java创建对象的几种方式
2013-01-27 10:13 6363(1) 用new语句创建对象,这是最常见的创建对象的方法。 ...
相关推荐
总的来说,JVM解析编译过的class文件是一个复杂的过程,涉及众多细节。开发者不仅要理解编译过程,还需要熟悉JVM的内部机制,才能更好地驾驭这个强大的平台。通过阅读相关博文,如给定的链接,可以进一步深入了解...
深入解析jvm深入解析jvm深入解析jvm深入解析jvm深入解析jvm深入解析jvm
2、Java 虚拟机栈:每个线程在创建时都会创建一个虚拟机栈,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法调用都会对应一个栈帧在虚拟机栈中进进出出,栈帧的大小主要取决于局部变量的数量和...
JVM 内存溢出问题解析 JVM 内存溢出是指程序运行所需的内存大于虚拟机能提供的最大内存的情况。这种情况可能是由于数据量过大、死循环、静态变量和静态方法过多、递归、无法确定是否被引用的对象等原因引起的。同时...
JVM 是 Java虚拟机,它是 Java 语言的核心组件之一,为 Java 程序提供了运行环境。JVM 的内存结构是 Java 程序的基础,它的设计和实现对 Java 程序的性能和可靠性产生了深远的影响。 JVM 的内存结构可以分为 6 个...
### Java中的JDK、JRE与JVM解析 #### 一、引言 在Java编程领域,JDK、JRE和JVM这三个概念是至关重要的基础知识点。虽然它们经常被提及,但很多人仍然对它们之间的关系和各自的功能感到困惑。这篇文章将深入探讨这...
jvm源码
方法区是JVM规范中的一部分,不同虚拟机实现时方法区的具体内容和管理方式可能会有所不同。 #### 运行时常量池 运行时常量池是方法区的一部分,它存放编译期生成的各种字面量和符号引用,并在类加载后被存放至方法...
Java虚拟机(JVM)是Java程序运行的核心,它负责解释和执行字节码,为Java应用程序提供了一个跨平台的运行环境。JDK(Java Development Kit)包含了开发和运行Java程序所需的所有工具,包括JVM。当我们谈论"jdk,jvm...
Java语言的一大特性是"一次编写,到处运行",这得益于JVM的存在。JVM执行Java字节码,使得编译后的Java程序可以在任何支持JVM的平台上运行。Java的开发流程包括编写源代码、编译成字节码、然后在JVM上解释执行或...
这些信息都是以一种固定的格式存储的,以便JVM能正确解析和执行。C#作为.NET框架的一部分,提供了丰富的库和工具,可以帮助我们解析这种非标准的二进制格式。 1. **字节码结构**: - 类文件以魔数(Magic Number)...
Java虚拟机(JVM)是Java编程语言的核心组成部分,它负责执行字节码,使得Java程序可以在任何支持JVM的平台上运行,实现“一次编写,到处运行”的目标。开源的JVM,如标题中提到的,允许开发者深入理解JVM的工作原理...
4. 解析:JVM解析类中的符号引用,将其转换为直接引用。这涉及类、接口、字段和方法的引用。 5. 初始化:最后,JVM执行类的初始化方法(),对静态变量进行显式初始化。 用Java解析class文件,意味着我们可以编写...
Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。本文将深入探讨JVM的启动过程及其基本原理。 首先,我们需要理解JVM的基本概念。JVM是Java Virtual Machine的缩写,它是...
当一个方法被调用时,JVM会在栈中创建一个对应的栈帧,用于存储局部变量表、操作数栈、动态链接以及方法出口等信息。当方法执行完毕或抛出异常,对应的栈帧就会被弹出,释放其所占用的栈空间。 2. **本地方法栈**:...
以下是对这些知识点的详细解析: 1. 栈内存溢出:栈内存主要存放方法调用时的局部变量表、操作数栈、动态链接和方法返回地址。当线程请求的栈深度超过虚拟机允许的最大深度,比如递归调用过多或单个方法的局部变量...
[jvm]深入JVM(一):从"abc"=="abc"看java的连接过程收藏 一般说来,我不关注java底层的东西,这次是一个朋友问到了,注意不光是 System.out.println("abc"=="abc");返回true, System.out.println(("a"+"b"+"c")....
本手册将深入解析JVM指令,特别是数值类型操作、常量推送、变量加载等操作指令。 首先,简单数值类型的指令操作主要指的是将基础的数值类型如int、long、float和double等推送到操作数栈顶。这类操作包括iconst_m1、...