了解JVM运行时的内存分配

前言

上文中,在介绍运行时数据区域中的 JAVA 堆时,提到了 JVM 中的堆,一般分为三大部分:新生代、老年代、永久代,本文将进一步了解运行时的内存分配情况。

正文

1.新生代
主要用来存放新生(new)的对象。一般占据堆的 1/3 空间。由于频繁创建对象,所以新生代会频繁的触发 MinorGC 进行垃圾回收。

新生代又分为 Eden(伊甸园)、SurvivorFrom、SurvivorTo三个区。

  • Eden区:Java新对象的出生地(如果新创建的对象占用内存很大,则直接分配到老年代)。
  • SurvivorTo:保留了一次MinorGC过程中的幸存者。
  • SurvivorFrom:上一次GC的幸存者,作为这一次GC的被扫描者。

当Eden区内存不够的时候就会触发MinorGC,对新生代区进行一次垃圾回收,当触发GC后,JVM会将Eden和其中一个Survivor的对象全部复制到另外一个Survivor中(例如从from 到 to),即采用的复制算法(垃圾回收算法中的一种),在复制过程中,如果对象达到了老生代的要求就会被复制到老生代,复制到Servivor的每个对象的年龄加一,然后清空Eden和之前的Servivor区域。从这里就可以看出在任意时刻一定会存在一个Survivor区域处于空闲状态。

2.老年代:
主要存放应用程序中生命周期长的内存对象。老年代的对象比较稳定,所以MajorGC不会频繁执行。

在进行MajorGC前一般都先进行了一次MinorGC,使得有新生代的对象晋身入老年代,导致空间不够用时才触发。当无法找到足够大的连续空间分配给新创建的较大对象时也会提前触发一次MajorGC进行垃圾回收腾出空间。

MajorGC采用标记—清除算法(垃圾回收算法中的一种):首先扫描一次所有老年代,标记出存活的对象,然后回收没有标记的对象。MajorGC的耗时比较长,因为要扫描再回收。MajorGC会产生内存碎片,为了减少内存损耗,我们一般需要进行合并或者标记出来方便下次直接分配。

当老年代也满了装不下的时候,就会抛出OOM(Out of Memory)异常。

3.永久代
在Java8中,永久代已经被移除,被一个称为“元数据区”(元空间)的区域所取代。元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制。类的元数据放入 Native memory, 字符串池和类的静态变量放入Java堆中. 这样可以加载多少类的元数据就不再由MaxPermSize控制, 而由系统的实际可用空间来控制.

总结

前边巴拉巴拉讲了一堆,终于到了总结部分,首先我们了解到堆内存主要分为三部分:新生代、老年代、永久代。

  • 新生代存放新生对象,又被分为 Eden 区、2块 Survivor 区,频繁发生MinorGC,采用的是 复制算法。
  • Minor GC 每次收集后, Eden 区和1块 Survivor 区都被清空;
  • 老年代存放 MinorGC 存留下来的对象,发生MajorGC,采用的是 标记-清除算法。
  • 永久代在java8中被元空间所替代,划分到本地内存,不再使用 JVM 内存,受本地内存限制。

上边提到的垃圾回收算法有,复制算法、标记-清除算法,未提到的还有 标记-整理算法、分代收集算法(下一篇讲解算法部分),当前商业虚拟机(如HotSpot)的垃圾收集都采用 分代收集算法,接下来将以 分代收集算法 描述对象的从创建到 GC 的过程。

1、一个人(对象)出来(new 出来)后会在Eden Space(伊甸园)无忧无虑的生活,直到GC到来打破了他们平静的生活。GC会逐一问清楚每个对象的情况,有没有钱(此对象的引用)啊,因为GC想赚钱呀,有钱的才可以敲诈嘛。然后富人就会进入Survivor Space(幸存者区),穷人的就直接kill掉。

2、并不是进入Survivor Space(幸存者区)后就保证人身是安全的,但至少可以活段时间。GC会定期(可以自定义)会对这些人进行敲诈,亿万富翁每次都给钱,GC很满意,就让其进入了Genured Gen(养老区)。万元户经不住几次敲诈就没钱了,GC看没有啥价值啦,就直接kill掉了。

3、进入到养老区的人基本就可以保证人身安全啦,但是亿万富豪有的也会挥霍成穷光蛋,只要钱没了,GC还是kill掉。

分区的目的:新生区由于对象产生的比较多并且大都是朝生夕灭的,所以直接采用标记-清理算法。而养老区生命力很强,则采用复制算法,针对不同情况使用不同算法。

描述参考:https://lhc1986.iteye.com/blog/1421832

如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:niceyoo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#:继承过程中的静态成员

在知乎上看到一个关于“泛基“的实现&#xff0c;感觉挺有意思&#xff0c;想试试效果&#xff0c;代码如下&#xff1a; public abstract class MyBase<T> where T : MyBase<T>{public static string DataForThisType { get; set; }public static T Instance { ge…

Android 分享功能大全

实现效果&#xff1a; 实现步骤&#xff1a; 1、配置SDK 2、 配置平台SDK demo云盘链接&#xff1a;https://pan.baidu.com/s/1DRr85PKtVpuexfyCc2jwsg 在线交流密码&#xff1a;QQ1085220040 demo链接&#xff1a;https://download.csdn.net/download/meixi_android/112506…

fiddler手机端抓包配置

首先&#xff0c;你得安装fiddler&#xff0c;这是前提条件&#xff0c;手机抓包有必须条件&#xff1a; 需要保持电脑和手机在同一个局域网中 &#xff08;这一点&#xff0c;我一般会在电脑上启动一个wifi&#xff0c;然后手机连接即可&#xff09; 下面说一下如何配置&#…

垃圾回收与算法

前边讲到 JVM 运行时内存的地方&#xff0c;关于新生代、老年代中 GC 垃圾回收以及垃圾回收算法&#xff0c;不知是否有点懵懵的&#xff0c;这篇一起了解一下垃圾回收以及垃圾回收算法。 一、垃圾回收需要完成的三件事 哪些内存需要回收&#xff1f;——垃圾对象&#xff08;如…

Android 起调手机QQ,联系客服

1、起调QQ聊天 public void toQQ(){// 跳转之前&#xff0c;可以先判断手机是否安装QQif (isQQClientAvailable(this)) {// 跳转到客服的QQString url "mqqwpa://im/chat?chat_typewpa&uin200870769";Intent intent2 new Intent(Intent.ACTION_VIEW, Uri.p…

jeecg中excel导出字段判空处理

jeecg中excel导出字段判空处理 我们清楚&#xff0c;jeecg 导出 excel 采用的是 easypoi&#xff0c;不知道是否遇到过这种情况&#xff1a; 我们以一个实体属性为例&#xff1a; Excel(name"问题分类",dicCode"xx")private java.lang.String mwoQuestion…

Android LinearLayout加载Fragment

为LinearLayout添加Fragment效果 1、创建Fragment public class Fragment1 extends Fragment {public static Fragment1 getInstance(Bundle bundle) {Fragment1 fg new Fragment1();fg.setArguments(bundle);return fg;}protected View contentView;Overridepublic View onC…

工作247:uniapp--实战--flex布局--商户星级

<template><view ><view v-for"(item,index) in 5"><view style"display: flex;padding: 24rpx 0 0 30rpx;"><text style"font-size: 30rpx;color: #333333;">001-祝菲</text><text style"margin-…

微信小程序开发实战基础一、页面跳转,底部导航栏,分享,加载图片标签,列表

1、页面跳转 wx.navigateTo({ url: "../four/four" })——可返回 wx.redirectTo({ url: "../four/four" })——不可返回 <view> <navigator url"../four/four" hover-class"changestyle">页面跳转&#xff0c;可以返回…

Java面向对象---重写(Override)与重载(Overload)

一、重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变&#xff0c;核心重写&#xff01; 重写的好处在于子类可以根据需要&#xff0c;定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。 重写方法…

Java集合List、Set、Map

集合是 java 基础中非常重要的一部分&#xff0c;同样也是 Java 面试中很重要的一个知识点。所以&#xff0c;给王小整理了这篇关于集合的文章。 1、接口继承关系以及实现 集合类存放于 Java.util 包中&#xff0c;主要有 3 种&#xff1a;set、list 和 map。 Collection&…

SpringBoot项目修改html后不即时编译

SpringBoot项目修改html后不即时编译 springboot templates 下的 html 修改后无法达到即时编译的效果&#xff0c;搜索资料后记录笔记。原文地址&#xff1a;https://www.cnblogs.com/jiangbei/p/8439394.html 1、pom中引入依赖 <dependency> <groupId>org.spr…

工作250:uniapp--实战--flex布局--星级评分

<template><view ><view v-for"(item,index) in 5"><view style"display: flex;padding: 24rpx 0 0 30rpx;"><text style"font-size: 30rpx;color: #333333;">001-祝菲</text><text style"margin-…

Java异常分类及处理

一、概念 如果某个方法不能按照正常的途径完成任务&#xff0c;就可以通过另一种路径退出方法。在这种情况下 会抛出一个封装了错误信息的对象。此时&#xff0c;这个方法会立刻退出同时不返回任何值。另外&#xff0c;调用 这个方法的其他代码也无法继续执行&#xff0c;异常…

工作252:uniapp--实战--uview---tabber

第一步 <u-tabbar v-model"current" :list"list" :current"current" :mid-button"true" change"change"></u-tabbar> 第二步 export default {data() {return {list: [{iconPath: "home",selectedI…

Java反射机制概念及应用场景

Java反射机制概念及应用场景 Java的反射机制相信大家在平时的业务开发过程中应该很少使用到&#xff0c;但是在一些基础框架的搭建上应用非常广泛&#xff0c;今天简单的总结学习一下。 1. 什么是反射机制&#xff1f; Java反射机制是在运行状态中&#xff0c;对于任意一个类&…