JVM-JVM内存

字节码 三种类加载器 加载到 java内存中 对象new之后

JVM内存结构图

在这里插入图片描述
jvm是基于堆栈 new的对象都在堆 因为对象有生命周期周期较长,一个方法执行完了 栈和结构可能就不需要了 线程的栈可能更短

每一个线程都只能访问自己的线程栈
每一个线程都不能访问其他线程的局部变量
所有原生类的局部变量都存储在线程栈中,因此对其他线程是不可见的
线程可以将一个原生变量值的副本传给另一个线程,但是不能共享原生局部变量本身
堆内存中包含了java代码中创建的所有对象,不管是哪个线程创建的。其中也涵盖了包含类型

不管是创建一个对象并将其赋值给局部变量,还是将赋值给另一个对象的成员变量,创建的对象都会被保存到堆内存中。

在这里插入图片描述
总结:
堆 在一个jvm中有一个堆,没启动一个线程 就会有一个线程的栈,堆是所有对象共享的,包括里面的成员变量。
对象使时,是在栈上来引用对象,因为堆是共享,所有多个线程可以访问一个对象里的一个成员变量
两个线程同时访问,会发生错误,因为堆没有计算能力,所以是拿堆上的值到栈上去进行运行(要么直接压到栈上,要么放到本地局部变量表中)。

方法中使用的原生数据类型与对象引用地址在栈上存储;对象,成员变量与类定义,静态变量在堆上;
堆内存又叫做“共享堆”,堆中的所有对象,可以被所有线程访问,只要他们能拿到对象的引用地址。
如果一个线程可以访问某个对象的时候,也就可以访问该对象的成员变量
如果两个线程同时调用某个对象的同一方法,则它们都可以访问到这个成员变量,单每个线程的局部变量副本是独立的

JVM内存大体结构

在这里插入图片描述
栈 + 堆 + 非堆 + JVM自身 就是jvm用到的全部的内存
jvm最常见的参数 xmx xms xss
xmx :最大堆内存
xms :最小堆内存
xss :栈内存大小
https://blog.csdn.net/longgeqiaojie304/article/details/93972700

这里的最大最小只是 Heap堆的内存大小 即new出来对象存放的地方

不能直接将xmx和xms设置到最大 xmx4G 最后差不多5.2G-6G 设置最大会内存oom崩溃
4G xmx不超过百分之70

每启动一个线程,JVM就会加载栈空间分配对应的线程栈,如1MB的空间xss1m
线程栈也叫做java方法栈。如果使用JNI方法,则会分配一个单独的本地方法栈。

线程执行过程中,一般会有多个方法组成调用栈(Stack Trace)。比如A调用B B调用C 每执行一个方法,就会创建对应的栈帧
一个字节码 就是一个小的JVM程序 构建自己方法的栈 有自己的局部变量表

栈帧是一个逻辑上的概念,具体的大小在一个方法编写完成后基本就能确定。
比如返回值 需要有一个空间存放,每一个局部变量都需要对应的地址空间,除此之外,还有给指定使用的 操作数栈,以及class指针(标志这个栈帧对应的是那个类的方法,只想非堆中的class对象。)
在这里插入图片描述

JVM内存结构

在这里插入图片描述

堆内存是所有线程公用的内存空间
Heap分年轻代,老年代
新创建的对象在年轻代上 经过一段时间几轮GC没有淘汰的 进入到老年代
或者一个对象非常大 也会直接放到老年代上
绝大部分对象生命周期短,年轻代

年轻代3个内存池
新生代(dedn-space)和存活区,大部分GC算法中有两个存活区(S0,S1)
S0和S1总有一个是空的,但是一般较小。
当S0满的时候,将需要的保留,不需要的剔除,然后移动到S1(防止S0中的内存碎片),最后清空S0

非堆
Non-Heap 本质上还是Heap,只是一般不归GC管理,里面划分三个内存池。
metaspace 元数据区 包含 对象的结构 常量池 xmx xms管不到元数据区
codecache 存放JIT编译编译器编译后的本地机器代码

java的内存模型就是JMM

JVM启动参数
1系统属性参数
2运行模式参数
3堆内存设置参数
4GC设置参数
5分析跟段参数
6JavaAgent参数
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值