- 浏览: 115197 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
SSB4455:
嗯 应该是这样
java线程学习之Thread.sleep() 和 Thread.yield() 区别 -
wishlee:
不详细啊
Java中23种设计模式详解 -
Vin-G:
正在学习,我想修改成:在主屏中不能长按和拖拉,不知道能不能实现 ...
android2.2源码在eclipse中的配置与分析 -
star_887012:
qq16881699 写道LZ的文章就是海量数据。。。。
常见的海量数据处理方法 -
I清晰:
看来头疼啊
常见的海量数据处理方法
在我们运行和调试Java程序的时候,经常会提到一个JVM的概念.JVM是Java程序运行的环境,但是他同时一个操作系统的一个应用程序一个进程,因此他也有他自己的运行的生命周期,也有自己的代码和数据空间.
首先来说一下JVM工作原理中的jdk这个东西,不管你是初学者还是高手,是j2ee程序员还是j2se程序员,jdk总是在帮我们做一些事情.我们在了解Java之前首先大师们会给我们提供说jdk这个东西.它在Java整个体系中充当着什么角色呢?我很惊叹sun大师们设计天才,能把一个如此完整的体系结构化的如此完美.jdk在这个体系中充当一个生产加工中心,产生所有的数据输出,是所有指令和战略的执行中心.本身它提供了Java的完整方案,可以开发目前Java能支持的所有应用和系统程序.这里说一个问题,大家会问,那为什么还有j2me,j2ee这些东西,这两个东西目的很简单,分别用来简化各自领域内的开发和构建过程.jdk除了JVM之外,还有一些核心的API,集成API,用户工具,开发技术,开发工具和API等组成
好了,废话说了那么多,来点于主题相关的东西吧.JVM在整个jdk中处于最底层,负责于操作系统的交互,用来屏蔽操作系统环境,提供一个完整的Java运行环境,因此也就虚拟计算机. 操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境.
1.创建JVM装载环境和配置
2.装载JVM.dll
3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例
4.调用JNIEnv实例装载并处理class类。
一.JVM装入环境,JVM提供的方式是操作系统的动态连接文件.既然是文件那就一个装入路径的问题,Java是怎么找这个路径的呢?当你在调用Java test的时候,操作系统会在path下在你的Java.exe程序,Java.exe就通过下面一个过程来确定JVM的路径和相关的参数配置了.下面基于Windows的实现的分析.
首先查找jre路径,Java是通过GetApplicationHome api来获得当前的Java.exe绝对路径,c:\j2sdk1.4.2_09\bin\Java.exe,那么它会截取到绝对路径c:\j2sdk1.4.2_09\,判断c:\j2sdk1.4.2_09\bin\Java.dll文件是否存在,如果存在就把c:\j2sdk1.4.2_09\作为jre路径,如果不存在则判断c:\j2sdk1.4.2_09\jre\bin\Java.dll是否存在,如果存在这c:\j2sdk1.4.2_09\jre作为jre路径.如果不存在调用GetPublicJREHome查HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment\“当前JRE版本号”\JavaHome的路径为jre路径。
然后装载JVM.cfg文件JRE路径+\lib+\ARCH(CPU构架)+\JVM.cfgARCH(CPU构架)的判断是通过Java_md.c中GetArch函数判断的,该函数中windows平台只有两种情况:WIN64的‘ia64’,其他情况都为‘i386’。以我的为例:C:\j2sdk1.4.2_09\jre\lib\i386\JVM.cfg.主要的内容如下:
-client KNOWN -server KNOWN -hotspot ALIASED_TO -client -classic WARN -native ERROR -green ERROR 在我们的jdk目录中jre\bin\server和jre\bin\client都有JVM.dll文件存在,而Java正是通过JVM.cfg配置文件来管理这些不同版本的JVM.dll的.通过文件我们可以定义目前jdk中支持那些JVM,前面部分(client)是JVM名称,后面是参数,KNOWN表示JVM存在,ALIASED_TO表示给别的JVM取一个别名,WARN表示不存在时找一个JVM替代,ERROR表示不存在抛出异常.在运行Java XXX是,Java.exe会通过CheckJVMType来检查当前的JVM类型,Java可以通过两种参数的方式来指定具体的JVM类型,一种按照JVM.cfg文件中的JVM名称指定,第二种方法是直接指定,它们执行的方法分别是“Java -J”、“Java -XXaltJVM=”或“Java -J-XXaltJVM=”。如果是第一种参数传递方式,CheckJVMType函数会取参数‘-J’后面的JVM名称,然后从已知的JVM配置参数中查找如果找到同名的则去掉该JVM名称前的‘-’直接返回该值;而第二种方法,会直接返回“-XXaltJVM=”或“-J-XXaltJVM=”后面的JVM类型名称;如果在运行Java时未指定上面两种方法中的任一一种参数,CheckJVMType会取配置文件中第一个配置中的JVM名称,去掉名称前面的‘-’返回该值。CheckJVMType函数的这个返回值会在下面的函数中汇同jre路径组合成JVM.dll的绝对路径。如果没有指定这会使用JVM.cfg中第一个定义的JVM.可以通过set _Java_LAUNCHER_DEBUG=1在控制台上测试.
最后获得JVM.dll的路径,JRE路径+\bin+\JVM类型字符串+\JVM.dll就是JVM的文件路径了,但是如果在调用Java程序时用-XXaltJVM=参数指定的路径path,就直接用path+\JVM.dll文件做为JVM.dll的文件路径.
二:装载JVM.dll
通过第一步已经找到了JVM的路径,Java通过LoadJavaVM来装入JVM.dll文件.装入工作很简单就是调用Windows API函数:
LoadLibrary装载JVM.dll动态连接库.然后把JVM.dll中的导出函数JNI_CreateJavaVM和JNI_GetDefaultJavaVMInitArgs挂接到InvocationFunctions变量的CreateJavaVM和GetDefaultJavaVMInitArgs函数指针变量上。JVM.dll的装载工作宣告完成。
三:初始化JVM,获得本地调用接口,这样就可以在Java中调用JVM的函数了.调用InvocationFunctions->CreateJavaVM也就是JVM中JNI_CreateJavaVM方法获得JNIEnv结构的实例.
四:运行Java程序.
Java程序有两种方式一种是jar包,一种是class. 运行jar,Java -jar XXX.jar运行的时候,Java.exe调用GetMainClassName函数,该函数先获得JNIEnv实例然后调用Java类Java.util.jar.JarFileJNIEnv中方法getManifest()并从返回的Manifest对象中取getAttributes("Main-Class")的值即jar包中文件:META-INF/MANIFEST.MF指定的Main-Class的主类名作为运行的主类。之后main函数会调用Java.c中LoadClass方法装载该主类(使用JNIEnv实例的FindClass)。main函数直接调用Java.c中LoadClass方法装载该类。如果是执行class方法。main函数直接调用Java.c中LoadClass方法装载该类。
然后main函数调用JNIEnv实例的GetStaticMethodID方法查找装载的class主类中
“public static void main(String[] args)”方法,并判断该方法是否为public方法,然后调用JNIEnv实例的
CallStaticVoidMethod方法调用该Java类的main方法。
JVM工作原理和特点介绍到这里。
首先来说一下JVM工作原理中的jdk这个东西,不管你是初学者还是高手,是j2ee程序员还是j2se程序员,jdk总是在帮我们做一些事情.我们在了解Java之前首先大师们会给我们提供说jdk这个东西.它在Java整个体系中充当着什么角色呢?我很惊叹sun大师们设计天才,能把一个如此完整的体系结构化的如此完美.jdk在这个体系中充当一个生产加工中心,产生所有的数据输出,是所有指令和战略的执行中心.本身它提供了Java的完整方案,可以开发目前Java能支持的所有应用和系统程序.这里说一个问题,大家会问,那为什么还有j2me,j2ee这些东西,这两个东西目的很简单,分别用来简化各自领域内的开发和构建过程.jdk除了JVM之外,还有一些核心的API,集成API,用户工具,开发技术,开发工具和API等组成
好了,废话说了那么多,来点于主题相关的东西吧.JVM在整个jdk中处于最底层,负责于操作系统的交互,用来屏蔽操作系统环境,提供一个完整的Java运行环境,因此也就虚拟计算机. 操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境.
1.创建JVM装载环境和配置
2.装载JVM.dll
3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例
4.调用JNIEnv实例装载并处理class类。
一.JVM装入环境,JVM提供的方式是操作系统的动态连接文件.既然是文件那就一个装入路径的问题,Java是怎么找这个路径的呢?当你在调用Java test的时候,操作系统会在path下在你的Java.exe程序,Java.exe就通过下面一个过程来确定JVM的路径和相关的参数配置了.下面基于Windows的实现的分析.
首先查找jre路径,Java是通过GetApplicationHome api来获得当前的Java.exe绝对路径,c:\j2sdk1.4.2_09\bin\Java.exe,那么它会截取到绝对路径c:\j2sdk1.4.2_09\,判断c:\j2sdk1.4.2_09\bin\Java.dll文件是否存在,如果存在就把c:\j2sdk1.4.2_09\作为jre路径,如果不存在则判断c:\j2sdk1.4.2_09\jre\bin\Java.dll是否存在,如果存在这c:\j2sdk1.4.2_09\jre作为jre路径.如果不存在调用GetPublicJREHome查HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment\“当前JRE版本号”\JavaHome的路径为jre路径。
然后装载JVM.cfg文件JRE路径+\lib+\ARCH(CPU构架)+\JVM.cfgARCH(CPU构架)的判断是通过Java_md.c中GetArch函数判断的,该函数中windows平台只有两种情况:WIN64的‘ia64’,其他情况都为‘i386’。以我的为例:C:\j2sdk1.4.2_09\jre\lib\i386\JVM.cfg.主要的内容如下:
-client KNOWN -server KNOWN -hotspot ALIASED_TO -client -classic WARN -native ERROR -green ERROR 在我们的jdk目录中jre\bin\server和jre\bin\client都有JVM.dll文件存在,而Java正是通过JVM.cfg配置文件来管理这些不同版本的JVM.dll的.通过文件我们可以定义目前jdk中支持那些JVM,前面部分(client)是JVM名称,后面是参数,KNOWN表示JVM存在,ALIASED_TO表示给别的JVM取一个别名,WARN表示不存在时找一个JVM替代,ERROR表示不存在抛出异常.在运行Java XXX是,Java.exe会通过CheckJVMType来检查当前的JVM类型,Java可以通过两种参数的方式来指定具体的JVM类型,一种按照JVM.cfg文件中的JVM名称指定,第二种方法是直接指定,它们执行的方法分别是“Java -J”、“Java -XXaltJVM=”或“Java -J-XXaltJVM=”。如果是第一种参数传递方式,CheckJVMType函数会取参数‘-J’后面的JVM名称,然后从已知的JVM配置参数中查找如果找到同名的则去掉该JVM名称前的‘-’直接返回该值;而第二种方法,会直接返回“-XXaltJVM=”或“-J-XXaltJVM=”后面的JVM类型名称;如果在运行Java时未指定上面两种方法中的任一一种参数,CheckJVMType会取配置文件中第一个配置中的JVM名称,去掉名称前面的‘-’返回该值。CheckJVMType函数的这个返回值会在下面的函数中汇同jre路径组合成JVM.dll的绝对路径。如果没有指定这会使用JVM.cfg中第一个定义的JVM.可以通过set _Java_LAUNCHER_DEBUG=1在控制台上测试.
最后获得JVM.dll的路径,JRE路径+\bin+\JVM类型字符串+\JVM.dll就是JVM的文件路径了,但是如果在调用Java程序时用-XXaltJVM=参数指定的路径path,就直接用path+\JVM.dll文件做为JVM.dll的文件路径.
二:装载JVM.dll
通过第一步已经找到了JVM的路径,Java通过LoadJavaVM来装入JVM.dll文件.装入工作很简单就是调用Windows API函数:
LoadLibrary装载JVM.dll动态连接库.然后把JVM.dll中的导出函数JNI_CreateJavaVM和JNI_GetDefaultJavaVMInitArgs挂接到InvocationFunctions变量的CreateJavaVM和GetDefaultJavaVMInitArgs函数指针变量上。JVM.dll的装载工作宣告完成。
三:初始化JVM,获得本地调用接口,这样就可以在Java中调用JVM的函数了.调用InvocationFunctions->CreateJavaVM也就是JVM中JNI_CreateJavaVM方法获得JNIEnv结构的实例.
四:运行Java程序.
Java程序有两种方式一种是jar包,一种是class. 运行jar,Java -jar XXX.jar运行的时候,Java.exe调用GetMainClassName函数,该函数先获得JNIEnv实例然后调用Java类Java.util.jar.JarFileJNIEnv中方法getManifest()并从返回的Manifest对象中取getAttributes("Main-Class")的值即jar包中文件:META-INF/MANIFEST.MF指定的Main-Class的主类名作为运行的主类。之后main函数会调用Java.c中LoadClass方法装载该主类(使用JNIEnv实例的FindClass)。main函数直接调用Java.c中LoadClass方法装载该类。如果是执行class方法。main函数直接调用Java.c中LoadClass方法装载该类。
然后main函数调用JNIEnv实例的GetStaticMethodID方法查找装载的class主类中
“public static void main(String[] args)”方法,并判断该方法是否为public方法,然后调用JNIEnv实例的
CallStaticVoidMethod方法调用该Java类的main方法。
JVM工作原理和特点介绍到这里。
发表评论
-
Java Map遍历速度最优解
2011-12-09 13:01 1629HashMap的遍历有两种常用的方法,那就是使用key ... -
LinkedHashSet源码带来的思考
2011-09-01 21:45 11031、LinkedHashSet具有可预知迭代顺序的Set接口的 ... -
移动互联网时代已经来临,天下将是谁的?谁能笑到最后?
2011-08-27 17:20 95280年代末90年代初,是通 ... -
JAVA连接各种数据库
2011-07-27 21:05 8001、Oracle8/8i/9i数据库(thin模式) ... -
java(多线程)实现高性能数据同步
2011-06-23 22:36 2471需要将生产环境上Infoxmix里的数据原封不动的Co ... -
分布式系统数据同步解决方案
2011-06-23 21:52 1758Web Service 现如今已经成为 SOA ... -
常见的海量数据处理方法
2011-06-22 20:40 24671. 给定a、b两个文件, ... -
中文繁体和简体相互转换tranditional.txt文件
2011-06-13 10:35 2625啊阿埃挨哎唉哀皚癌藹 ... -
中文繁体和简体相互转换simplified.txt文件
2011-06-13 10:34 2984啊阿埃挨哎唉哀皑癌蔼 ... -
词性标注程序探讨
2011-03-07 20:39 1109程序设计主要分为五个部分,即词频统计和词性符号 ... -
初探Java 7异常处理功能增强
2011-03-07 20:35 830Java异常处理语法是指是Java开发者最为头疼的事情,也是 ... -
Java中堆内存与栈内存分配浅析
2011-03-07 20:30 812原文出处:http://soft.chin ... -
Unable to read TLD “META-INF/c.tld” from JAR file
2010-11-20 23:16 1528Unable to read TLD “META-INF/ ... -
Java NIO与IO的区别和比较
2010-10-29 17:37 1000Java NIO与IO的区别和比较 导读 J2SE1. ... -
java nio 开发实例
2010-10-29 17:36 1445java nio 开发实例 ... -
全面总结java操作符
2010-10-21 11:13 1345java操作符共分为 ... -
详细解说关于Java.io的使用
2010-09-30 08:50 948Java的核心库java.io提供了全面的IO接口,包 ... -
Java线程学习笔记之Executor
2010-09-14 15:37 945Java线程学习笔记之Executor 并发编程的一种 ... -
java线程学习之Thread.sleep() 和 Thread.yield() 区别
2010-09-14 15:14 3552Thread.sleep() 和 Thread.yield() ... -
迅雷最新(2010.8.19)面试试题
2010-08-20 08:30 1077昨天去了深圳迅雷 ...
相关推荐
Java虚拟机(JVM)是Java程序运行的核心组件,它...了解JVM的工作原理和内存模型对于优化Java程序的性能至关重要。通过调整JVM参数,开发者可以改善程序的启动时间、内存使用效率和响应速度,从而提升整体应用的性能。
### JVM原理、内存模型、性能调优 #### 一、JVM原理概述 Java虚拟机(JVM)是一种用于执行Java字节码的虚拟机。它为Java程序提供了一个独立于平台的运行环境,并且能够自动处理内存管理和垃圾回收等工作。JVM的核心...
Java虚拟机工作原理详解 Java虚拟机工作原理详解是 Java 程序执行的核心组件之一。了解 Java 虚拟机的工作原理对 Java 开发人员来说非常重要。本文将详细介绍 Java 虚拟机工作原理的详细过程和类加载器的工作机理。...
### JVM详解资料核心知识点 #### Java相关 - **Java定义**:Java是一种广泛使用的面向对象的编程语言,设计初衷是为了实现“一次编写,到处运行”的跨平台能力,这得益于其运行环境——Java虚拟机(JVM)的存在。 ...
### Java虚拟机(JVM)详解 #### 一、引言 Java虚拟机(JVM)作为Java编程语言的核心组件之一,其重要性不言而喻...掌握JVM的工作原理有助于开发者编写更高效、更稳定的Java应用程序,并能有效地解决常见的内存溢出问题。
### JVM详解及调优 #### 一、JVM概述与工作原理 **1.1 Java定义** ...以上内容涵盖了JVM的基础概念、内存管理、垃圾收集以及调优等方面的知识点,有助于深入理解和掌握JVM的工作原理及其优化技巧。
不同的垃圾回收器适用于不同的应用场景,了解它们的原理和特点,根据应用的需求选择合适的垃圾回收器,可以显著改善应用程序的性能。例如,如果应用对延迟敏感,可以选择CMS或G1 GC这类低停顿时间的垃圾回收器。 ...
Monkey老师的JVM调优课程,无疑为我们提供了一个宝贵的平台,来深入探究JVM的工作原理及其优化技巧。下面,我们就一起来深入学习Monkey老师关于JVM调优的核心知识点。 首先,我们要明白JVM的重要性。它是Java程序...
首先,我们要了解JVM的工作原理。JVM是一个运行Java字节码的虚拟计算机,它负责类加载、内存管理、垃圾回收以及执行字节码。其中,内存管理是调优的重点,主要包括堆内存(Heap)、方法区(Method Area)、栈内存...
JVM 规范定义了 JVM 的基本结构和行为,包括其内存布局和执行模型。JVM 的核心组成部分包括: - **Classloader 子系统**:负责查找、解析并加载类到 JVM 中。 - **Execution Engine 子系统**:解释或编译并执行字节...
### JVM(Java虚拟机)详解:Java语言中所用的常用术语解释 #### 一、Java虚拟机(JVM)概述 ...通过理解JVM的工作原理和Java语言的特点,开发者可以更好地利用Java的强大功能,构建出高效、稳定的软件系统。
不同垃圾收集器有着不同的特点和适用场景,选择合适的垃圾收集器可以显著提高应用性能。例如,在追求低延迟的应用场景中,可以选择CMS或G1收集器。 #### 3. 监控与分析工具的使用 使用JVisualVM、JConsole等工具...
对于Java开发者,尤其是面试阶段,深入理解JVM的工作原理和优化技巧是必不可少的。以下是一些关于JVM的常见面试题和相关知识点: 1. **JVM的组成** - **类装载器(ClassLoader)**:负责加载类文件到JVM内存中,分为...
Java虚拟机(JVM)是Java程序运行的基础,它...通过阅读《JVM详解.pdf》、《java内存模型.pdf》、《慢慢琢磨jvm.pdf》和《JVM调优总结.pdf》,我们可以更全面地掌握JVM的工作原理,提升我们的Java编程和系统调优能力。
DVM的出现主要是为了适应移动设备的特点和需求,特别是考虑到内存限制以及对性能的需求。 #### 三、JVM简介 **JVM**是Java Virtual Machine的简称,由Oracle公司(原SUN公司)开发维护,是运行Java应用程序的基础...
### JVM调优详解 #### 一、JVM调优概述 在现代软件开发中,Java虚拟机(JVM)作为Java应用程序的运行环境,...通过本篇文章的学习,希望读者能够掌握JVM调优的基本原理和技术手段,为日常开发工作提供有力的支持。
### JAVA文件编译执行与虚拟机(JVM)介绍 #### 关键知识点概述: ...通过对JAVA文件编译、字节码执行及JVM工作原理的深入了解,JAVA程序员能够更好地掌握JAVA编程的核心技术,并有效地解决实际开发中的问题。
GC的工作原理如下: 1. **收集对象**: GC会寻找没有被任何引用指向的对象进行回收。 2. **收集过程**: 找到所有被引用的对象,并回收未被引用的对象占用的空间。 3. **收集方法**: 典型的收集算法包括标记-清除...
### JVM_GC调优详解 #### 一、JVM体系结构概览 Java虚拟机(JVM)作为Java程序的运行环境,其内部结构复杂且高效。为了更好地理解JVM_GC调优,...同时,掌握JVM内存模型和垃圾回收器的工作原理也是进行有效调优的基础。