初探JVM内存模型

JVM

在这里插入图片描述

JVM虚拟机一共有三大板块组成,类加载子系统、字节码执行引擎、JVM运行时数据区。本次主要说明JVM运行时数据区,也就是平时说的JVM内存模型

JVM内存模型

图中看出内存模型一共分为5大块,堆、方法区、栈、本地方法栈、程序计数器。他们被划分为一块一块的内存区域

JMV内存分配参数

-Xmn3072M 代表堆初始化内存3个G。不设置话默认是物理内存的1/64
-Xms3072M 代表堆最大内存为3个G。不设置话默认是物理内存的1/4
-Xss512K 代表每个线程栈的最大使用内存
-XX:MaxMetaSpaceSize=256M 代表方法区最大内存为256MB
-XX:MetaSpaceSize=256M 代表方法区触发FULLGC的阈值,不设置话默认是21MB,达到该阈值后就会触发FULLGC,触发之后JVM会调整
该值,如果释放的空间多则会降低阈值,释放的少则会判断-XX:MaxMetaSpaceSize的值(-1情况下不判断),然后适当提高阈值。
-XX:+DisableExplicitGC 启动加上这个参数,程序中执行System.gc()就无效果,避免有人乱搞。 建议启用

平时我们程序运行时产生的对象, 比如 new User() 这个对象实际就放在我们的堆中。堆中分配两大块一块年轻代用于存放我们新产生的对象。
一块老年代。用于存放我们长久使用的对象。具体各个区域的情况,请参考下一章,垃圾收集器与调优。**默认情况下**老年代占整个堆的三分之
二。年轻代占3分之一。年轻代中eden与s区域比例 8:1:1。

堆内存分配图

年轻代
eden 区
程序运行时产生的对象首先放到这里面,当eden区存放满了之后会执行minor gc也叫young gc 会回收eden区域所有垃圾对象。当回收完毕后
还存活的对象,则会放入s0区域(首次)
s0 s1 (Survivor区域 也叫存活区)
当eden进行垃圾回收时存活的对象会放在s0或者s1中。具体存放在哪儿取决于垃圾回收区域,如果这次垃圾回收收的s0则会放s1反之则放s0,
每次回收后还存活的数据则该数据的分代年龄会+1。
老年代
储存长久存活的对象。如s区域中进行gc时,分代年龄达到15的会挪到老年代中存放。或者当年轻代做gc时eden挪到s区域的对象大小大于s0或者
s1区域大小的50%,这种则会被直接挪到老年代。

方法区

储存我们程序中的常量、静态变量、类信息。存的这些信息其实是指向我们堆里面具体对象内存地址

本地方法栈

这个方法栈我们基本不会用到,是属于jdk自身带有native关键字的方法调用时锁产生的对象就会放到这个内存区域内
本地方法
比如我们要启动一个线程 thread.start()。实际上这个是我们java去调用jdk的Thread.java类中 start0() 方法,然后start0()方法是
通过jvm的c++源码程序调用服务器的cpu才开始一个线程;而start0();这种带有native关键字的方法就被称为本地方法。
private native void start0();

在这里插入图片描述

程序计数器

记录我们每个线程线程执行到某一行代码的内存地址。

每个线程运行的时候都需要一定内存,所以每个线程运行的时候JVM会给它分配一个独有的栈内存空间,放在这个栈中。存放线程中的局部变量。
每个线程不光能分配独立的栈内存空间,也能分配到一个独有的本地方法栈和程序计数器。有一个线程就会有它独有的栈、本地方法栈、程序计
数器。

在这里插入图片描述

栈帧
在线程的栈内存空间中,该线程每调用一个方法就会产生一个栈帧内存空间。每个栈帧里面会有上图所示的元素。
局部变量表
存放当前方法的局部变量
操作数栈(FILO)
用于当前方法数据计算的临时储存区,操作数栈中计算的数据通常来自于我们JVM的方法区。它一般通过弹栈/压栈来进行方法,操作数栈的具体
的指令可以通过将java类编译成可读性较高的字节码文件后对方法的指令进行解析。javap -c XXX.class > xxx.txt 可以将编译后的内容
放到指定txt文件中。 至于其中的具体指令去百度查一下JVM指令手册。
动态链接
将方法中的符号引用转变成直接引用。比如:方法中 main方法中 有一行代码 test.test();。刚解析main方法的时候并不会解析test的
test()方法。只会把test()方法当成一个符号(也叫符号引用)。当真正要执行它的时候才会解析test()方法。将test()符号解析成具体
test()方法的内存地址(变成直接引用)。这就是动态链接
方法出口
参考上图。方法1调用方法2的时候。方法2的方法出口存放的就是当自己执行完毕之后会回到哪个方法中,方法中的什么位置。方法出口里面就储存这些。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JVM(Java虚拟机)模型是指Java程序在运行时的执行环境,包括JVM的组成部分和它们的工作原理。JVM内存模型是指Java虚拟机管理程序运行时内存的方式,包括内存划分、内存分配和对象回收等机制。 JVM模型的组成部分包括类加载器、解释器、即时编译器、垃圾收集器等。类加载器负责将Java类加载到JVM中,并将其转换为可执行代码;解释器负责解释字节码并执行相应的指令;即时编译器则将频繁执行的代码编译成本地机器码,以提高程序的执行效率;垃圾收集器则负责回收程序运行时不再使用的内存。 JVM内存模型规定了Java程序运行时内存的分配和管理方式。JVM内存模型将内存划分为不同的区域,包括方法区、堆、虚拟机栈、本地方法栈和程序计数器。其中,堆是Java程序运行时内存中最大的区域,用于存储对象实例。虚拟机栈和本地方法栈则用于存储程序执行时的局部变量和方法调用信息。方法区用于存储已加载的类信息、常量池、静态变量等数据。程序计数器则用于记录当前线程所执行的字节码指令位置。 JVM内存模型还包括垃圾回收机制,用于自动回收程序运行时不再使用的内存。垃圾回收机制采用标记-清除、复制、标记-整理等不同的算法来回收内存。 总之,JVM模型和JVM内存模型是Java程序运行时的重要组成部分,了解和掌握它们的工作原理对于编写高效、稳定的Java程序至关重要。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值