返回顶部
首页 > 资讯 > 精选 >JVM中内存分配策略是怎么样的
  • 128
分享到

JVM中内存分配策略是怎么样的

2023-06-02 23:06:28 128人浏览 安东尼
摘要

小编给大家分享一下JVM中内存分配策略是怎么样的,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!内存分配策略   了解GC其中很重要一点就是了解JVM的内

小编给大家分享一下JVM中内存分配策略是怎么样的,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

内存分配策略

 
JVM中内存分配策略是怎么样的

了解GC其中很重要一点就是了解JVM的内存分配策略:即对象在哪里分配和对象什么时候回收

Java技术体系中所提倡的自动内存管理可以归结于两个部分:给对象分配内存以及回收分配给对象的内存。 
我们都知道,Java对象分配,都是在Java堆上进行分配的,虽然存在JIT编译后被拆分为标量类型并简介地在栈上进行分配。如果采用分代算法,那么新生的对象是分配在新生代的Eden区上的。如果启动了本地线程分配缓冲,将按线程优先在TLAB上进行分配。 
事实上,Java的分配规则不是百分百固定的,其取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数的设置。 

简单来说,对象内存分配主要是在堆中分配。但是分配的规则并不是固定的,取决于使用的收集器组合以及JVM内存相关参数的设定。
下面Serial和Serial Old收集器做一个内存分配和回收的策略总结

1.对象优先在新生代Eden分配

首先,让我们来看一下新生代的内存分配情况: 
内存分配情况: 
将JVM内存划分为一块较大的Eden空间(80%)和两块小的Servivor(各占10%)。当回收时,将Eden和Survivor中还存活的对象一次性采用复制算法直接复制到另外一块Servivor空间上,最后清理到院Eden空间和原先的Survivor空间中的数据。 
大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,JVM将发起一次Minor GC。 
在这里先说明两个概念:

·         新生代GCMinor GC):指发生在新生代的垃圾收集动作,因为Java对象大多是具有朝生夕灭的特性,所以Minor GC非常频繁,而且该速度也比较快。

·         老年代GCMajor GC/Full GC):指发生在老年代的GC,出现了Major GC,一般可能也会伴随着一次Minor GC,但是与Minor GC不同的是,Major GC的速度慢十倍以上。

2.大对象直接进入老年代

我们先对所谓的大对象做一个定义:大对象,这里指的是需要大量连续内存空间的Java对象。最典型的大对象可以是很长的字符串数组。 
JVM对大对象的态度: 
大对象对于JVM的内存分配来说是十分麻烦的,如果我们将大对象分配在新生代中,那样子的话很容易导致内存还有不少空间时就提前触发垃圾收集以获取足够的连续空间来“安置”它们。、 
为了避免上述情况的经常发生而导致不需要的GC活动所浪费的资源和时间,可采用的分配策略是将大对象直接分配到老年代中去,虚拟机中也提供了-XX:PretenureSizeThreshold参数,令大于这个设置值的对象直接在老年代里面分配内容。

-XX:PretenureSizeThreshold只对Serial和ParNew收集器有效。

3.长期存活的对象将进入老年代

当JVM采用分代收集的思想来管理内存时,为了识别哪些对象应该放在新生代、哪些对象应该放在老年代,JVM给每个对象定义了一个对象年龄计数器。 
对象年龄计数器:如果对象在Eden出生并经过第一次Minor GC后仍然存活,并且能被Survivor容纳的话,便可以被移动到Survivor空间中,年龄计数器将设置该对象的年龄为1.对于对象在Survivor区每经过一次Minor GC,年龄便增加1岁,当它的年龄增加到一定程度(可通过参数-XX:MaxTenuringThreshold设置)默认15,该对象便会进入到老年代中。成为老年代的对象。

4.动态对象年龄判定

事实上,有的虚拟机并不永远地要求对象的年龄必须达到MaxTeruringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Surivior空间的一半,年龄大于或等于该年龄的对象就可以直接进行老年代,无须等到MaxTeruringThreshold中所要求的年龄。

5.空间分配担保

在发生Minor GC之前,虚拟机会先检查老年代中最大的可用的连续空间是否大于新生代中所有对象总空间,如果这个条件成立,那么Minor GC可以确保是安全的,如果不成立,则虚拟机会查看HandlePromotionFaiure设置值是否允许担保失败。如果允许,那么会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试进行一次Minor GC,尽管这次GC是有风险的;如果小于,或者HandlePromotionFaiure设置不允许冒险,那么这时就要改为进行一次Full GC。 
所谓冒险:也就是说当用来轮转的Survivor区无法承受新生代中所存活的对象内存时,需要老年代进行分配担保,把Survivor无法容纳的对象直接进入老年代中,前提是老年代中。

以上是“JVM中内存分配策略是怎么样的”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: JVM中内存分配策略是怎么样的

本文链接: https://lsjlt.com/news/231688.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JVM中内存分配策略是怎么样的
    小编给大家分享一下JVM中内存分配策略是怎么样的,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!内存分配策略   了解GC其中很重要一点就是了解JVM的内...
    99+
    2023-06-02
  • jvm内存分配的策略是什么
    JVM(Java虚拟机)内存分配的策略包括以下几个方面: 静态分配:JVM在启动时会根据预先设置的参数分配一块固定大小的内存给各...
    99+
    2024-02-29
    jvm
  • Java中有哪些内存分配策略
    本篇文章给大家分享的是有关Java中有哪些内存分配策略,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 Java内存分配简单的说Java把内存划分成两种:一种是栈内存,...
    99+
    2023-06-17
  • JVM中内存结构是怎么样的
    这篇文章主要介绍了JVM中内存结构是怎么样的,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。图为Java虚拟机运行时的数据区: 1.方法区 也称"永久代” 、“非堆...
    99+
    2023-06-02
  • JVM内存管理深入垃圾收集器与内存分配策略的示例分析
    这篇文章给大家介绍JVM内存管理深入垃圾收集器与内存分配策略的示例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出...
    99+
    2023-06-17
  • 优化你的 JavaScript 内存分配策略
    JavaScript 内存分配对于优化应用程序性能至关重要。有效的分配策略可以减少内存占用,提高性能并避免内存泄漏。 优化策略 1. 使用严格模式 严格模式会禁用某些行为,这些行为可能导致内存泄漏。例如,它会抛出错误,当一个变量被声明而不...
    99+
    2024-04-02
  • Java内存分配与回收策略
    本篇内容介绍了“Java内存分配与回收策略”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!内存分配与回收策略Minor GC 和 Full G...
    99+
    2023-06-02
  • java内存分配策略有哪些
    Java内存分配策略主要有以下几种: 静态分配:即在程序编译时,分配一块固定大小的内存空间给变量或对象,这块内存空间在整个程序的...
    99+
    2024-02-29
    java
  • 浅谈Tensorflow2对GPU内存的分配策略
    目录一、问题源起二、开发环境三、Tensorflow针对GPU内存的分配策略四、问题分析验证五、GPU分配策略分析六、扩展一、问题源起 从以下的异常堆栈可以看到是BLAS程序集初始化...
    99+
    2024-04-02
  • JVM中怎么解析JVM分代垃圾回收策略
    这篇文章将为大家详细讲解有关JVM中怎么解析JVM分代垃圾回收策略,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。由于不同对象的生命周期不一样,因此在JVM的垃圾回收策略中有分代这一策略。JV...
    99+
    2023-06-17
  • 分析Go语言中的内存分配与回收策略
    Go语言中的内存分配与回收策略主要由Go语言的垃圾回收器(GC)负责。以下是Go语言中的内存分配与回收策略的一些特点:1. 基于标记...
    99+
    2023-10-12
    Go语言
  • JVM内存的结构是怎样的
    这篇文章主要介绍“JVM内存的结构是怎样的”,在日常操作中,相信很多人在JVM内存的结构是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JVM内存的结构是怎样的”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-02
  • C++技术中的内存管理:如何优化内存分配策略?
    优化 c++++ 内存分配策略至关重要,包括选择合适的分配器(new/delete、std::allocator、第三方分配器)和分配策略(堆分配、栈分配、对象池、slab 分配器)。通...
    99+
    2024-05-07
    c++ 内存管理 作用域 标准库
  • JVM调优的几种策略分别是什么
    这期内容当中小编将会给大家带来有关JVM调优的几种策略分别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。JVM参数调优是一个很头痛的问题,可能和应用有关系,别人说可以的对自己不一定管用。下面是本人一...
    99+
    2023-06-17
  • Java虚拟机中JVM内存结构是怎么样的
    这篇文章给大家分享的是有关Java虚拟机中JVM内存结构是怎么样的的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、JVM启动流程:JVM启动时,是由java命令/javaw命令来启动的。二、JVM基本结构:JV...
    99+
    2023-06-02
  • Redis中过期策略是怎么样的
    这篇文章将为大家详细讲解有关Redis中过期策略是怎么样的,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。保存过期时间Redis可以为每个key设置过期时间,会将每个设置了...
    99+
    2024-04-02
  • Hibernate中抓取策略是怎么样的
    小编给大家分享一下Hibernate中抓取策略是怎么样的,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Hibernate抓取策略(fetching strateg...
    99+
    2023-06-17
  • JVM内存的组成及分配
    这篇文章主要介绍“JVM内存的组成及分配”,在日常操作中,相信很多人在JVM内存的组成及分配问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JVM内存的组成及分配”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-17
  • Java虚拟机中内存分配与回收策略的示例分析
    小编给大家分享一下Java虚拟机中内存分配与回收策略的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!内存分配与回收策略Java技术体系的自动内存管理,最根...
    99+
    2023-06-25
  • 深入了解java内存分配和回收策略
    一、导论java技术体系中所提到的内存自动化管理归根结底就是内存的分配与回收两个问题,之前已经和大家谈过java回收的相关知识,今天来和大家聊聊java对象的在内存中的分配。通俗的讲,对象的内存分配就是在堆上的分配,对象主要分配在新生代的E...
    99+
    2023-05-31
    java 内存分配 回收策略
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作