- 浏览: 1051764 次
- 性别:
- 来自: 郑州
文章分类
- 全部博客 (605)
- 数据挖掘 (22)
- spring (40)
- 工具使用 (39)
- java (137)
- JavaScript (40)
- webwork (12)
- web (120)
- 资源 (7)
- SSH (5)
- oracle (20)
- J2ME (1)
- 环境配置 (37)
- 项目管理 (29)
- mysql (14)
- struts (4)
- 项目总结 (27)
- ibatis学习 (33)
- 学习计划 (2)
- 缓存 (7)
- 重构 (3)
- Android (1)
- jquery (12)
- UML (3)
- 用户体验 (4)
- 习惯 (7)
- sakai (1)
- urlrewrite (4)
- rss (5)
- C plus plus (5)
- 算法 (5)
- 海量数据处理 (7)
- office(word、excel) (1)
- 面试题 (3)
- solr (8)
- 大数据 (2)
最新评论
-
hujin19861102:
截图看不见,最后一个webwrok的配置看不见
Ext+Webwork+Json 实现分页表格查询效果 -
蜗牛笔:
弱弱的问一句,要是分出来的词在词典中没有,那么两部分的pos- ...
ICTCLAS 中科院分词系统 -
weipeng1986:
授人予鱼不如授人予鱼,我想问你的是你是怎么总结的。比如第四种情 ...
JAVA中字符串连接效率的测试 -
xiaoqiang2008:
执行两次的原因是什么,好像楼主没弄清楚啊!是不是在web.xm ...
关于Spring中用quartz定时器在定时到达时同时执行两次的问题 -
Kent_Mu:
...
ibatis-dynamic的用法
原文: http://gogole.iteye.com/blog/673311
作为一个Java程序员,每天都与JVM在打交道,那么JVM到底是什么?它的内部原理有哪些神秘之处? 今天我利用这篇文章来解释解释, 也当作自己的《深入Java虚拟机》的读书笔记。 希望各位看官多多指教.
下面的内容,我会以一问一答的形式来整理,总结,带着问题去学习,我认为是效率最高的学习方法。
一、为什么叫虚拟机?
之所以叫虚拟机,是因为它仅仅是一个规范定义的抽象计算机.所以,要运行某个Java程序,首先需要一个符合该规范的具体实现,所以也就有了现在的Sun 虚拟机和IBM 虚拟机等不同虚拟机的出现 .
所以,当我们说道Java虚拟机的时候,就意味着下面3个不同的事物:
- 抽象规范
- 一个具体实现
- 一个运行中的虚拟机实例
二、JVM的生命周期是怎样的?
一个运行时的java虚拟机的天职是负责运行一个Java程序。 也就是说, 当启动一个Java程序时,一个虚拟机的实例就诞生了,当该程序关闭时,虚拟机的实例也就退出了。
如果在同时运三个Java程序,将得到3个虚拟机的实例. Java虚拟机通过调用某个初始类的main()方法来运行一个Java程序,而main()方法有签名限制,也就是我们常见到的 public、static、void并且接受一个字符串数组为参数.
Java程序初始化类的main()方法,将作为程序的初始线程起点,任何其他的线程都是由这个初始线程启动的。
PS:关于JVM中线程的那些事(这里简单罗列一下,后续会有文章专门来介绍JVM线程机制.)
JVM内部分两种线程: 守护线程与非守护线程.
守护线程通常为JVM自己创建,当然,你也可以自己将某个线程设置为守护线程。 通常这样的线程应用于
JVM内部作业,比如说: 垃圾回收的线程。
而像初始线程---开始main()方法的那个线程既叫非守护线程。 只要有任何非守护线程还在运行,那么这个
Java程序还将继续运行着,当所有非守护线程都运行结束了,虚拟机实例将自动退出。 当然,你也可以在程序中
显示的调用Runtime或者System类的exit()方法来退出.
三、JVM的体系结构是怎么样的?
在JAVA虚拟机的规范中,一个JVM的实例应该按照以下:
- 子系统
- 内存区
- 数据结构
- 指令
这么几个术语来描述.(这里仅仅列出概念,后续会详细解释)
这里利用一个图来说明:(来源于网络,版权信息不详,如有侵权,请告知)
如上图中所示: 每一个JVM实例,都会有的以下2个东西:
- 类装载器子系统 ----- 负责根据给定的全限名来装入类型(类或者接口)
- 执行引擎 --------------负责执行哪些包含在被装载类的方法中的指令
类装载系统的作用?
有过一定经验的Java程序员一般都知道这个系统的作用,这里我还是稍微总结一下,以让经验稍微欠缺的朋友了解一下,它在JVM中的主要作用是 负责查找并加载类型。
JVM中分两种类装载器:
- 启动类装载器
- 自定义类装载器
前者是JVM的一部分,而后者则是Java程序的一部分,这意味着,启动类加载器一般我们无法修改与指定,而自定义类装载器我们可以通过程序来指定。
启动类加载器:
每个JVM实现都必须有一个启动类加载器,它知道如何加载受信任的类,比如Java api的class文件,至于如何去寻找这些class,由不同的JVM实现者而不同,就像是不同的JDBC驱动一样,根据厂商的不同而不同的。
自定义类加载器:
自定义类加载器需要继承Java核心的java.lang.ClassLoader类, 跟所有的对象一样,自定义类加载器与Class类的实例都保存在JVM的堆中。
而对于类装载器的装载顺序,如下:
- 装载,查找并装载类型的二进制数据
- 连接,执行验证(确保导入类型正确),准备(为类分配内存初始化为默认值)以及解析(把类型中的符号引用转成直接引用)
- 初始化,把类变量初始化为正确的初始值
那上图中
运行时数据区是做什么用的??
当JVM运行一个程序,它需要存储很多东西到内存中,比如 字节码、从装载的class文件中得到其他信息、程序创建的对象、传递给方法的参数、返回值、局部变量以及运行的中间结果等。 这些东西都被JVM组织到 运行时数据区 中,以便于管理。
方法区与堆的作用?
另外需要注意的是: 每个JVM实例都有一个 方法区与一个堆, 他们被JVM实例的所有线程共享。 比如说: 当一个JVM装载一个class文件的时候,它会从class文件包含的二进制数据中解析出类型信息,并将它们放到方法区中,当程序运行时,虚拟机会把所有程序在运行时创建的对象都放到堆中。
方法区的具体细节是怎么样的?
它存储着被装载类型的信息。它被所有的线程共享着,因此它们对方法区的访问必须被设计成线程安全的。 比如:两个线程加载一个类,而这个类还没有被装入JVM中,此时应该有一个线程去装载它,另外一个线程在等待。
它会保存着装载类的如下信息:
- 类型的基本信息(类名,接口还是类、访问修饰符、实现的接口、父类名)
- 该类型的常量池
- 字段信息(字段名、字段类型、修饰符)
- 方法信息(方法名、方法返回类型、参数数量与类型、修饰符)
- 静态变量
- 指向ClassLoader的引用(JVM需要知道,这个类型是谁加载的)
- 指向Class类的引用(以便获取类型的Class对象)
堆的具体细节是怎么样的?
它保存这运行时创建的对象或者数组 ,而一个JVM只有一个堆空间看,所有线程都共享着这个空间。
在JVM中,有一条在堆中分配新对象的指令,但是却没有释放内存的指令(其通过垃圾回收来实现).而垃圾回收器的具体实现也是由JVM的具体实现者来决定的。
JVM中的数据类型有哪些?
JVM中,数据类型分两种:
- 基本数据类型
- 引用数据类型
Java语言中,所有基本数据类型也都是JVM的基本数据类型,但是boolean有点特别,为什么? 因为当编译器将Java类编译成字节码后,它会用int或者byte表示Boolean 。
另外,JVM中 ,false是由整数0来表示的,true为所有非零的整数表示。
JVM中的数值类型分为两种 一种是 整数类型(byte,short,int,long,char)
另外一种是:浮点数类型(float,double)
在JVM内部,还有一个特殊的数据类型,Java程序员不允许使用,它被用来实现finally子句,
它就是 returnAddress类型
JVM中的引用数据类型有三种: 类类型、接口类型和数组类型。
它们的值都是对动态创建的对象的引用。 值得注意的是 在JVM中,数组是一个真正的对象。
Java栈的作用?
每一个新创建的线程,它都将获取它自己的PC寄存器(也叫程序计数器)和一个Java栈。 如果线程在执行一个Java方法时候,它的PC寄存器总是指向下一条需要执行的指令, 而它的Java栈则保存线程中Java方法的调用状态,比如: 它的局部变量、传入方法的参数、返回值、以及运算的中间结果等。
Java栈的结构:
我们知道,Java栈用来保存线程调用一个非本地方法的java方法的状态, 那如果一个线程调用多个Java方法呢? 那每个Java方法的状态如何保存。
在Java栈的内部,它是由许多的 栈帧 或者叫 帧组成的。 一个帧包含一个Java方法调用的状态,当线程调用一个Java方法时候,JVM压入一个新的Java栈帧进入Java栈; 当方法返回时,这个栈帧被从Java栈中弹出并抛弃。
发表评论
-
fork/join框架
2017-03-09 11:03 498http://blog.csdn.net/ye1992/art ... -
protobuffer
2017-03-09 10:54 695http://blog.csdn.net/antgan/art ... -
整理上传代码容易忽略的注意事项
2013-08-31 11:28 1161每个公司都有自己的代码代码上传流程:如果打包发布的话,是不存 ... -
mysql版本升级引发的问题
2013-05-16 15:25 1655问题描述: 1. ibatis 中 mysql语 ... -
网站的记住密码功能设计
2013-02-27 19:09 1309http://greenyouyou.blog.163 ... -
大型网站架构演变之路
2013-02-27 19:08 1147http://www.cnblogs.com/ivanjack ... -
使用Filter统计Java(J2EE)的web程序http请求响应时间
2013-02-27 19:07 1389http://www.cnblogs.com/ivan ... -
java bean与xml相互转换
2013-02-06 10:27 2048最近在做的项目,在各个平台之间需要大量传输数据,且结构比较 ... -
java 反射
2013-01-14 18:21 830http://www.cnblogs.com/rollenh ... -
字符串替换
2012-12-17 11:17 1160高效的字符串模式替换实现效果如下 String str ... -
httpURLConnection获取网络数据:XML格式返回与Json格式返回
2012-12-15 16:57 149251.服务器端代码样例: public class ... -
利用Freemarker实现表到功能界面的一键生成
2012-11-22 18:03 1020利用Freemarker实现表到功能界面的一键生成 h ... -
ibatis in ##的问题
2012-11-02 13:25 854http://www.hake.cc/a/biancheng/ ... -
ibatis缓存强制刷新与命中率
2012-10-19 19:06 1393缓存强制刷新: // spring注入 private Sq ... -
eclipse 的一些设置
2012-08-16 22:06 17611. 控制台信息太多,程序跑完后只能保留最后的一部分之前的 ... -
jdk1.5 System.arraycopy与jdk1.6 中Arrays.copyOf()&Arrays.copyOfRange()
2012-08-16 21:56 3288在JDK1.5的类System类中有方法 ... -
Eclipse报Java heap space错误的解决方案
2012-08-16 16:43 12073当运行大数量的数据时: (1) 如果是java 应用程 ... -
求两个字符串的最大公共字符串
2012-08-10 20:41 1065http://blog.csdn.net/wangcj625/ ... -
ffmpeg 截取视频 播放中的图片
2012-06-19 09:14 1315http://www.cnblogs.com/live365w ... -
memcached 项目中的使用
2012-06-13 09:29 1067http://ljh2008.iteye.com/blog/6 ...
相关推荐
### Java虚拟机的详细原理 #### 一、什么是Java虚拟机 Java虚拟机(Java Virtual Machine,简称JVM)是一种可以执行Java字节码(Bytecode)的虚拟计算机。它为Java程序提供了一个运行环境,使得Java程序可以在任何...
Java虚拟机工作原理详解 Java虚拟机工作原理详解是 Java 程序执行的核心组件之一。了解 Java 虚拟机的工作原理对 Java 开发人员来说非常重要。本文将详细介绍 Java 虚拟机工作原理的详细过程和类加载器的工作机理。...
类加载器 (类加载器使用双亲委派模型,为的是避免类的重复加载) 1、Java虚拟机与进程的生命周期 2、类的加载、连接与初始化 3、Java程序对类的使用可以分为两种:
指令集部分为Java虚拟机中的指令分类,并简述了它们的用途,例如加载和存储指令、算术指令、类型转换指令、对象创建与操纵指令、操作数栈管理指令、控制转移指令、方法调用与返回指令以及异常处理指令等。...
在Java中,这个过程是由Java虚拟机(JVM)内部的垃圾回收器自动完成的。 - Java中的垃圾回收机制与C++中的手动管理内存相比具有明显的优势。在C++中,开发者需要显式地分配和释放内存,这容易导致内存泄漏等问题。...
总的来说,Dalvik虚拟机从启动到执行Java代码,涉及了C++层的JNI接口、类加载、字节码执行、垃圾回收等多个关键环节。理解这些过程有助于深入洞察Android系统的运行机制。随着Android系统的演进,Dalvik虚拟机已被...
20. **java.lang.management**:管理Java虚拟机及其操作系统的接口。 21. **java.lang.ref**:提供引用对象,允许一定程度上与垃圾收集器交互。 22. **java.lang.reflect**:反射机制的类和接口,用于获取类和对象...
Java虚拟机(JVM)是Java程序的核心组成部分,它负责解析和执行字节码,同时管理内存区域。本文主要探讨虚拟机的历史、运行时数据区域以及内存区域的配置。 首先,虚拟机的历史简述,虽然这里并不需要深入,但我们...
1. **Java Application**:Java Application是一种完全独立的程序,一旦编译成功,只需具备相应的Java虚拟机(JVM),即可在任何平台上独立运行,无需额外依赖。这意味着Java Application可以作为一个独立的桌面应用...
- **Java程序运行**: Java程序需要在Java虚拟机(JVM)上运行。这意味着只要系统安装了合适的JVM,Java程序就可以在这个平台上运行。 #### 开发流程简述 1. **编写源文件**:使用`.java`扩展名保存源代码。 2. **...
- **解析**:Java源代码文件编译后会生成`.class`文件,即字节码文件,这些文件可以在任何安装了JVM(Java虚拟机)的平台上运行,体现了Java的“一次编写,到处运行”的特性。 2. **Java程序的执行过程中用到一套...
- **平台无关性**:Java程序可以在任何安装了Java虚拟机(JVM)的平台上运行,无需重新编译。 - **面向对象**:Java完全支持面向对象编程的概念,如封装、继承、多态等。 - **安全性**:Java内置了多层次的安全...
配置为移动设备定义了一个最小的Java运行环境,它包括Java虚拟机和应用程序接口API。简表是建立在配置之上的规范,它是支持特定用户设备的一系列API集 合。 4. PIM的信息类型 PIM可选包的核心是管理PIM数据表。PIM...
9. **JVM内部机制**:简述Java虚拟机的工作原理,包括类加载、内存管理、垃圾回收机制,有助于优化代码性能。 10. **泛型**:讨论Java泛型的使用,如何编写类型安全的代码,并理解其类型擦除的原理。 11. **枚举与...
Java的设计目标是具有跨平台性、安全性、健壮性和可移植性,它通过Java虚拟机(JVM)在不同操作系统上运行。Java耿祥义主编的课件深入浅出地讲解了Java的基础知识,包括: 1. **环境搭建**:介绍如何下载和安装Java...
- **平台无关性**:Java代码可以在任何安装了Java虚拟机(JVM)的平台上运行,实现了“一次编写,到处运行”的目标。 - **安全性高**:Java内置的安全机制可以有效防止恶意代码的入侵,保护用户数据安全。 - **...
Java垃圾回收机制是Java虚拟机(JVM)中的一种机制,用于释放垃圾占用的空间,以便提高系统性能和避免内存泄露。在Java中,垃圾回收机制主要解决两个问题:如何确定某个对象是“垃圾”?采用什么样的策略来进行回收...
2. 简述 Java 语言的特点 Java 语言的特点有简单性、可靠性和安全性、面向对象性、平台无关性和解释执行性等。 3. Java 源文件的扩展名是什么? Java 源文件的扩展名是 `.java`。 4. Java 编译器将 Java 程序转换为...