JVM内存模型和结构

JVM简介:JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接的交互。

JVM内存模型结构图:::

1.JVM内存模型和结构

(1)JVM内存模型如下:::

Young(年轻代)= New

Tenured(老年代)= Old

Perm(永久代) = Perm

Young(年轻代)可以分为Eden区和两个Survivor区(from和to,这两个Survivor区大小严格一致),新的对象实例总是首先放在Eden区,Survivor区作为Eden区和Tenure(终生代)的缓冲,可以向Tenure(终生代)转移活动的对象实例。

Tenure(终生代)中存放生命周期长久的实例对象,但并不是如它的名字那样是终生的,里面的对象照样会被回收掉。

Young和Tenure共同组成了堆内存(默认新生代与老年代的空间大小为1:2)。

Perm(永久代)则是非堆内存的组成部分。主要存放加载的Class类级对象如class本身,method,field等等

JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。

在JVM启动时,就已经保留了固定的内存空间给Heap内存,这部分内存并不一定都会被JVM使用,但是可以确定的是这部分保留的内存不会被其他进程使用。这部分内存大小由 -Xmx参数指定。而另一部分内存在JVM启动时就分配给JVM,作为JVM的初始Heap内存使用。影响这个的参数是-Xms,如果-Xms指定的值比-Xmx的小,那么两者的差值就是Virtual内存值。随着程序的运行,Eden区、 Tenured区和Perm区会逐渐使用保留的Virtual空间。堆内存默认值最大不会超过1G。

绝大部分对象在Eden区生成,当Eden区装填满的时候,会触发Young GC。垃圾回收的时候,在Eden区实现清除策略,没有被引用的对象则直接回收,依然存活的对象会被移送到Survivor区。Survivor 区分为S0和S1两块内存空间,送到哪块空间呢每次Young GC的时候,将存活的对象复制到未使用的那块空间,然后将当前正在使用的空间完全清除,交换两块空间的使用状态。如果Young GC要移送的对象大于Survivor区容量上限,则直接移交给老年代。每个对象都有一个计数器,每次YGC都会加1。参数能配置计数器能控制移交次数,默认值是15,意思就是在Survivor 区交换14次之后,晋升至老年代。Survivor 区处理超过上限,老年代也承受时,则会触发Full Garbage Collection(Full GC);如果依然无法放下,则抛OutOfMemoryError,堆出现OOM的概率是所有内存耗尽异常中最高的。所以给JVM设置运行参数-XX:+HeapDumpOnOutOfMemoryError,让JVM遇到OOM异常时能输出堆内信息。

整个Java虚拟机只有一个堆,所有的线程都访问同一个堆。它是被所有线程共享的一块内存区域,在虚拟机启动时创建,而程序计数器、Java虚拟机栈、本地方法栈都是一个线程对应一个。堆是垃圾回收的主要区域,所以也被称为GC堆,堆的大小既可以固定也可以扩展,但主流的虚拟机堆的大小是可扩展的(通过-Xmx和-Xms控制),因此当线程请求分配内存,但堆已满,且内存已满无法再扩展时,就抛出OutOfMemoryError。

所以开发工具(IDEA、Eclipse等)一般安装完去修改内存,去提升性能。

-Xms是设置java虚拟机的最小分配内存;-Xmx则是最大分配内存;512m为内存空间

一般-Xmx设置为你电脑物理内存的1/4,而把-Xms和 -Xmx设置为一样,

一般用到最多的就是-Xms512m -Xmx512m

内存参数如图:

  • -Xms设置堆的最小空间大小。
  • -Xmx设置堆的最大空间大小。
  • -XX:NewSize设置新生代最小空间大小。
  • -XX:MaxNewSize设置新生代最大空间大小。
  • -XX:PermSize设置永久代最小空间大小。
  • -XX:MaxPermSize设置永久代最大空间大小。
  • -Xss设置每个线程的堆栈大小

(2)JVM内存结构包含:堆、栈、方法区

堆:Heap堆是OutOfMemoryError(内存用完了:原因-内存泄漏或内存溢出)故障最主要的发源地,它存储着几乎所有的实例对象,堆由垃圾收集器自动回收,堆区由各子线程共享使用。通常情况下,它占用的空间是所有内存区域中最大的,但如果无节制地创建大量对象,也容易消耗完所有的空间。堆的内存空间既可以固定大小,也可运行时动态地调整,通过如下参数设定初始值和最大值,比如-Xms512M. -Xmx512M。

堆分成两大块:新生代和老年代
对象产生之初在新生代,步入暮年时进入老年代,但是老年代也接纳在新生代无法容纳的超大对象

JVM运行机制图:

JDK1.6之前,eclipse对于sun公司的标识能够识别出来,会自动添加对于JVM老年代的容量大小限制: -XX: MaxPermSize=256M; 因为,其他的虚拟机没有hotspot的永久代的概念。 而JDK1.6的时候,sun已经被Oracle收购,替换了jdk中sun的标识,所以,eclipse无法识别出此虚拟机是hotspot的JVM。所以,不会自动给HotSpot设置永久代的内存容量大小。 JVM容易出现持久代一直增长,而导致内存的溢出。

先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值