1.Java虚拟机是一种物理机,是一种调用方法和执行方法的数据结构。
2.jdk,jre,jvm它们三者之间的关系:jdk>jre>jvm。
jdk是所有的组件的环境,里面包含的各种工具,组件。
jre是Java使用的各种技术,比如:Java web start,Applet/java Plug-in,javaFx ,Swing,,,,等等。
jvm是jdk环境里面的一种虚拟机,很小的范围,用来运行客户端和服务端的作用。
3.代码是怎么运行的?
Java源文件把代码写好,然后进行编译,当在终端输入java 文件名.java;时源文件.java.变成了.class,也就是字节码文件,然后字节码文件再进行编译,通过类加载机制进行编译到内存中,也就是要通过虚拟机进行的。
4.类加载机制?
类加载机制就是虚拟机把.class文件加载到内存,并对数据进行校验,转换解析和初始化,形成虚拟机直接使用的Java类型,即java.lang.class.
5.装载:
1).通过一个全限类名获取此类的二进制流,
2).通过这个二进制流所代表的静态存储结构转换成为方法区的运行时数据结构,
3).在java 堆中生成一个代表这个类的java.lang.Class对象,作为方法区中这些数据的访问入口。
6.连接(LINK)。
里面有验证,解析,初始化。
1).验证:验证一些文件规范,文件格式验证,元数据验证,字节码验证,符号引用验证。
2).准备:类的静态变量分配内存,并将其初始化。
3).解析:把类中的符号引用转换成直接引用。
7.初始化:
对类的静态变量,静态代码块执行初始化操作。
加载时的原则:
双亲委派机制:一个类加载器接到类加载请求时,它首先不会自己去加载这个类,而是把这个请求任务委托给父类加载器中完成,依次递归,如果父类加载器可以完成任务,就成功返回,只有父类加载器加载类时,才自己加载。
加载的顺序是,从上往下,依次是,父类启动类---》 程序类加载器----〉扩展类加载器--------》其他类加载器。
检查己加载的顺序是从下往上,依次是,子类(其它类加载器)----〉扩展类加载器-----》程序类加载器-----〉父类加载器。
8.运行时数据区:
方法区:
堆区:该堆区在内存中时最大的一块存储区,用来分配存储对象,线程也是共享的。
本地方法栈:本地的方法在此栈中保存。
虚拟机栈:是一个线程执行的过程,保存的线程调用方法的状态,虚拟机栈线程是私有的。随的线程的创建而创建。
程序计数器:占用内存空间最小的一块,Java多线程是通过线程轮流切换,分配处理器执行时间的方式来实现的,也是线程私有的。
9.内存模型
内存中对线程区共享的只有堆区和方法区。
一块是堆区,一块是非堆区。
堆区里面分为Old和young。young里面分为Eden区和surialvs区,而s区又可以分为s0,s1区。
图示理解:
一般情况下,新创建的对象都会被分配到Eden区,一些特殊的大的对象会直接分配到Old区。
比如有对象A,B,C等创建在Eden区,但是Eden区的内存空间肯定有限,比如有100M,假如已经使用了100M或者达到一个设定的临界值,这时候就需要对Eden内存空间进行清理,即垃圾收集(Garbage Collect),这样的GC我们称之为Minor GC,Minor GC指得是Young区的GC。
经过GC之后,有些对象就会被清理掉,有些对象可能还存活着,对于存活着的对象需要将其复制到Survivor区,然后再清空Eden区中的这些对象。