java虚拟机

来源:互联网 发布:进销存数据库设计 编辑:程序博客网 时间:2024/05/01 16:25

1、java文件执行流程

Java代码编译是由Java源码编译器来完成,也就是Java代码到JVM字节码(.class文件)的过程。
这里写图片描述
Java字节码的执行是由JVM执行引擎来完成
这里写图片描述
Java代码编译和执行的整个过程包含了以下三个重要的机制

1、Java源码编译机制

①分析和输入到符号表

②注解处理

③语义分析和生成class文件

最后生成的class文件由以下部分组成:

①结构信息:包括class文件格式版本号及各部分的数量与大小的信息

②元数据:对应于Java源码中声明与常量的信息。包含类/继承的超类/实现的接口的声明信息、域与方法声明信息和常量池

③方法信息:对应Java源码中语句和表达式对应的信息。包含字节码、异常处理器表、求值栈与局部变量区大小、求值栈的类型记录、调试符号信息

2、类加载机制

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

3、类执行机制

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

2、java运行时区详解

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

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

3、堆内存重点介绍

这里写图片描述
堆内存=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区。
这里写图片描述

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 出当前的内存堆转储快照,以便分析用
0 0
原创粉丝点击