JVM 简析

1,什么是JVM?

  • JVM 是 java虚拟机,是用来执行java字节码(二进制的形式)的虚拟计算机。
  • jvm是运行在操作系统之上的,与硬件没有任何关系。

        注:字节码是Java虚拟机的机器语言。是独立于平台的,由运行在windows中的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码(二进制)是特定于平台的,如果它是在Windows x86中编译的,它将仅在Windows x86中运行。

2,JVM的分类

JVM 简析

        类加载子系统。
        运行时数据区 [ 我们核心关注这里 的栈、堆、方法区 ]。

        执行引擎(一般都是JIT编译器和解释器共存)

                JIT编译器(主要影响性能):编译执行; 一般热点数据会进行二次编译,将字节码指令变成机器指令。将机器指令放在方法区缓存。

                解释器(负责响应时间,他的响应时间很快):逐行解释字节码

3,JVM的体系结构

JVM 简析

1、入口是编译好的字节码文件(编译器前端)-->经过类加载子系统(将我们的字节码加载到内存当中,生成一个class对象,中间经过三步:加载--->链接--->初始化)

2、在内存中,多个对象共享内存的是方法区和堆区(多个线程共享区)。

3、Java虚拟机栈,本地方法栈,程序计数器每一个线程独有一份。

4、执行引擎:解释器(解释运行),jit及时编译器(编译器后端),垃圾回收器三部分。
 

4、JVM内存管理


4.1、JVM内存组成结构

1)堆
所有通过new创建的对象的内存都在堆中分配,堆的大小可以通过-Xmx和-Xms来控制。堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由From Space和To Space组成,结构图如下所示:

JVM 简析

  • 新生代。新建的对象都是用新生代分配内存,Eden空间不足的时候,会把存活的对象转移到Survivor中,新生代大小可以由-Xmn来控制,也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例
  • 旧生代。用于存放新生代中经过多次垃圾回收仍然存活的对象
  • 持久带(Permanent Space)实现方法区,主要存放所有已加载的类信息,方法信息,常量池等等。可通过-XX:PermSize和-XX:MaxPermSize来指定持久带初始化值和最大值。Permanent Space并不等同于方法区,只不过是Hotspot JVM用Permanent Space来实现方法区而已,有些虚拟机没有Permanent Space而用其他机制来实现方法区。

2)栈

每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果。

-xss:设置每个线程的堆栈大小. JDK1.5+ 每个线程堆栈大小为 1M,一般来说如果栈不是很深的话, 1M 是绝对够用了的。

3)本地方法栈

用于支持native方法的执行,存储了每个native方法调用的状态。

4)方法区

存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息。JVM用持久代(Permanet Generation)来存放方法区,可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。
 

3.2、图解JVM内存

JVM 简析

 JVM 简析

上一篇:静态链表实现


下一篇:编写一个函数,由实参传来一个字符串,统计此字符串中字母,数字,空格和其他字符的个数。在主函数中输入字符串以及输出上述结果。