JVM的内存分代,这篇文章帮你理一理

微信搜索《Java鱼仔》,每天一个知识点不错过

每天一个知识点

JVM的内存分代你了解多少?

(一)JVM分代

堆内存是JAVA虚拟机所管理的内存最大的一块,Java堆被所有线程共享,几乎所有的对象实例都是在堆中分配内存,因此Java的堆是垃圾回收的主要区域。

JVM的内存分代讲的就是堆内存的分代,为了更加高效的回收垃圾,将内存划分为了多个generation(代)。

JVM堆可以划分为新生代、老年代、永久代(JDK1.7),在JDK1.8中,永久代被元空间(Metaspace)所代替,并且元空间已经不在堆中了。下面我们会讲两者的区别

(二)永久代和元数据的区别

永久代是HotSpot虚拟机特有的概念,并且在JDK1.8之后,永久代就彻底消失了。

永久代存储类信息、常量、静态变量、即时编译器编译后的代码等数据,并且永久代必须指定大小限制,因此就会导致性能问题和内存溢出的问题。永久代会给GC带来不必要的复杂性。

元空间的本质和永久代类似,但是元空间并不在堆中,而是直接使用了本地内存,元数据可以设置限制,也可以不设置,它的大小仅受本地内存限制。

(三)什么是新生代和老年代

新生代和老年代是垃圾回收最主要的区域,我们也主要来讲解这两个区域,看下图

在这里插入图片描述

新生代和老年代都在堆内存中,新生代和老年代所占的默认比例为1:2,其中一个新生代又由一个Eden区+两个survivor区组成,默认比例为8:1:1。至于为什么这么设置,就和所采用的垃圾回收算法有关。

首先讲一下新生代,YoungGC对应于新生代,第一次YGC只回收eden区域,回收后大多数(百分之九十八左右)的对象会被回收,活着的对象通过复制算法进入Survivor0(后续用S0和S1代替)。再次YGC后,eden+S0中活着的对象进入S1。再次YGC,eden+S1中活着的对象进入到S0。依次循环。看到这里我相信你已经明白了为什么要设置两个survivor区域了。

当一个对象的年龄(经历的YGC次数)足够时(传统的垃圾回收器一般是15,CMS垃圾回收器是6),进入老年代

如果遇到一个对象S区装不下,则直接进入老年代。

老年代的垃圾回收或称叫做FullGC,当老年代空间不足时,就会触发FullGC;另外,如果元空间区域的内存达到了所设定的阈值-XX:MetaspaceSize=,也会触发FullGC。

FullGC采用的是标记整理算法,这个算法的效率是比较低的,因为它要标记出或者的对象,然后移到内存的一侧,最后再清空区域外的内存。这个过程会十分消耗时间。

因此优化JVM最重要的一点就是优化FGC,尽可能的不要执行FGC。

已标记关键词 清除标记
课程简介: 历经半个多月的时间,Debug亲自撸的 “企业员工角色权限管平台” 终于完成了。正如字面意思,本课程讲解的是一个真正意义上的、企业级的项目实战,主要介绍了企业级应用系统中后端应用权限的管,其中主要涵盖了六大核心业务模块、十几张数据库表。 其中的核心业务模块主要包括用户模块、部门模块、岗位模块、角色模块、菜单模块和系统日志模块;与此同时,Debug还亲自撸了额外的附属模块,包括字典管模块、商品类模块以及考勤管模块等等,主要是为了更好地巩固相应的技术栈以及企业应用系统业务模块的开发流程! 核心技术栈列表: 值得介绍的是,本课程在技术栈层面涵盖了前端和后端的大部常用技术,包括Spring Boot、Spring MVC、Mybatis、Mybatis-Plus、Shiro(身份认证与资源授权跟会话等等)、Spring AOP、防止XSS攻击、防止SQL注入攻击、过滤器Filter、验证码Kaptcha、热部署插件Devtools、POI、Vue、LayUI、ElementUI、JQuery、HTML、Bootstrap、Freemarker、一键打包部署运行工具Wagon等等,如下图所示: 课程内容与收益: 总的来说,本课程是一门具有很强实践性质的“项目实战”课程,即“企业应用员工角色权限管平台”,主要介绍了当前企业级应用系统中员工、部门、岗位、角色、权限、菜单以及其他实体模块的管;其中,还重点讲解了如何基于Shiro的资源授权实现员工-角色-操作权限、员工-角色-数据权限的管;在课程的最后,还介绍了如何实现一键打包上传部署运行项目等等。如下图所示为本权限管平台的数据库设计图: 以下为项目整体的运行效果截图: 值得一提的是,在本课程中,Debug也向各位小伙伴介绍了如何在企业级应用系统业务模块的开发中,前端到后端再到数据库,最后再到服务器的上线部署运行等流程,如下图所示:
©️2020 CSDN 皮肤主题: 像素格子 设计师:CSDN官方博客 返回首页