Java虚拟机的一些总结和理解(1)

1.Java文件执行流程

Java代码编译是由Java源代码编译器来完成的,也就是Java代码到JVM字节码(.class文件)的过程。

Java虚拟机的一些总结和理解(1)_第1张图片

Java字节码的执行是由JVM执行引擎来完成的

Java虚拟机的一些总结和理解(1)_第2张图片

Java代码编译和执行的整个过程包含以下三个重要机制

1.Java源码编译机制

a.分析和输入到符号表
b.注解处理
c.语义分析和生成class文件
生成的class文件有下面几个部分组成:
1)结构信息:包括class文件格式版本号及各部分的数量与大小的信息
2)元数据:对应于Java源码中声明与常量的信息。包含类、继承的超类、实现的接口的声明信息、域与方法声明信息和常量池
3)方法信息:对应Java源码中语句和表达式对应的信息。包含字节码、异常处理器表、求值栈与局部变量区大小、求值栈的类型记录、调试符号信息

2.类加载机制

JVM的类加载是通过ClassLoader及其子类来完成的

3.类执行机制

JVM执行class字节码,线程创建后,都会产生程序计数器(PC)和栈(Stack),程序计数器存放下一条要执行的指令在方法中的偏移量,栈中存放一个个栈帧,每个栈帧对应每个方法的每次调用,而栈帧又是有局部变量区和操作数栈两部分组成,局部变量区用于存放方法中的局部变量和参数,操作数栈中用于存放执行过程中产生的中间结果。

2.Java运行时数据区详解

Java虚拟机的一些总结和理解(1)_第3张图片
所有线程共享的内存空间
堆空间:JVM规范中规定,所有对象实例以及数组都要在堆上进行分配。一般来说,堆空间都有一个默认大小,取决于JVM实现,而且可以根据需要动态扩展。当创建对象需要在堆上分配空间,而且堆本身的空间不够也无法申请额外的空间,则会抛出OutOfMemoryError异常。
方法区:存储已经被JVM加载的类信息、方法信息、常量、静态变量、即时编译器编译后的代码等数据。静态域和常量池就是方法区的一部分。

每个线程独有的内存空间
PC程序计数器:一块较小的内存空间,每个线程都有一个程序计数器,用来表示线程当前需要执行的Java指令的地址。
**虚拟机栈空间:**JVM在执行一个线程的方法时,会为这个线程方法创建一个栈帧(可以理解为JVM栈空间中的一段存储区域)。这个栈帧用于存储局部变量表,操作数栈,动态链接和方法入口信息。
本地方法栈空间:跟虚拟机栈空间类似,只是用来存储本地方法调用的相关信息。
Java虚拟机的一些总结和理解(1)_第4张图片

3.堆内存重点介绍

Java虚拟机的一些总结和理解(1)_第5张图片
堆内存=Young(新生代,占1/3)+Old(年老代,占2/3)。
新生代=Eden+Survivor(from)+Survivor(to)。比例为:8:1:1。
1、new的对象都是在Eden区。
2、过段时间执行GC后存活下来的会被放到Survivor(from)区。
3、再过段时间GC执行的时候如果Survivor(from)区满了就讲Survivor(from)存活下来的复制到Survivor(to),一直轮换复制,这就是为什么需要两个Survivor区。
4、继续执行GC,Survivor存活下来的会放到Old区。
Java虚拟机的一些总结和理解(1)_第6张图片

4.垃圾回收机制

1:停止-复制(stop and copy)。效率低,需要的空间大,优点,不会产生碎片。Young使用的就是这种算法。

2:标记 - 清除算法 (mark and sweep)。主要是首先标记出所有需要回收的对象,然后回收所有需要回收的对象。速度较快,占用空间少,标记清除后会产生大量的碎片。Old使用的是这种算法。

5.虚拟机调优

-Xms –初始堆大小。如:-Xms256m
-Xmx –最大堆大小。如:-Xmx512m
-Xmn –新生代大小。通常为 Xmx 的 1/3 或 1/4。新生代 = Eden + 2 个 Survivor 空间。实际可用空间为 = Eden + 1 个 Survivor,即 90%
-Xss –JDK1.5+ 每个线程堆栈大小为 1M,一般来说如果栈不是很深的话, 1M 是绝对够用了的。
-XX:NewRatio –新生代与老年代的比例,如 –XX:NewRatio=2,则新生代占整个堆空间的1/3,老年代占2/3
-XX:SurvivorRatio –新生代中 Eden 与 Survivor 的比值。默认值为 8。即 Eden 占新生代空间的 8/10,另外两个 Survivor 各占 1/10
-XX:PermSize –永久代(方法区)的初始大小
-XX:MaxPermSize –永久代(方法区)的最大值
-XX:+PrintGCDetails –打印 GC 信息
-XX:+HeapDumpOnOutOfMemoryError –让虚拟机在发生内存溢出时 Dump 出当前的内存堆转储快照,以便分析用

你可能感兴趣的:(java)