前边我们讲了如何使用Mybatis的Mapper代理的方式完成DAO层的开发,即程序员需要先定义一个mapper.xml映射文件,然后按照四种规范定义一个DAO接口即其中的方法,那么就可以在程序中使用sqlSession.getMapper(DAO.class)来获取DAO接口对应的实例了,进而也就可以调用相应的方法了。
学习了这么久的Java基础和Java的框架,发现在敲代码的过程中,偶尔会遇到内存溢出的情况,有栈溢出(*)和堆溢出(OutOfMemory),主要意思是程序在Java虚拟机中运行时,jvm的存储实例对象和区域和存储引用变量的区域已经存不下了,超出设定的峰值而导致的。为了研究这类问题和更好的理解Java程序的在虚拟机中的运行机制,我昨天刚刚买了两本书:《实战Java虚拟机:JVM故障诊断与性能优化》《深入理解Java虚拟机》。为了便于我们理解和操作,我准备先从第一本书开始学习。
今天就讲一讲这本书的第一章节:初探Java虚拟机
1.理解Java虚拟机的原理
所谓虚拟机,就是指一台虚拟的计算机,它其实是一个软件程序,用来执行一系列虚拟计算机的指令。
虚拟机可以分为系统虚拟机和程序虚拟机,VisualBox、VMWare就是典型的系统虚拟机,他可以允许一个完整的操作系统运行在其中,如windows、linux。程序虚拟机典型代表就是JVM(Java Vitual Machiine),它是专门为执行单个计算机程序而设定,在Java虚拟机中执行的指令我们成为字节码指令。
Java语言的跨平台性:这里指的夸平台是指夸操作系统,Java程序在eclipse中先被编译成字节码文件即.class文件,然后将这些字节码文件加载到JVM中运行,由于JVM是可以在不同的操作系统上运行的,所以Java程序也就跨平台了。
JVM虚拟机现在被大规模部署和应用的是Hotspot虚拟机--热点虚拟机,其他的如IBM正在使用的是一种J9虚拟机。
2.JVM规范
JVM是一个运行Java字节码的虚拟机,它有独立的运行机制,其运行的Java字节码也未必是由Java语言编译而成,向Groovy、Scala等语言生成的Java字节码也可以在JVM中运行。立足于JVM,可以产生各种各样的跨平台语言,除了语言规范不同之外,他们可以共享JVM带来的跨平台性、优秀的垃圾回收机制、以及可靠的即时编译。
即时编译器:当Java程序写好之后,前端的编译器如javac就会将其编译成字节码文件,然后JVM中的即时编译器就会将字节码文件编译成可以被指定处理器解读的程序,即时性体现在将加载到JVM中的.class字节码文件先解释成处理器可以理解的代码再进行运行。在任何平台上,即任何操作系统上,JVM的即时编译器都会将编译好的字节码文件解释成可以被特定处理器理解的指令,即所谓的“一次编译,处处运行”。
3.整数在JVM中的表示
在Java语言规范中,整数有四种byte、short、int、long,分别表示1、2、4、8个字节,一个字节代表8个二进制数,所以四种Java类型又对应8/16/32/64个二进制数据(含符号位)。这里说的二进制数据是编译好的字节码文件的数据在JVM中存储的形式。
Java语言中的整数在计算机(虚拟机也是)中存储的方式是其对应的二进制数据的补码。原码是整数对应的二进制数据,反码是符号位不变其余位取反的二进制表示,补码分两种,整数的补码就是其本身,负数的补码就是其反码加一。
浮点数在计算机和虚拟机中表示的方式,有一点复杂,暂时不讲。
4.编译和调试虚拟机
linux系统中进行编译和调试,暂时不讲。