Java虚拟机学习记录(一)-Java技术体系

##一、java技术体系概览 JDK(Java Development Kit)

  • Java程序设计语言
  • Java虚拟机
  • Java API类库

JDK是用于支持Java程序开发的最小环境。 JRE(Java Runtime Environment)

  • Java SE API子集
  • Java虚拟机

JRE是支持Java程序运行的标准环境

Java语言Java Language
工具及工具APIJavaJavacJavaDocJarJavapMonitorJPDA
JConsoleJava VisualVMJavaDBsecurityInternationalizationJMCRMI
IDLDeployJFRTroubleshootScriptingJVMTIWeb Services
程序部署和发布Java Web StartApplet/Java Plug-in
用户界面工具集JavaFX
SwingJava 2DAWTAccessbility
Drag and DropInput MethodsImage I/OPrint ServiceSound
集成库IDLJDBCJNDIRMIRMI-IIOPScripting
其他基础库BeansInt'l SupportInput/OutputJMX
JNINetWorkingOverride Mechanism
SecuritySerializationExtension MechanismXML JAXP Mechanism
语言和工具基础库MathCollectionsConcurrency UtilitiesJAR
LoggingManagementPreferences APIRef Objects
ReflectionRegular ExpressionsVersioningZipInstrumentation
Java虚拟机Java HotSpot Client and Server VM

这张表网上有很多版本,我以《深入理解java虚拟机》为参考,添加了JMC和JFR。可能在这划分中会有重叠部分,仅做参考。 其中

  • JDK: Java语言,工具及工具API,程序部署发布,用户界面工具集,集成库,其他基础库,语言和工具基础库,Java虚拟机
  • JRE: 程序部署发布,用户界面工具集,集成库,其他基础库,语言和工具基础库,Java虚拟机
  • Java SE API: 用户界面工具集,集成库,其他基础库,语言和工具基础库,Java虚拟机

##二. Java工具和工具API(对应了jdk中bin目录下的工具) ###自己目前使用过的有: - java : 用来运行jar。对应bin目录下的java。 - javac: java的编译工具。对应bin目录下的javac。 - JConsole : 配置好环境的情况下,可以在控制台输入jconsole打开,jconsole可以配合JMX(其他基础库),达到对运行中的java程序进行监控甚至动态修改变量值的作用。具体的使用可以参考这一篇JMX整理,对应bin目录下的jconsole。 - security : - keytool: 这个工具可以生成key和certificate,具体使用可以参考这一篇Java Security:keytool工具使用说明,securitykeytool 。对应bin目录下的keytool工具。 - jarsigner: jar密匙签名工具 - kinit: 主要用于获取或缓存Kerberos协议的票据授权票据。 - klist: 允许用户查看本地凭据缓存和密钥表中的条目(用于Kerberos协议)。 - ktab: Kerberos密钥表管理工具,允许用户管理存储于本地密钥表中的主要名称和服务密钥。 - policytool: 策略工具,用于管理用户策略文件(.java.policy)。 ###尚未使用过的有 - javaDoc : 使用 javdoc 编译 .java 源文件时,它会读出 .java 源文件中的文档注释,并按照一定的规则与 Java 源程序一起进行编译,生成文档。对应bin目录下的javadoc。 - jar : JAR(Java Archive,Java 归档文件),是java 开发工具中的一个工具,位于JDK的安装目录的bin目录下。它是一个打包工具,有点类似winrar压缩工具,虽然一般是用来打包.class文件,但是实际上其它文件也是可以打包的。对应bin目录下的jar。 - Javap : java反编译工具。对应bin目录下的javap。 - JPDA : Java Platform Debugger Architecture(JPDA:Java平台调试架构),Java虚拟机后端和调试平台前端组成 - 1.Java虚拟机提供了Java调试的功能 - 2.调试平台通过调试交互协议向Java虚拟机请求服务以对在虚拟机中运行的程序进行调试 - jdb: Java调试工具(Java Debugger),主要用于对Java应用进行断点调试。 - Java VisualVM : java性能分析工具,对应bin目录下的jvisualvm。 - JavaDB : java的数据库。 - Int’l:可能指的是internationalization,即国际化。这里很不确定,在bin目录下有一个native2ascii,本地编码到ASCII编码的转换器(Native-to-ASCII Converter),用于“任意受支持的字符编码”和与之对应的“ASCII编码和(或)Unicode转义”之间的相互转换。 - JFR: Java飞行记录(好奇怪的翻译,Java Flight Recordings)。Java Flight Recordings (JFR) — Java 飞行记录器 – part 1 - JMC: Java任务控制工具(java Mission Control)。对应bin目录下的jmc - RMI: Java远程方法调用(Remote Method Invocation,之前用过类似与thrift这种跨语言的远程调用框架,原理是socket通信)。对应bin目录下的 - java-rmi: Java远程方法调用(Java Remote Method Invocation)工具,主要用于在客户机上调用远程服务器上的对象。 - rmic: Java RMI 编译器,为使用JRMP或IIOP协议的远程对象生成stub、skeleton、和tie类,也用于生成OMG IDL。 - rmid: Java RMI 激活系统守护进程,rmid启动激活系统守护进程,允许在虚拟机中注册或激活对象。 - rmiregistry: Java 远程对象注册表,用于在当前主机的指定端口上创建并启动一个远程对象注册表。 - jstatd: jstatd(VM jstatd Daemon)工具是一个RMI服务器应用,用于监测HotSpot JVM的创建和终止,并提供一个接口,允许远程监测工具附加到运行于本地主机的JVM上。 - serialver: 序列版本命令,用于生成并返回serialVersionUID。 - IDL: 与RMI类似,是面向对象的远程调用,但不同的是他是跨语言的。对应bin目录下的 - idlj: IDL转Java编译器(IDL-to-Java Compiler),用于为指定的IDL文件生成Java绑定。IDL意即接口定义语言(Interface Definition Language)。 - servertool: Java IDL 服务器工具,用于注册、取消注册、启动和终止持久化的服务器。 - tnameserv: Java IDL瞬时命名服务。 - orbd: 对象请求代理守护进程(Object Request Broker Daemon),它使客户端能够透明地定位和调用位于CORBA环境的服务器上的持久对象。 - deploy: - javafxpackager: JavaFX包装器,用于执行与封装或签名JavaFX应用有关的任务。 - pack200: JAR文件打包压缩工具,它可以利用Java类特有的结构,对普通JAR文件进行高效压缩,以便于能够更快地进行网络传输。 - unpack200: JAR文件解压工具,将一个由pack200打包的文件解压提取为JAR文件。 - Monitor: 我这里理解为一系列的java运行监视工具 - JPS:JVM进程状态工具(JVM Process Status Tool),用于显示目标系统上的HotSpot JVM的Java进程信息。对应bin目录下的jps。 - JSTAT: JVM统计监测工具(JVM Statistics Monitoring Tool),主要用于监测并显示JVM的性能统计信息。对应bin目录下的jstat。 - Troubleshoot: java的一系列错误定位工具 - JINFO: Java配置信息工具(Java Configuration Information),用于打印指定Java进程、核心文件或远程调试服务器的配置信息。对应bin目录下的jinfo。 - JStack: Java堆栈跟踪工具,主要用于打印指定Java进程、核心文件或远程调试服务器的Java线程的堆栈跟踪信息。 - JMAP: ava内存映射工具(Java Memory Map),主要用于打印指定Java进程、核心文件或远程调试服务器的共享对象内存映射或堆内存细节。。对应bin目录下的jmap。 - jhat: Heap Dump Browser, 根据dump文件进行分析,可以在浏览器中查看。 - jsadebugd: Java可用性代理调试守护进程(Java Serviceability Agent Debug Daemon),主要用于附加到指定的Java进程、核心文件,或充当一个调试服务器。 - Scripting: - jrunscript: Java命令行脚本外壳工具(command line script shell),主要用于解释执行javascript、groovy、ruby等脚本语言。 - JVMTI: Java 虚拟机工具接口(Java Virtual Machine Toolkit Interface),用于替代在先前的 JDK 版本中作为试验功能存在的 Java 虚拟机剖析接口(Java Virtual Machine Profiling Interface,JVMPI)和 Java 虚拟机调试接口(Java Virtual Machine Debugging Interface,JVMDI)。通过 JVMTI 接口可以创建代理程序(Agent)以监视和控制 Java 应用程序,包括剖析、调试、监控、分析线程等等。 - Web Services: - wsgen: 当从 Java 代码启动时,wsgen 命令行工具将生成 Java API for XML Web Services (JAX-WS) 应用程序所必需的工件。 - wsimport: wsimport 命令行工具用于处理现有 Web Service 描述语言 (WSDL) 文件,并生成开发 Java API for XML-Based Web Services (JAX-WS) Web Service 应用程序所必需的工件。 - schemagen: XML schema生成器,用于生成XML schema文件。 - xjc: 主要用于根据XML schema文件生成对应的Java类。 ##程序部署和发布 - Java Web Start:允许用户直接从网络上运行基于java技术的应用。共有三种运行方式,无论哪一种,都会连上网络运行 - 1.从网页上点击链接。 - 2.从桌面图标或者开始菜单。 - 3.从java缓存视图中。 - Applet/Java Plug-in) applet小程序 ##用户界面工具集 - JavaFx: 2007年首次推出,具体资料可以看这些。JavaFX对Java开发者到底意味着什么JavaFX: Getting Started with JavaFX - Swing: 是所谓的Lightweight组件,不是通过native方法来实现的,所以Swing的窗口风格更多样化。但是,Swing里面也有heaveyweight组件。比如JWindow,Dialog,JFrame。Swing由纯Java写成,可移植性好,外观在不同平台上相同。所以Swing部件称为轻量级组件, Swing是由纯JAVA CODE所写的,因此SWING解决了JAVA因窗口类而无法跨平台的问题,使窗口功能也具有跨平台与延展性的特性,而且SWING不需占有太多系统资源,因此称为轻量级组件 - Java 2D:包括Graphics,Graphics2D接口。Trail: 2D Graphics - AWT:调用系统的native接口绘制,所以风格和系统相关。由于不同 操作系统 的图形库所提供的功能是不一样的,在一个平台上存在的功能在另外一个平台上则可能不存在。为了实现Java语言所宣称的“一次编译,到处运行”的概念,AWT 不得不通过牺牲功能来实现其平台无关性,也就是说,AWT 所提供的图形功能是各种通用型操作系统所提供的图形功能的交集。由于AWT 是依靠本地方法来实现其功能的,我们通常把AWT控件称为重量级控件。 - Accessbility: 无障碍使用,针对残疾人士。Java Accessibility Guide - Drag and Drop: 实现拖放功能。Lesson: Drag and Drop and Data Transfer - Input Methods:用户输入 - Image I/O:图片的输入输出 - Print Service:打印服务 - Sound:声音 ##三. 集成库 - IDL: Java IDL技术添加CORBA(Common Object Request Broker Architecture)到Java平台,提供了标准的互操性和连通性。Java IDL使得分布式,web的java应用能够使用OMG(Object Management Group)定义的行业标准的IDL(Interface Definition Language)语言和IIOP(Internet Inter-ORB Protocol) 协议透明的调用远程服务。 - JDBC: Java数据库连接API(Java Database Connectivity API)。 - JNDI: Java 命名与目录接口(Java Naming and Directory Interface),所有与系统外部的资源的引用,都可以通过JNDI定义和引用。通俗点理解我觉得应该就是将配置用xml保存。JNDI 是什么 - RMI: 远程方法调用API(Remote Method Invocation)。 - RMI-IIOP:通过IIOP(Internet Inter-ORB Protocol)协议的远程方法调用(RMI)。 - Scripting:能让java应用运行js引擎。 ##四. 其他基础库 - Beans: Java Beans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中。特点是 - 可序列化 - 提供无参构造器 - 提供getter方法和setter方法访问对象的属性。 名称中的“Bean”是用于Java的可重用软件组件的惯用叫法。

    public class PersonBean implements java.io.Serializable {

    /**
     * name 属性(注意大小写)
     */
    private String name = null;

    private boolean deceased = false;

    /** 无参构造器(没有参数) */
    public PersonBean() {
    }

    /**
     * name 属性的Getter方法
     */
    public String getName() {
        return name;
    }

    /**
     * name 属性的Setter方法
     * @param value
     */
    public void setName(final String value) {
        name = value;
    }

    /**
     * deceased 属性的Getter方法
     * 布尔型属性的Getter方法的不同形式(这里使用了is而非get)
     */
    public boolean isDeceased() {
        return deceased;
    }

    /**
     * deceased 属性的Setter方法
     * @param value
     */
    public void setDeceased(final boolean value) {
        deceased = value;
    }
}
  • Internationalization Support: 国际化支持。特点如下:
    • 额外的本土化数据和任何地方运行结果相同
    • 文字信息存储在代码之外,动态加载(方便程序的翻译)
    • 不需要重新编译就能支持新的语言
    • 基于文化的数据,比如日期,货币,呈现方式
    • 可以快速本土化
  • Input/Output: 输入/输出
    • 通过数据流、序列化、文件系统的输入输出
    • 字符集、解码、编码、byte到unicode直接的转换
    • 文件、文件属性、文件系统
    • 提供建立使用异步的或可复用的、无阻塞的输入输出的服务的API
    • java.io (description) - Supports system input and output, and object serialization. to the file system
    • java.nio (description) - Defines buffers for bulk memory operations. Buffers may be allocated in direct memory for high performance.
    • java.nio.channels (description) - Defines channels, an abstraction for devices capable of performing I/O operations; defines selectors for multiplexed, non-blocking I/O
    • java.nio.channels.spi (description) - Provides implementations for channels
    • java.nio.file - Defines interfaces and classes to access files and file systems.
    • java.nio.file.attribute - Defines interfaces and classes for accessing file system attributes.
    • java.nio.file.spi - Defines classes for creating a file system implementation.
    • java.nio.charset (description) - Defines charsets, decoders, and encoders, for translating between bytes and Unicode characters
    • java.nio.charset.spi (description) - Provides implementations for charsets
  • JMX: Java管理扩展(Java Management Extensions)。提供接口结合jconsole工具使用,可以实时查看java程序运行时的变量值,以及修改他们。
  • JNI: 提供java对c的支持,可以调用c的方法。
  • NetWorking: 提供使用URLS,URIS的类,socket类提供连接服务,安全功能。
  • Override Mechanism: 重载机制。
  • Security: 提供安全相关功能的API,例如可配置的访问控制,电子签名,认证和签名,加密,安全网络交互。
  • Serialization: 序列化,可以将对象(Object)序列化变成二进制流,然后从二进制流中读取出对象。
  • Extension Mechanism: 扩展机制。在我的理解中,是指java的包机制,类加载机制,包括从URL中获取。
    • java.lang.ClassLoader
    • java.lang.Package
    • java.lang.Thread
    • java.net.JarURLConnection
    • java.net.URLClassLoader
    • java.security.SecureClassLoader
  • XML JAXP Mechanism:提供丰富的API集用来处理XML文档和数据

##五. 语言和工具基础库 - Math: 提供和数学计算相关的方法 - Collections: - 1.分为两类 - 最基本的一类是 java.util.Collection,有以下的后代 - java.util.Set - java.util.SortedSet - java.util.NavigableSet - java.util.Queue - java.util.concurrent.BlockingQueue - java.util.concurrent.TransferQueue - java.util.Deque - java.util.concurrent.BlockingDeque - 另外的一类是 java.util.Map,Map并不是真正的Collections,但是他们有着和Collections类似的接口,所以可以像Collections一样操作。 - java.util.SortedMap - java.util.NavigableMap - java.util.concurrent.ConcurrentMap - java.util.concurrent.ConcurrentNavigableMap
- 2.许多Collections的修改操作都是可选的,当尝试使用没有实现的修改操作时会抛出UnsupportedOperationException,接口的实现必须明确哪些方法是支持的。 - 如果Collections不可修改,则是unmodifiable,如果可以修改,则是modifiable - 如果Collections一成不变,则是immutable,如果是变化的,则是mutable - 如果Lists的大小(Size)是不变的,则是fixed-size,否则则是variable-size. - 如果Lists支持快速的索引访问(时间为常量),则是Random Access,不支持则是sequential access。RandomAccess标记接口意味着Lists支持Random Access。 - 3.有一些元素的存储是有限制的(比如Map的key–value) - 是一个特定的类型 - 不能为null - obey some arbitrary predicate - 4.接口表格

    |Interface|HashTable|Resizable Array|Balanced Tree|Linked List|Hash Table + Linked List|
    |:----:|
    |Set      |HashSet  |               |TreeSet      |           |LinkedHashSet           |
    |List     |         | ArrayList     |             |LinkedList |                        |
    |Deque    |         | ArrayDeque    |             |LinkedList |                        |
    |Map      |HashMap  |               |TreeMap      |           |LinkedHashMap           |

- 5.AbstractCollection, AbstractSet, AbstractList, AbstractSequentialList and AbstractMap类已经提供了基本功能的实现
- 6.Concurrent Collection(提供多线程下的Collections)
    - 接口
        - BlockingQueue
        - TransferQueue
        - BlockingDeque
        - ConcurrentMap
        - ConcurrentNavigableMap

        - LinkedBlockingQueue
        - ArrayBlockingQueue
        - PriorityBlockingQueue
        - DelayQueue
        - SynchronousQueue
        - LinkedBlockingDeque
        - LinkedTransferQueue
        - CopyOnWriteArrayList
        - CopyOnWriteArraySet
        - ConcurrentSkipListSet
        - ConcurrentHashMap
        - ConcurrentSkipListMap
- 7.额外注意事项
   -  HashTable在官方的Collections中并没有任何提及,通过查看HashTable的源代码,发现它是继承自Dictionary,实现了Map的接口。而HashMap则是Map的实现,继承的AbstractMap也是Map的实现
    - HashTable和HashMap有以下的区别:
        - HashMap => 不同步、可空键值、效率高、containsKey/containsValue
        - Hashtable => 同步、非空键值、效率略低、contains/containsKey/containsValue

8.这一部分的内容越整理越多,还是另开一篇去记录。

- Concurrency Utilities: 提供了一系列支持并发的接口和类 - java.util.concurrent - java.util.concurrent.atomic:一系列的原子性类,比如AtomicInteger这样的,不需要额外的同步操作就可以支持并线程并发 - java.util.concurrent.locks:提供了多种锁机制

  • JAR: 提供格式化读写JAR文件的类
  • Logging: 提供日志功能
  • Management: 提供一系列标准的接口(JMX)用来管理资源,例如应用、设备、服务、Java虚拟机。关于JMX的内容上面以及整理过了。
  • Preferences API: 提供存储,读取用户和系统配置的方法。
  • Ref(Reference Objects): 提供了和垃圾收集器相关的接口,程序可以使用引用对象来获取一个对象的引用,这样做在之后的垃圾回收中仍然可能会将这个引用对象回收。程序也可以被设计成当垃圾收集器认为一个给定的对象的可达性(gc(垃圾回收)的可达性算法,这个在后续的垃圾回收算法中会整理出来)改变时被通知。因此,引用对象在设计简单的缓存时是很有用的,因为在低内存的情况下它会被自动回收,内存充裕时,因为对象保持了引用,所以不会被垃圾回收器回收。
  • Objects: 万物皆对象,你有吗。
  • Reflection: Java反射,也是很有用的一个库。spring的IOC就是Java反射的使用 。
  • Regular Expressions:正则表达式,也是很常用的库。
  • Versioning:可以让java程序在运行时被识别它的需求的运行环境的版本号。
  • Zip: 指的应该是Java Archive (JAR) Files,可以将多个文件压缩成一个的技术。
  • Instrumentation: 和Sound相关

##六. Java虚拟机 - HotSpot Client and Server VM: 现在我们最多接触到的应该就是HotSpot虚拟机了,但是在java最初发布到现在,出现过许多或经典或优秀或有特色的虚拟机实现。 - 1.Sun Classic/Exact VM - 2.Sun HotSpot VM - 3.Sun Mobile-Embedded VM/Meta-Circular VM - 4.BEA JRockit/IBM J9 VM - 5.Azul VM/BEA Liquid VM - 6.Apache Harmony/Google Android Dalvik VM - 7.Microsoft JVM及其他 ##七.参考文章 1. JDK自带工具一览表 2. java监控工具(jps,jstat,jstack,jmap,jvisualvm等) 3. JDK Tools and Utilities 4. Java Web Start Technology 5. Java™ Platform Overview 6. Java™ Naming and Directory Interface (JNDI) 7. Java™ Internationalization Support 8. Java™ I/O, NIO, and NIO.2 9. The Extension Mechanism 10. Collections Framework Overview 11. Java Concurrency Utilities 12. 《深入理解Java虚拟机第一章》

分类:java虚拟机学习