JVM的组成部分和基础运行参数

Posted programmlover

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM的组成部分和基础运行参数相关的知识,希望对你有一定的参考价值。

一 JVM的内部结构

1.JVM内部分为九大结构,如图:

技术图片

  1)类加载子系统:负责从文件系统或是网络中加载Class信息,加载的信息存放在一块称之为方法去的内存空间。

  2)方法区(永久区):用于存放类的信息、常量信息、常量池信息、包括字符串字面量和数字常量等。(反射就是从这里读取类的信息)

  3)Java堆:在JVM启动的时间建立Java堆,它是Java程序最主要的内存上的工作区域。几乎所有的对象实例都存放在Java堆中(GC主要的负责对象),堆空间是所有线程共享的。

  4)直接内存:Java的NIO库允许Java程序使用直接内存,从而提高性能,通常直接内存速度会优于Java堆,读写频繁可能会使用到。

  5)Java栈:每个线程都有一个私有的栈,一个线程的Java栈在线程创建的时候被创建。Java栈中保存着局部变量、方法参数、Java的方法调用、返回值等。

  6)本地方法栈:本地方法栈和Java栈非常相似,最大不同为本地方法栈用于本地方法调用。JVM允许Java直接调用本地方法(JDK中用native修饰的方法就是调用的本地方法)。(通常用C编写)。

  7)垃圾收集系统(GC):垃圾收集系统是Java的核心,也是必不可少的,Java有一套自己进行垃圾清理的机制,使开发人员无需手工清理。

  8)PC寄存器:它是每个线程私有的空间,JVM会为每个线程创建单独的PC寄存器,在任意时刻,一个Java线程总是在执行一个方法,这个方法被称为当前方法,如果当前方法不是本地方法,PC寄存器会执行当前正在被执行的指令,如果是本地方法,则PC寄存器值为undefined,寄存器存放如当前环境指针、程序计数器、操作栈指针、计算的变量指针等信息。

  9)执行引擎:JVM最核心的组件,它负责执行虚拟机字节码。一般会先进行编译成机器码后执行。

 

二 辨清Java堆:

Java堆是和Java应用程序关系最密切的内存空间,几乎所有的对象都存放在其中,并且Java堆完全是自动化管理的,通过垃圾回收机制,垃圾对象会自动清理,不需要显示地释放。

根据垃圾回收机制不同,Java堆有可能拥有不同的结构,最为常见的就是将整个Java堆分为新生代和老年代,其中新生代存放新生的对象或者年龄不大的对象,老年代则存放老年对象。

新生代分为Eden(伊甸)区、s0区、s1区,s0和s1也被称为from和to区,他们是两块大小相等并且可以互换角色的空间。

绝大多数情况下,对象首先分配在Eden区,在一次新生代回收后,如果对象还活着,则会进入s0或是s1区,之后每次经过一次新生代回收,如果对象存活则它的年龄就加1,当对象达到一定年龄后,则进入老年代。

技术图片

 

三 JVM运行参数:

1)堆分配参数:

  -XX:+PrintGC   //使用这个参数,虚拟机启动后,只要遇到GC就会自动打印日志。

  -XX:+UseSerialGC  //配置串行回收器

  -XX:+PrintGCDetails  //可以查看详细信息,包括各个区的情况。

  -Xms    //设置Java程序启动时初始堆大小,如-Xms20m,代表初始堆大小为20m。

  -Xmx    //设置Java程序能获得的最大堆大小

  -Xmn    //设置新生代大小,设置一个比较大的新生代会减少老年代的大小,这个参数对系统性能以及GC行为有很大影响,新生代大小一般会设置为整个堆空间大小的1/3到1/4左右

  -XX:servivorRatio  //用来设置新生代中Eden空间和from/to空间的比例。含义: -XX:ServivorRatio=eden/from=eden/to

  -XX:NewRatio  //设置新生代和老年代的比例。含义:-XX:NewRatio=老年代/新生代

 

以上是关于JVM的组成部分和基础运行参数的主要内容,如果未能解决你的问题,请参考以下文章

[Java] Java 技术和 JVM 基础

第六部分:JVM内存模型与JVM参数详细配置

JVM内存组成

JVM基础--JVM参数之堆栈空间配置

Java面试问题笔记——JVM

JVM内存分为哪几部分?各个部分的作用是什么?