1、 JVM的组成java
JVM由4大部分组成:ClassLoader,Runtime Data Area,Execution Engine,Native Interface。web
2、windows
2.1.ClassLoader是负责加载class文件,class文件在文件开头有特定的文件标示,而且ClassLoader只负责class文件的加载,至于它是否能够运行,则由Execution Engine决定。数组
2.2.Native Interface是负责调用本地接口的。他的做用是调用不一样语言的接口给JAVA用,他会在Native Method Stack中记录对应的本地方法,而后调用该方法时就经过Execution Engine加载对应的本地lib。本来多于用一些专业领域,如JAVA驱动,地图制做引擎等,如今关于这种本地方法接口的调用已经被相似于Socket通讯,WebService等方式取代。服务器
2.3.Execution Engine是执行引擎,也叫Interpreter。Class文件被加载后,会把指令和数据信息放入内存中,Execution Engine则负责把这些命令解释给操做系统。架构
2.4.Runtime Data Area则是存放数据的,分为五部分:Stack,Heap,Method Area,PC Register,Native Method Stack。几乎全部的关于java内存方面的问题,都是集中在这块。app
3、关于stack框架
Stack是java栈内存,它等价于C语言中的栈,栈的内存地址是不连续的,每一个线程都拥有本身的栈。栈里面存储着的是StackFrame,在《JVM Specification》中文版中被译做java虚拟机框架,也叫作栈帧。StackFrame包含三类信息:局部变量,执行环境,操做数栈。局部变量用来存储一个类的方法中所用到的局部变量。执行环境用于保存解析器对于java字节码进行解释过程当中须要的信息,包括:上次调用的方法、局部变量指针和操做数栈的栈顶和栈底指针。操做数栈用于存储运算所须要的操做数和结果。StackFrame在方法被调用时建立,在某个线程中,某个时间点上,只有一个框架是活跃的,该框架被称为Current Frame,而框架中的方法被称为Current Method,其中定义的类为Current Class。局部变量和操做数栈上的操做老是引用当前框架。当Stack Frame中方法被执行完以后,或者调用别的StackFrame中的方法时,则当前栈变为另一个StackFrame。Stack的大小是由两种类型,固定和动态的,动态类型的栈能够按照线程的须要分配。webapp
4、关于heapjvm
Heap是用来存放对象信息的,和Stack不一样,Stack表明着一种运行时的状态。换句话说,栈是运行时单位,解决程序该如何执行的问题,而堆是存储的单位,解决数据存储的问题。Heap是伴随着JVM的启动而建立,负责存储全部对象实例和数组的。堆的存储空间和栈同样是不须要连续的,它分为Young Generation和Old Generation(也叫Tenured Generation)两大部分。Young Generation分为Eden和Survivor,Survivor又分为From Space和 ToSpace。
和Heap常常一块儿说起的概念是PermanentSpace,它是用来加载类对象的专门的内存区,是非堆内存,和Heap一块儿组成JAVA内存,它包含MethodArea区(在没有CodeCache的HotSpotJVM实现里,则MethodArea就至关于GenerationSpace)。在JVM初始化的时候,咱们能够经过参数来分别指定,PermanentSpace的大小、堆的大小、以及Young Generation和Old Generation的比值、Eden区和From Space的比值,从而来细粒度的适应不一样JAVA应用的内存需求。
5、
JVM的运行原理简介
Java 程序被javac工具编译为.class字节码文件以后,咱们执行java命令,该class文件便被JVM的Class Loader加载,能够看出JVM的启动是经过JAVA Path下的java.exe或者java进行的。JVM的初始化、运行到结束大概包括这么几步:
调用操做系统API判断系统的CPU架构,根据对应CPU类型寻找位于JRE目录下的/lib/jvm.cfg文件,而后经过该配置文件找到对应的jvm.dll文件(若是咱们参数中有-server或者-client, 则加载对应参数所指定的jvm.dll,启动指定类型的JVM),初始化jvm.dll而且挂接到JNIENV结构的实例上,以后就能够经过JNIENV实例装载而且处理class文件了。class文件是字节码文件,它按照JVM的规范,定义了变量,方法等的详细信息,JVM管理而且分配对应的内存来执行程序,同时管理垃圾回收。直到程序结束,一种状况是JVM的全部非守护线程中止,一种状况是程序调用System.exit(),JVM的生命周期也结束。
6、
加载阶段作了什么,其实加载阶段作了有三件事情:
7、
Java堆惟一的做用就是存储对象实例,只要保证不断建立对象而且对象不被回收,那么对象数量达到最大堆容量限制后就会产生内存溢出异常了。因此测试的时候把堆的大小固定住而且让堆不可扩展便可。
Java虚拟机规范中描述了若是线程请求的栈深度太深(换句话说方法调用的深度太深),就会产生栈溢出了。
运行时常量池也是方法区的一部分,因此这两个区域一块儿看就能够了。这个区域的OutOfMemoryError能够利用String.intern()方法来产生。这是一个Native方法,意思是若是常量池中有一个String对象的字符串就返回池中的这个字符串的String对象;不然,将此String对象包含的字符串添加到常量池中去,而且返回此String对象的引用。
8、
类的实例化顺序,好比父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,他们的执行顺序
答:先静态、先父后子。
先静态:父静态 > 子静态
优先级:父类 > 子类 静态代码块 > 非静态代码块 > 构造函数
一个类的实例化过程:
1,父类中的static代码块,当前类的static
2,顺序执行父类的普通代码块
3,父类的构造函数
4,子类普通代码块
5,子类(当前类)的构造函数,按顺序执行。
6,子类方法的执行,
9、
JVM内存分配
10、常见的目录结构: • /bin:存放windows或Linux平台上启动和关闭Tomcat的脚本文件 • /conf:存放Tomcat服务器的各类全局配置文件,其中最重要的是server.xml和web.xml • /doc:存放Tomcat文档 • /server:包含三个子目录:classes、lib和webapps • /server/lib:存放Tomcat服务器所需的各类JAR文件 • /server/webapps:存放Tomcat自带的两个WEB应用admin应用和 manager应用 • /common/lib:存放Tomcat服务器以及全部web应用均可以访问的jar文件 • /shared/lib:存放全部web应用均可以访问的jar文件(可是不能被Tomcat服务器访问) • /logs:存放Tomcat执行时的日志文件 • /src:存放Tomcat的源代码 • /webapps:Tomcat的主要Web发布目录,默认状况下把Web应用文件放于此目录 • /work:存放JSP编译后产生的class文件