当前位置:网站首页>JVM学习----内存结构----程序计数器&虚拟机栈&本地方法栈&堆&方法区
JVM学习----内存结构----程序计数器&虚拟机栈&本地方法栈&堆&方法区
2022-07-26 20:04:00 【北海怪兽Monster】
JVM组成结构:
.class 字节码文件,被类加载器加载进内存。
类放在方法区,类创建的实例对象放在堆。对象调用方法时会涉及 虚拟机栈,程序计数器,本地方法栈。
解释器,即时编译器:方法执行时,每行代码由执行引擎中的解释器逐行执行,方法里的热点代码,就是频繁执行的代码,由即时编译器进行编译(可以理解为优化后执行)。
GC:GC模块,对堆里面不在引用的对象进行回收。
本地方法接口:一些不方便由java代码实现的功能,比如调用底层操作系统的功能,借助本地方法接口,来调用本地操作系统提供的一些方法。

内存结构
程序计数器(寄存器)
特点:
1. 线程私有。在多线程执行过程中,例如:线程1执行到 第九行代码,线程1的时间片结束,cpu执行线程2代码。那么线程1里面的程序计数器会将第十行代码的地址进行存储,每个线程都有一个程序计数器。只能线程内部进行访问。当cpu切换回线程1执行时,获取程序计数器的地址接着往下执行。
2. 程序计数器,唯一一个不会存在内存溢出的部分。
作用:加载下一条jvm指令的执行地址,物理上通过寄存器实现。
将java源代码编译为 二进制字节码,会将文件的首地址给解释器,同时将下一条 代码的地址加载进程序计数器。下一次解释器在进行代码执行时,就直接去程序计数器中获取地址。
虚拟机栈
先入后出
定义:
1. 每个线程运行时所需要的内存,称为虚拟机栈
2. 每个栈由多个栈帧组成,对应着每次方法调用时所占用的内存
3. 每个线程只能有一个活动栈帧(栈顶部的那个栈帧),对应着当前正在执行的那个方法。
问题:
垃圾回收是否涉及栈内存? ---- 不需要,在出栈的时候就被回收了。
栈内存分配越大越好嘛? ---- 运行代码时可以进行指定,Linux默认1024KB,Windows依赖系统设置的虚拟内存。
栈越大,只是能增强你递归调用次数,不会增加你程序运行效率,在内存固定情况下,栈过大还会影响堆内存,导致线程并发数减少。可以使用 参数 -Xss 1m 进行指定。一般采用默认即可。
在idea中进行设置
栈内存溢出
什么情况下栈内存溢出?
1. 线帧过多,例如:递归没有正确的返回。
2. 栈帧过大
线程运行诊断
案例1:cpu占用过多
Linux下,top命令,相当于打开我们windows系统的进程管理器
ps命令可以查看 线程对cpu的占用情况
H : 展示进程里面所有线程
- eo :打印指定内容 例如下面,打印 pid,tid,%cpu
ps H -eo pid,tid,%cpu 查看所有进程的线程信息
ps H -eo pid,tid,%cpu | grep 32655 对信息进行过滤,只看指定进程
使用jdk提供的工具对指定进程进行查看,查看每个线程的详细信息。
jstack 进程id
我们需要将 十进制的 线程id转换为 十六进制的线程id 32665 ----> 7f99
具体定位到线程------并且定位到具体代码行数。
案例2:程序运行很长一段时间没有响应
排查线程死锁问题
1、查看java程序 的进程运行情况
2、 使用 jstack 命令 进程运行情况。
jstack 32752
本地方法栈
本地方法使用的内存就叫本地方法栈!
什么是本地方法,就是一些不方便由java实现的系统级别方法,有c或者c++实现的方法。java去进行调用,这些方法运行使用的内存就叫本地方法栈。
典型的,Object对象的clone方法,这种native方法,都是没有实现的,都是去调c或者c++实现的。
堆
通过new关键字创建的对象都会使用堆
特点:
1、它是线程共享的,堆中的对象都需要考虑线程安全问题
2、有垃圾回收机制
堆内存溢出
代码演示溢出
分析:
list集合一直被使用,不会被回收,然后字符串在list集合中被引用,所以这些字符串也不会被回收。最后导致内存溢出。
可以通过参数 -Xmx4g 进行堆内存指定大小。如果使用idea工具,可以直接在VM options中进行参数指定
堆内存诊断
1、jps工具
查看当前系统中有哪些java进程
2、jmap工具
查看堆内存占用情况 jmap -heap 进程id
3、jconsole工具
图形界面,多功能的检测工具,可以连续监测
示例代码:
jconsole演示:
在idea控制台输入jconsole指令
然后会出现一个图形化工具,选择要查看的进程。
监控界面展示
案例
现象:堆内存垃圾回收之后,内存占用仍然很高。
另一款图形化工具:jvisualvm
界面展示:连接对应java进程
进入堆监控,抓取堆的当前快照。可以对其进行分析
截取信息
方法区
定义:所有java虚拟机线程共享的区域。存储和类结构相关的信息,例如:成员变量,方法数据,成员方法和构造器方法,特殊方法。
方法区在虚拟机启动时创建,逻辑上是堆的一个组成部分。不同的jvm厂商,不一定遵从。这个规范并不强制方法区位置。
例如:jdk1.8之前,方法区的实现是永久带,永久带就是占用堆内存的一部分控件。
jdk1.8之后,方法区的实现是元空间,元空间使用的本地内存(操作系统内存)。
方法区内存不足时,也会抛 OutOfMemoryError 内存溢出异常

方法区内存溢出
代码演示:
1.8以前会导致永久代内存溢出
1.8之后会导致元空间内存溢出
使用系统内存,并且没有上限。一般很难内存溢出。除非自己进行参数设置
–XX:MaxMetaspaceSize=8m
实际场景:
spring,mybatis框架使用cglib动态代理时会产生大量class字节码文件。字节码动态生成技术。
边栏推荐
- Confid+etcd to realize automatic discovery of high availability
- LCP 11. Statistics of expected number
- Face recognition and fingerprint recognition are weak? Pentagon develops long-distance heartbeat recognition
- BGP routing black hole and anti ring
- 7.25 simulation summary
- TableWidget
- Depthwiseseparableconvolution: depthwise convolution and pointwise convolution
- ST表、带权并查集
- Shell函数、系统函数、basename [string / pathname] [suffix] 可以理解为取路径里的文件名称 、dirname 文件绝对路径、自定义函数
- 详细图解b树及C语言实现
猜你喜欢
![[wechat applet] zero basics | applet syntax](/img/3d/fb999fde6f61af62337464ea8e32bd.png)
[wechat applet] zero basics | applet syntax

Basic configuration and aggregation of BGP

Marketing and sales document management and workflow solutions
![[JVM series] JVM tuning](/img/6b/f7c402b2ff5fc4f11f9656a7a59873.png)
[JVM series] JVM tuning

Easy gene | introduction to macrovirus sequencing technology

PointPillars: Fast Encoders for Object Detection from Point Clouds 阅读笔记

执行上下文与词法环境

传奇GEE引擎版本如何封挂?通过脚本+引擎封玩家账号教程

St table, weighted and search set
![Chapter 2: encounter obstacles! Bypass WAF filtering! [SQL injection attack]](/img/f8/e6991852547a370f4363a2b763e52e.png)
Chapter 2: encounter obstacles! Bypass WAF filtering! [SQL injection attack]
随机推荐
Solve the horizontal segmentation of iBGP and BGP routing principles
leetcode 链表类
QT driving school subject examination system -- from implementation to release
连接池快速入门
Keepalived高可用介绍与配置详解
confd+etcd实现高可用自动发现
Transaction rollback and record exception information at the same time
详解西部数据SMR叠瓦式硬盘的190二级编译器(译码表)模块
Correct the classpath of your application so that it contains compatible versions of the classes com
Chapter 2: encounter obstacles! Bypass WAF filtering! [SQL injection attack]
opencv dnn部署onnx模型
BTC和ETH不确定性增强 因加息逼近?美国经济将面临更多痛苦
[wechat applet] zero basics | applet syntax
Auto. JS rotation Icon
Build etcd distributed storage system +web management interface from scratch
Leetcode linked list problem -- 24. Exchange the nodes in the linked list in pairs (learn the linked list with one question and one article)
如何组装一个注册中心?
[pytoch foundation] torch.stack() function analysis
7.25 simulation summary
[基础服务] [数据库] ClickHouse的安装和配置