虚拟机(JVM),它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.java虚拟机有自己完善的硬件架构,如处理器,堆栈,寄存器等,还具有相应的指令系统.JVM屏蔽了与具体操作系统平台相关的信息,使得java程序只需生成在java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行.java虚拟机在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令来执行.
常见的JDK内存机制.
Young(年轻代,也叫new区)
young 可以分为Eden区和两个Survivor区(from 和to,两个Survivor区大小严格一致),新的对象实例总是首先放在eden区,Survivor区作为eden区和Tenure(old)的缓冲,可以向Tenure(old)转移活动的对象实例
Tenured (保持代,也叫old区)
Tenure中存放生命周期长久的实例对象,但是里面的对象也是会被回收掉的.
young和Tenured组成了Java的堆内存.
Perm(永久代)
perm则是非堆内存的组成部分.主要存放加载的class类级别对象如class本身,method,field等.
在jvm启动时,就已经保留了固定的内存空间给heap内存,这部分内存并不一定都会被JVM使用,但是可以确定的是这部分保留的内存不会被其他进程使用,这部分内存的大小由-Xmx参数指定.
影响这个的参数是-Xms, 如果-Xms指定的值比-Xmx的小,那么两者的差值就是Virtual内存值.随着内存的运行,Eden区,Tenured区和Perm取会逐渐使用保留的Virtual空间.
Java的GC原理.
GC即垃圾回收机制,java开发人员无法使用指针来自由地管理内存,GC是JVM对内存进行管理的方式.GC使得JAVA开发人员摆脱了繁琐的内存管理工作,让程序的开发更有效率.
jvm中的classloader
类加载器用来加载java类到java虚拟机中,一般来说,java虚拟机使用java类的方式如下:java源程序(.java文件)在经过java编译器之后就被转换成java字节码文件(.class)。类加载器负责读取java字节代码,并转换成java.lang.Class类的一个实例. 每个这样的实例用来表示一个java类.
与C和C++编写的程序不同,java程序是由许多独立的类文件组成的,每个文件对应于一个java类. 此外,这些类文件并非立即全部装入内存,而是根据程序需要装入内存的.ClassLoader便是JVM中将类装入内存的那个零件。用户可以定制自己的ClassLoader。JVM中缺省的CLASSLOADER可以完成本地文件装入类文件的任务.用户定制的CLassloader可以拥有JVM缺省的classloader所不具有的功能.例如,用户可以使用自己创建的classloade从非本地
硬盘或者从网络装入可执行代码.
jvm在运行时会产生三个classLoader,即bootstrap classloader,extension classloader,app classloader.bootstrap classloader使用C++编写,屏幕上打印它时为null.它用来在jvm启动时自动加载核心类库,
运行过程中不能修改bootstrap 加载路径. entension classloader用来加载JRE/lib/ext目录下的库文件,jre/classes
目录下的类.app classloader用来加载classpath变量指定路径下的类.三者的层次关系如下.
bootstrap classloader
extension classloader
app classloader
找不到时用下面的一个