提示:不积硅步,无以至千里
文章目录
- 前言
- JVM中栈和堆的区别
- JVM中的垃圾清理机制
- 查看JVM各个参数命令
- 总结
前言
本文主要介绍:
- JVM中栈和堆的区别
- JVM中的垃圾清理机制
- 日常工作排查JVM问题用的最多的命令
一、JVM中栈和堆的区别?
- 功能性: 栈是用来执行程序的,放的是程序执行的逻辑,堆是用来放对象的
- 共享性:栈是线程私有的,堆事线程共享的
- 空间大小:堆的空间远远大于栈的空间
- 在java中一个线程就会相应有一个线程栈与之对应,这点容易理解.因为不同的线程执行的逻辑有所不同,因此需要一个独立的线程栈.而堆则是所有线程共享的.栈因为是运行单位,因此里面存储的信息都是跟当前线程(或程序)的相关信息.包括局部变量、程序运行状态、方法返回值等等;而堆只负责存储对象信息
- 在java中,Main函数就是栈的起始点,也是程序的起始点
二、JVM中垃圾清理机制
首先我们只针对堆空间的清理机制进行探讨.堆空间我们上面说到存储的是我们的对象信息.堆空间被分为了新生代(1/3)和老年代(2/3).其中新生代空间又分为了伊甸区(8/10),from区(1/10),to区(1/10).
GC的垃圾回收机制是这样的: 当伊甸区满时,触发第一次GC,将无用的清理掉,将有用的复制到from区,年龄+1.
当from区满时,触发第二次GC,清理伊甸区和from区,将无用的清理掉,将有用的复制到to区,年龄+1.
当to区满时,触发第三次GC,清理伊甸区、from区、to区,将无用的清理掉,有用的放入from区,to区清空,年龄+1.
............如此往复
当年龄==15时,会将有用的对象复制移到老年代区域,同时清空他们在新生代占用的空间.
当老年代的空间也不够用了,会产生fullGC(回收整个堆内存).
在次过程中需要注意的是,当某些对象一开始需要分配一块比较大的空间时(大于伊甸区的1/2),会直接分配到老年代区域
三、查看JVM各个参数命令
jps #查看当前服务器java进程
jmap -heap
其中的Heap configuration 表示堆内存初始化配置
MinHeapFreeRatio=40 # 对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
MaxHeapSize # 对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
NewSize = 1.0MB # 对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
OldSize = 4.0MB # 对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老生代’的大小
NewRatio = 2 # 对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
SurvivorRatio = 8 # 对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
G1 Heap: # 表示堆内存的使用情况, 其中capacity表示堆内存总容量,used表示已经用了多少,free表示有多少空闲
G1 Young Generation: # 表示年轻代区域 ,其中包含Eden space(伊甸区)和Survivor space(幸存区),幸存区又分为from区和to区
G1 Old Generation: # 表示老年代区域
总结
学到就是赚到,每天学一点.