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
工具及工具API Java Javac JavaDoc Jar Javap Monitor JPDA
JConsole Java VisualVM JavaDB security Internationalization JMC RMI
IDL Deploy JFR Troubleshoot Scripting JVMTI Web Services
程序部署和发布 Java Web Start Applet/Java Plug-in
用户界面工具集 JavaFX
Swing Java 2D AWT Accessbility
Drag and Drop Input Methods Image I/O Print Service Sound
集成库 IDL JDBC JNDI RMI RMI-IIOP Scripting
其他基础库 Beans Int’l Support Input/Output JMX
JNI NetWorking Override Mechanism
Security Serialization Extension Mechanism XML JAXP Mechanism
语言和工具基础库 Math Collections Concurrency Utilities JAR
Logging Management Preferences API Ref Objects
Reflection Regular Expressions Versioning Zip Instrumentation
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虚拟机第一章》

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据