一 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=老年代/新生代
原文地址:https://www.cnblogs.com/programmlover/p/10352810.html