JVM原理简单的认识
JVM指的是Sun公司的HotSpot JVM,JDK1.8之后JVM整合了JRockit 和 HotSpot的优点。JVM的行原理简历理解就是:JVM通过编译器将JAVA文件编译成class文件;然后通过类的加载器,将class加载到内存中,然后通过解释器对class文件进行解释,并转换为当前机器对应的机器码,从而实现“一处编译,到处运行”。
一、JVM内存模型?
JVM把内存划分为堆,载,方法区。
堆:堆是所有线程共享,虚拟机启动时创建,主要存放对象和数组,所占内存比较大。
堆结构包含年轻代,老年代和持久代,其中年轻代又分为Eden区和2个Survivor区(幸运区)。
-Xms=*** 堆初始化空间大小,默认内存的1/64
-Xmx=*** 堆空间最大值
-XX:NewSize=*** 新生代空间大小
-XX:MaxNewSize=*** 新生代空间最大值
-Xmn=*** 新生代空间大小,这里包含From、To两个Survivor区(比例:8:1:1)。
栈:栈是线程独享的。生命周期和线程相同,主要存储局部变量和参数等信息。当系统创建一个线程时,会为该线程分配一个栈空间,
程序在每次调用一个方法时,会为每个方法创建一个栈帧并PUSH到当前线程对应的栈中。
-Xss=*** 栈空间大小
方法区:方法区是线程共享的,主要存储类的信息、常量、静态变量等信息;JDK1.8之后方法区移除,方法去的数据都迁移至元空间,
元空间和方法区类似,不同的是,方法区是在虚拟机中,而元数据是存储在本地内存中。
-XX:PermSize=***
-XX:MaxPermSize=***
-XX:MetaspaceSize=***
-XX:MaxMetaspaceSize=***
二、GC回收?
GC回收分为2中,一种是Minor GC,也就是年轻代GC(YGC),一种Major GC, 也就是FULLGC。
无论是YGC还是FULLGC都会使得程序暂停,而进行GC回收活动。所以我们应避免系统出现频繁的YGC和FULLGC,以及尽量降低GC时长。
因此在做JVM调优时,我们可以从几个方面入手:
第一、优化代码逻辑,尽量少创建一次性对象,特别是内存占用较大的对象
第二、对于频繁使用的对象,我们可以建立一个对象池,从而避免频繁的创建对象和回收对象。
第三、可以调整堆大小
三、常用调优工具?
我常用调优GUI工具(JDK自带):jconsole jVisualVM
以上是对JVM调优的简单梳理,更多详细的,请自行探索 ~_~!