JVM总结

来源:互联网 发布:互联网医院 知乎 编辑:程序博客网 时间:2024/05/21 18:48
JVM GC的说法,我也是网上看了很多的说法,总结的。


我们项目运行时,会启动JVM(JAVA虚拟机)


可以看到我们的正式服的都是class文件。


JVM会先一次性分配一块较大的空间。


JVM先运行Class Loader把类都装载到内存区域


内存区域会分为几种类型进行分配:


1:方法区:存放常量、静态变量、构造函数
2:java堆:存放被new出来的对象
3:java栈:存放每次调用方法时,方法内的变量、返回值等
4:程序计数器:存放运行时线程之间需要切换之前的内存地址。
5:本地方法栈:这个我看的不怎么懂,好像说是什么本地方法,你们可以查下,告诉大家是什么。




而GC(垃圾回收机制),回收时间是随机的,看JVM的心情。当然这种看心情的情况是在新生代与老年代存放空间未满的。


先说说对象的生命周期:
1、年轻代:分为(Enden区和两个Survivor区(FROM和TO区))新的对象产生时,存放在年轻代Enden区。
说明:当Enden区被对象填满时,会执行GC(就是会触发垃圾回收机制),把存活下来的对象放到Survivor区
然后看JVM的心情进行多次GC时,依然存活下来的对象会转到年老代
这就好像我springmvc框架里,项目一移动的时候,会产生很多新对象,这些对象先到了Enden区,然后运行了一段时间,发现这些对象还在,就会被移到年老代区

2、年老代:存放N次都没被GC掉的对象,生命周期比较长的。
说明:年老代空间满了之后也会执行GC,称为:Full GC

3、永久代:存放静态变量、类、方法啊这些数据,一般不会去清理永久代的数据。


一般来说,代码敲的不好,会产生很多的年老代。当GC去回收时,发现没有回收的可用的内存空间,会一直循环去回收,导致CPU 100%。


所以我们尽可能的配置好JAVA JVM的参数
1、Xms JVM的初始堆大小
2、Xmx JVM的最大堆大小
当最小堆被占满后,会进行GC,如果GC之后还不能得到足够的内存,就会扩展堆,最大扩展至Xmx设定值。
原创粉丝点击