JVM 内存模型

JVM 内存模型

JDK体系结构

在这里插入图片描述

Java语言的跨平台特性

在这里插入图片描述

JVM内存结构以及内存模型

在这里插入图片描述
**1.类加载子系统:**jvm加载class文件的加载器;
**2.字节码引擎:**负责将class文件编译成字节码文件;
3.运行时数据区:
**3.1.堆:**new出来的对象,栈中存放的是对象的内存地址,根据这个内存地址找到方法区(元空间)中的类信息;
**3.2.(线程)栈:**不同的线程拥有自己的线程栈,会给每个方法分配一个专属的内存"栈帧",保存数据;
**3.2.1 局部变量:**保存方法内的局部变量;
**3.2.2 动态链接:**程序运行过程中把符号引用转换成对应内存的直接引用地址;
**3.2.3 操作数栈:**存放需要操作的数据的临时空间,例如将 int 值 进行操作 1+2,计算完后替换旧值;
**3.2.4 方法出口:**指代码执行完之后,需要返回到哪一行位置;
**3.3 方法区(JDK1.8 或以上版本):**存放静态变量、类信息、运行时常量池;
**3.4 本地方法栈:**native修饰的方法,与其他语言交互的接口;
**3.5 程序计数器:**代码运行的位置标记,JVM根据这些数字标记依次执行代码,没执行一行代码,字节码执行引擎就会动态修改程序计数器的值;

堆分成 年轻代,老年代。年轻代又分为Eden区,Survivor0,Survivor1。
长期存活的对象,如静态变量的类,spring中的bean的类会从 年轻代移动到老年代。
Minor GC 和 Full GC 都会触发 STW ,但是Minor GC 的时间非常短,用户几乎无感知,而FullGC的时间就稍微很长。

STW机制:垃圾回收器 通过GC Roots 寻找可回收的对象时,如果当前对象A处于可回收状态,如果不停止所有用线程,那么就可能出现其他线程再次引用对象A,但是 垃圾回收器不知道对象A又被再次引用,然后将对象A进行回收了,那么就会造成引用链断裂,出现问题。为了防止出现类似问题,JVM会将所有用户线程停止。

JVM内存参数

在这里插入图片描述
**Xms:**对空间;
**Xmx:**堆最大空间;
**Xmn:**年轻代;
**Xss:**栈空间
**注意:**如果元空间内存使用达到21M(默认21M) ,也会触发FullGC,FullGC不仅会回收堆,也会回收元空间的内存空间;

SpringBoot程序设置JVM参数方式:

java ‐Xms2048MXmx2048MXmn1024MXss512KXX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐jar microservice‐eureka‐server.jar

-XX:MetaspaceSize=N : 设置元空间最大值,默认值-1(不限制或者是受限于本地内存大小);
-XX:MetaspaceSize=N : 指定元空间触发Fullgc的初始阈值(元空间无固定初始大小), 以字节为单位,默认是21M,达到该值就会触发full gc进行垃圾回收, 同时收集器会对该值进行调整: 如果释放了大量的空间, 就适当降低该值。如果释放了很少的空间, 那么在不超过 MetaspaceSize 参数值时,可以适当提高这个参数值。

-Xss 参数越小,一个线程栈中分配的栈帧越小,但是能开启的线程数就越多。因为元空间,和栈都是直接使用操作系统的直接内存,栈内存越小,能开启的线程越多。

**JVM优化原则:**尽量让对象在年轻代里进行分配回收,减少对象频繁进入老年代,降级full gc的次数。同时,给系统分配足够的内存空间,也减少年轻代频繁进行垃圾回收。

直接内存

Java中的直接内存,也称为堆外内存。直接内存,是Java应用程序直接对系统中的内存进行操作。与 堆、栈、方法区的内存空间不同,这些内存空间都是虚拟化的。

直接内存的操作方式

1.Java的 Unsafe类,通过Unsafe堆本地内存进行操作;
2.Netty 的直接内存(Direct Memory),底层调用系统的malloc函数;
3.JNI 或 JNA 程序,直接操作本地内存;
3.1 JNI:Java Native Interface ,通过使用Java本地接口书写程序,可以确保代码在不同的平台上移植;
3.2 JNA:Java Native Access ,提供一组Java 工具类 用于在运行时动态访问系统本地库。开发者只需要在Java接口中描述目标的 native library 函数与结构,JNA就将自动实现Java接口到native function的映射。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值