- 浏览: 189569 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
elena_me:
o0teamo0o 写道您的这个 缺少了一个StringUti ...
银联生成ARQC,ARPC,MAC,CVN生成 -
lemonhou:
按照要求改了,还是报一样的错
The Maven Integration requires that Eclipse be running in a JDK -
o0teamo0o:
您的这个 缺少了一个StringUtils工具类,能提供一下么 ...
银联生成ARQC,ARPC,MAC,CVN生成 -
306963591:
附件密码123456
银联生成ARQC,ARPC,MAC,CVN生成 -
lz_cleaner:
虽然有点老了,可还是谢谢你的分享。。。。
jira手册
JVM的结构
从功能上分,Java虚拟机主要由六个部分组成,可以分成三类:
第一类:JVM API:就是我们最常用的Java API,它是开发人员和Java交互的入口,它主要是JAVA_HOME/jre/lib下的运行时类库rt.jar和编译相关的tools.jar
第二类:JVM内部组件
类装载器(ClassLoader):将Byte Array的 .class文件装载、链接和初始化。
内存管理(Memory Managent):为对象分配内存,以及释放内存。后者就是垃圾回收Garbage Collector(GC)。由于JVM最复杂的、最影响性能的就是GC,所以内存管理一般就指垃圾回收。
诊断接口(Diagostics Interface):这主要体现在JVMTI(jdk1.4下的JVMPI和JVMDI),它主要用来诊断程序的问题和性能,一般提供给工具厂商实现。如eclispe IDE下的debug功能,Jprofiler性能调优工具。
类解释器(Interpreter):解释装载进虚拟机的class对象,包括JIT等特性相关。
第三类:平台相关接口(Platform Interface):主要为了跨操作系统平台重用JVM代码,不过,它和我们开发人员关系不大。
在以上六个组件中,我们开发人员最关心的是ClassLoader和GC,用Java做系统框架、容器和它们密切相关。做业务系统时一些基础代码也和它们打交道,譬如最常用的Class.forName(),Thread.currentThread.getContextClassLoader()。我们仔细想想,为什么是上面两个问题?因为,它和我们class的整个生命周期最为相关:怎么将一个class和相关class加载进来,class实例什么时候创建,什么时候被销毁?
所以,下面的部分我们要专门讨论这些问题。
ClassLoader
JVM主要有三类ClassLoader:Bootstrap、Extention、Application,该三类ClassLoader从上到下是分级(hierarchy)结构,遵循代理模型(Delegation Model)。
Tip:大家可以看看sun.misc.Launcher的源码,Bootstrap和Extention就在该文件里。该src可以在sun的网站上下载该压缩包,约60M(jdk-1_5_0-src-scsl.zip),它不在jdk自带的那个src.zip里。
Bootstrap ClassLoader:也称为primordial(root) class loader。主要是负责装载jre/lib下的jar文件,当然,你也可以通过-Xbootclasspath参数定义。该ClassLoader不能被Java代码实例化,因为它是JVM本身的一部分。
Extention ClassLoader:该ClassLoader是Bootstrap classLoader的子class loader。它主要负责加载jre/lib/ext/下的所有jar文件。只要jar包放置这个位置,就会被虚拟机加载。一个常见的、类似的问题是,你将mysql的低版本驱动不小心放置在这儿,但你的Web应用程序的lib下有一个新的jdbc驱动,但怎么都报错,譬如不支持JDBC2.0的DataSource,这时你就要当心你的新jdbc可能并没有被加载。这就是ClassLoader的delegate现象。常见的有log4j、common-log、dbcp会出现问题,因为它们很容易被人塞到这个ext目录,或是Tomcat下的common/lib目录。
Application ClassLoader:也称为System ClassLoaer。它负责加载CLASSPATH环境变量下的classes。缺省情况下,它是用户创建的任何ClassLoader的父ClassLoader,我们创建的standalone应用的main class缺省情况下也是由它加载(通过Thread.currentThread().getContextClassLoader()查看)。
我们实际开发中,用ClassLoader更多时候是用其加载classpath下的资源,特别是配置文件,如ClassLoader.getResource(),比FileInputStream直接。
ClassLoader是一种分级(hierarchy)的代理(delegation)模型。
Delegation:其实是Parent Delegation,当需要加载一个class时,当前线程的ClassLoader首先会将请求代理到其父classLoader,递归向上,如果该class已经被父classLoader加载,那么直接拿来用,譬如典型的ArrayList,它最终由Bootstrap ClassLoader加载。并且,每个ClassLoader只有一个父ClassLoader。
Class查找的位置和顺序依次是:Cache、parent、self。
Hierarchy:上面的delegation已经暗示了一种分级结构,同时它也说明:一个ClassLoader只能看到被它自己加载的classes,或是看到其父(parent) ClassLoader或祖先(ancestor) ClassLoader加载的Classes。
在一个单虚拟机环境下,标识一个类有两个因素:class的全路径名、该类的ClassLoader。
我碰到的一个典型的例子是:在做WAS的SSO开发时,由于我们的类是由WAS在启动时加载,该ClassLoader比下面的部署的Applicaton的ClassLoader的级别高。所以,在我们自己的类中没法用到应用程序的连接池,必须自建。
代理模型是Java安全模型的保证。譬如,我们自己写一个String.java,并且编译、package到自己的java.lang包下。按照代理模型,当前线程的ClassLoader会将其代理到父ClassLoader,父ClassLoader(最终会是Bootstrap)会找到rt.jar下的String.class,也就是说我们的String.class不会捣乱。
自定义ClassLoader
我们前面说过,自定义ClassLoader的缺省父ClassLoader是Application ClassLoader。一般的应用开发用不到它,但我们最好理解。因为在内存泄漏查找、应用程序部署出问题时,很多都和它有关。
譬如,内存泄漏是怎么产生的?这就涉及到ClassLoader和Class的生命周期。我曾经碰到这样一个问题:我们的程序用到了Webwork和Spring框架,当部署到Tomcat下时没有任何问题,但部署到WAS下,报告找不到Webwork的xml的DTD文件,而且Spring的日志也总是失效。Why?因为解析xml dtd时,用的是IBM的Xerces,不是我们的。而Spring日志问题是因为应用程序用的是WAS的Common-log.jar,而不是我们的。将应用的ClassLoader从默认的Parent-First,改成Parent-Last就可以解决,不过我们项目中用到其它库,又发生了其它问题。
一般来说,用到自定义ClassLoader有三种情况:
1、应用框架可以自己控制Classes的目录,并且自动部署。
我读过Jive公司的Wildfire(著名的即时通讯服务器),它自己有一套应用框架,非常灵活,遵循该框架插件规范的的第三方的plug-in放置在指定目录可以自动部署,实现某些扩展功能,如文件传输、语音聊天。
2、区分用户代码
这被广泛应用在Servlet容器和类似容器,譬如EJB Container设计中,大家看到Tomcat下有common、server、share三个目录吧(ClassLoader顺序从左到有),另外也有用户应用的WEB-INF目录,它是我们自己开发的。
3、允许Classes卸载
如果没有自定义的ClassLoader,那么我们自己应用中的classes永远都不能被卸载,因为这些类被Application ClassLoader加载后cache起来了,我们的classes一直对该ClassLoader有引用,而该系统级的ClassLoader永远都不会被卸载,除非JVM shutdown了。JSP和Servlet的动态部署就用到这个特性。
这部分内容,《Inside Java Virtual Machine》讲解非常清楚,BEA的官方网站这部分也非常不错,要理解深刻,我建议结合JProfiler工具,非常直观
发表评论
-
根据文件中jar地址生成jar
2011-08-18 10:22 1031import java.io.File; import ja ... -
java实现解压zip文件
2011-07-04 19:10 1875注意: 1:使用jdk自带的zip的util的工具类实现解压 ... -
插入clob数据(template data)
2011-05-12 12:32 1804package com.icitic.iccard.dp.te ... -
DP判断取多少字节根据银联
2011-05-12 12:26 1323/** * */ package com.icit ... -
java类的初始化
2011-03-17 15:06 1026类的初始化时机: 1:创建类的实例。 2: 访问某个类或接 ... -
dom4j解析xml
2010-12-02 17:11 2538package com.gd.xml.parse; im ... -
java实现分页
2010-11-30 21:15 2185平时我们用到的分页程序主要有两种分页方式: 1:用数据库进行 ... -
使用SAX解析xml文件
2010-11-29 21:29 1370通常解析xml文件我们主要用到的时候利用第三方的jar包如:j ... -
解决Struts2中表单提交到action时的中文乱码
2010-11-20 15:21 5260在struts2的开发过程中出现乱码的情况如下: 1:jsp ... -
Eclipse反编译插件: Jodeclipse与JadClipse
2010-11-03 12:20 1161Jodeclipse 是Jode的Eclipse插件,JadC ... -
java.util.logging日志功能使用
2010-09-17 15:37 1358Java Logging API是sun公司于2002年5月正 ... -
Java异常处理
2010-09-14 17:20 1306一、Java中异常概述 1.1J ... -
System.getProperty()参数大全
2010-09-06 21:08 696java.version ... -
hibernate缓存
2010-09-06 20:30 675很多人对二级缓存都不太了解,或者是有错误的认识,我一直想写一篇 ... -
深入探讨 Java 类加载器
2010-09-06 16:56 760简介: 类加载器(class ... -
ClassLoader加载类的路径问题
2010-09-06 16:43 1537有的时候我们需要读取文件,文件的路径若写死了,当我们上线的时候 ... -
Thread匿名内部类为什么 必须声明为final变量?
2010-09-06 15:09 3242匿名内部类实用定义在外部的变量,该变量必须是final类型1: ... -
使用正则表达式抓取页面Email
2010-09-05 18:57 1246当我们做广告的时候,有的时候需要给很多匿名用户发Email来实 ... -
java定时器Timer,TimerTask每隔一段时间随机生成数字
2010-09-05 11:09 142741:java.util.Timer类是一种工具,线程用其安排以 ... -
Scanner读取文件和StringBuffer读取文件
2010-09-05 10:20 9149Scanner扫描器读取文件注意事项: 1:Scan ...
相关推荐
JVM结构:类加载器,执行引擎,本地方法接口,本地内存结构; 四大垃圾回收算法:复制算法、标记-清除算法、标记-整理算法、分代收集算法 七大垃圾回收器:Serial、Serial Old、ParNew、CMS、Parallel、Parallel Old...
在"【IT十八掌徐培成】Java基础第25天-06.JVM结构1"的课程中,我们将会深入探讨JVM的内部结构,了解它是如何使得Java具有跨平台特性的。 首先,JVM可以分为以下几个主要部分: 1. **类加载器(ClassLoader)**:它...
在本课程"【IT十八掌徐培成】Java基础第26天-03.JVM结构-finalize-gc"中,我们将深入探讨JVM的结构、`finalize`方法以及垃圾收集(Garbage Collection,简称GC)机制。以下是这些主题的详细阐述: 1. JVM结构: - ...
JVM结构+垃圾回收器+锁总结
### JVM基本原理及结构详解 #### 一、Java虚拟机(JVM)的逻辑与物理结构 JVM,即Java Virtual Machine,是运行Java字节码的虚拟机环境,它的设计目的是为了提供一个独立于硬件的运行环境,使得Java程序可以在任何...
1. **JVM结构与原理**:首先,我们需了解JVM的基本架构,包括类装载器、运行时数据区、执行引擎、本地方法接口和本地库。特别是堆内存、栈内存、方法区(元空间)以及垃圾收集机制,它们是理解JVM运行时行为的关键。...
### JVM结构与工作原理 JVM主要由以下几个部分组成: 1. **类加载器(ClassLoader)**:负责加载.class文件,将字节码转换为内存中的类。 2. **运行时数据区(Runtime Data Area)**:包括方法区、堆、栈、本地方法...
在这个资源中,我们将详细讨论 JVM 内存参数的配置和调优,包括 JVM 的结构、内存管理、垃圾回收、堆和非堆内存、内存分配和限制等方面。 JVM 结构 JVM 的结构主要由六个部分组成:JVM API、JVM 内部组件、平台...
**一、JVM结构** JVM主要由以下几个部分组成: 1. **类装载器**:负责加载.class文件,将其转换成Java对象,并存放在内存中。 2. **运行时数据区**:包括堆、方法区、虚拟机栈、本地方法栈和程序计数器。堆存储...
### JVM内存结构详解 #### 一、概述 Java虚拟机(JVM)作为Java程序的运行环境,其核心组件之一便是内存管理系统。理解JVM的内存布局对于开发高性能的应用程序至关重要。本文将详细介绍JVM内存结构及其各个组成部分...
Java虚拟机(JVM)内存结构与配置是Java开发者必须理解的重要概念,它涉及到程序的运行效率和稳定性。本文将详细解析JVM的内存结构、内存分配策略以及相关的配置参数。 1. **JVM内存结构** JVM内存主要分为以下几...
理解JVM结构对于优化性能至关重要。例如,在多web应用共用一个服务器(如Tomcat)的情况下,每个应用有自己的类加载器,从而在逻辑上隔离各个应用,减少干扰。 接下来,我们探讨堆与栈的区别: - **栈** 主要处理...
1. **JVM结构** JVM由类加载器、运行数据区、执行引擎、本地方法接口和本地库组成。类加载器负责加载字节码文件,运行数据区包括堆、栈、方法区等,执行引擎负责解释或编译执行字节码,本地方法接口用于调用非Java...
1. **JVM结构与工作原理**: - 类加载机制:了解类如何被加载、验证、准备、解析和初始化,以及双亲委托模型。 - 运行时数据区:包括堆、方法区、虚拟机栈、本地方法栈和程序计数器等各个区域的作用和管理策略。 ...
1. **JVM结构** JVM主要由以下几个部分组成: - **类装载器(Class Loader)**:负责加载字节码文件(.class)到JVM内存。 - **运行时数据区(Runtime Data Areas)**:包括方法区、堆、虚拟机栈、本地方法栈和...
**一、JVM结构与工作流程** 1. **类加载子系统**: JVM负责加载、验证、准备、解析和初始化类。类加载器包括启动类加载器、扩展类加载器和应用类加载器等,它们遵循双亲委派模型。 2. **运行时数据区**: 包括方法区...
一、JVM结构 JVM主要由以下几个核心组件构成: 1. **类加载器(Class Loader)**:负责加载类文件,将.class文件转换为内存中的类对象。 2. **运行时数据区(Runtime Data Area)**:包括堆(Heap)、方法区...
1. **JVM结构与工作原理**: - 类加载机制:JVM如何加载类文件,包括加载、验证、准备、解析和初始化五个阶段。 - 运行时数据区:堆、栈、方法区、本地方法栈、程序计数器等区域的定义和作用。 - 字节码执行引擎...
《JVM高级特性与最佳实践》是一本专注于Java虚拟机(JVM)学习的书籍,适合广大Java开发人员。...通过此书,读者不仅可以获得关于JVM结构和工作原理的全面认识,还能掌握在开发过程中应用这些知识的技巧和方法。
一、JVM结构 JVM主要由以下几个部分组成: 1. **类装载器(ClassLoader)**:负责加载.class文件,解析字节码并将其转换为运行时数据结构。 2. **运行时数据区(Run-Time Data Areas)**:包括方法区、堆、虚拟机栈、...