当前位置:首页 > Java技术 > JVM内存模型

JVM内存模型

2022年09月16日 08:38:00Java技术4

 

下图说明JVM内存模型和JVM参数的关系:

JVM内存模型和启动参数的关系

JAVA堆的描述如下:

 JVM内存模型 _ JavaClub全栈架构师技术笔记

   内存由Perm和Heap组成。其中Heap = {Old + NEW = { Eden , from, to } }

  JVM内存模型中分两大块:

  NEW Generation:程序新创建的对象都是从新生代分配内存,新生代由Eden Space和两块相同大小的Survivor Space(通常又称S0和S1或From和To)构成,可通过-Xmn参数来指定新生代的大小,也可以通过-XX:SurvivorRation来调整Eden Space及Survivor Space的大小。垃圾回收一般用Copying的算法,速度快。每次GC的时候,存活下来的对象首先由Eden拷贝到某个Survivor Space, 当Survivor Space空间满了后, 剩下的live对象就被直接拷贝到Old Generation中去。因此,每次GC后,Eden内存块会被清空

  Old Generation:用于存放经过多次新生代GC任然存活的对象和应用程序中生命周期长的内存对象,例如缓存对象,新建的对象也有可能直接进入老年代,主要有两种情况:①大对象,可通过启动参数设置-XX:PretenureSizeThreshold=1024(单位为字节,默认为0)来代表超过多大时就不在新生代分配,而是直接在老年代分配。②大的数组对象,切数组中无引用外部对象。老年代所占的内存大小为-Xmx对应的值减去-Xmn对应的值。在Old Generation块中,垃圾回收一般用mark-compact的算法,速度慢些,但减少内存要求。

  PS:还有个Permanent Generation,主要用来放JVM自己的反射对象,比如类对象和方法对象等。

   

  垃圾回收描述:

  现在收集器都是采用分代收集算法,堆被划分为新生代和老年代。新生代主要存储新创建的对象和尚未进入老年代的对象。老年代存储经过多次新生代GC(Minor GC)任然存活的对象。

  Minor GC:即新生代GC,指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。垃圾回收分多级是1级或以上为部分垃圾回收,只会回收NEW中的垃圾。

  Major GC  / Full GC:老年代GC,指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC(但非绝对的,在 ParallelScavenge 收集器的收集策略里就有直接进行 Major GC的策略选择过程) 。MajorGC 的速度一般会比Minor GC慢10倍以上。垃圾回收分多级是0级为全部(Full)的垃圾回收,会回收OLD段中的垃圾。

  PS:内存溢出通常发生于OLD段或Perm段垃圾回收后,Eden区仍然无内存空间容纳新的Java对象的情况。

  当一个URL被访问时,内存申请过程如下:

  A. JVM会试图为相关Java对象在Eden中初始化一块内存区域

  B. 当Eden空间足够时,内存申请结束。否则到下一步

  C. JVM试图释放在Eden中所有不活跃的对象(这属于1或更高级的垃圾回收), 释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区

  D. Survivor区被用来作为Eden及OLD的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区

  E. 当OLD区空间不够时,JVM会在OLD区进行完全的垃圾收集(0级

  F. 完全垃圾收集后,若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现”out of memory错误”

  为什么一些程序频繁发生GC?有如下原因:

  (1)程序内调用了System.gc()或Runtime.gc()。

   (2)一些中间件软件调用自己的GC方法,此时需要设置参数禁止这些GC。

  (3)Java的Heap太小,一般默认的Heap值都很小。

  (4)频繁实例化对象,Release对象。此时尽量保存并重用对象,例如使用StringBuffer()和String()。

  如果你发现每次GC后,Heap的剩余空间会是总空间的50%,这表示你的Heap处于健康状态。许多Server端的Java程序每次GC后最好能有65%的剩余空间。

 

  JVM 使用的GC算法是什么?

  分代收集。即将内存分为几个区域,将不同生命周期的对象放在不同区域里;

  在GC收集的时候,频繁收集生命周期短的区域(Young area);

  比较少的收集生命周期比较长的区域(Old area);

  基本不收集的永久区(Perm area)。

 

  GC何时会被触发?
  (1)系统空闲:GC线程的优先级低于系统应用线程,当系统中没有应用线程执行时,GC会被触发。
  (2)堆空间内存不足:当堆空间的内存不足以创建新对象时,GC会被触发。如果第一GC仍不能获得足够的空间,第二次GC将被触发,如果这一次仍无法获取足够的空间,“Out of memory”将被抛出。

作者:linghu_java
来源链接:https://www.cnblogs.com/linghu-java/p/5725066.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/41685.html

分享给朋友:

“JVM内存模型” 的相关文章

Java虚拟机16:Metaspace

Java虚拟机16:Metaspace

被废弃的持久代 想起之前面试的时候有面试官问起过我一个问题:Java 8为什么要废弃持久代即Metaspace的作用。由于当时使用的Java 7且研究重心不在JVM上,一下没有回答上来,今天突然想起这个问题,就详细总结一下这个问题。 首先我们看一张JVM内存布局的图:...

浅谈JVM内存模型

浅谈JVM内存模型

JAVA虚拟机在执行JAVA程序的时候,会把它管理的内存分成若干不同的数据区域,每个区域都有各自的用途。目前大致把JVM内存模型划分为五个区域:程序计数器,虚拟机栈,本地方法栈,堆和方法区。   程序计数器 程序计数器(ProgramCounterR...

JVM——JVM大厂面试问题与解答

JVM——JVM大厂面试问题与解答

摘要 本博文主要分享在JVM中的大厂面试问题。总结相关面试问题与yu解答。帮助大家更好的学习与理解JVM的原理。同时也是分享一些有关于JVM实战的经验,帮助大家在工作中排查错误。 一、JVM的内存模型 1.1 JVM1.8内存模型 1.2 JVM内存模型中...

jvm性能调优实战 - 31从测试到上线

jvm性能调优实战 - 31从测试到上线

文章目录 Pre 开发好系统之后的预估性优化 系统压测时的JVM优化 对线上系统进行JVM监控 Pre 前面两篇文章,已经给大家介绍...

JVM 算法简介

JVM 算法简介

JVM学习目录 1.JVM 概念简介 2.JVM 运行时内存 3.JVM算法简介 4.JVM 垃圾收集器 5.JVM 调优实战 通过以上的文章我们对JVM有了初步的认识,在前几篇文章中也说过一些算法知识点,今天这篇文章我们进行算法的分享 一、...

jvisualVm监控远程的jvm

jvisualVm监控远程的jvm

jvisualVm是Netbeans的profile子项目,已在JDK6.0 update 7 中自带(java启动时不需要特定参数,监控工具在bin/jvisualvm.exe),能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的...

JVM 内存模型

JVM 内存模型

Java 的内存模型JMM(Java Memory Model) JMM主要是为了规定了线程和内存之间的一些关系。根据JMM的设计,系统存在一个主内存(Main Memory),Java中所有实例变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Workin...

jvm 01-java内存模型

jvm 01-java内存模型

java程序执行流程 所有的java程序代码必须保存在*.java的文件之中(源代码) 然后使用javac.exe命令将其编译为*.class文件 最后利用java.exe命令在JVM进程之中解释此程序 当JVM将所需要的*....

JVM-内存模型

JVM-内存模型

线程栈空间 包括程序计数器、虚拟机栈和本地方法栈 程序计数器 程序计数器是一块很小的内存空间,主要用来记录各个线程执行的字节码的地址,例如,分支、循环、跳转、异常、线程恢复等都依赖于计数器。由于 Java 是多线程语言,当执行的线程数量超过 CPU 核数时,线程之间会...

JVM-内存模型与回收算法剖析

JVM-内存模型与回收算法剖析

JVM内存模型 思考:JVM为什么有1个Eden区和2个Survivor区。 程序计数器 产生:由于CPU时间片轮转机制,众多线程在并发执行过程中,任何一个确定的时刻,一个处理器...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。