JVM 2015/3/15

ops/2025/3/16 14:51:59/

定义:Java Virtual Machine -java程序的运行环境(java二进制字节码的运行环境)

好处

一次编写,到处运行

自动内存管理,垃圾回收

数组下标越界检测

多态

比较jvm/jre/jdk

常见的JVM:HotSpot

学习路线👇

内存结构

1.程序计数器

定义

Program Counter Register 程序计数器(寄存器) 

(程序计数器)作用:记住下一条jvm指令的执行地址

特点

线程私有的

不会存在内存移除

2. 虚拟机栈

栈——线程运行需要的内存空间

栈帧——每个方法运行时需要的内存

一个栈由多个栈帧组成

每个线程运行时需要的内存,称为虚拟机栈

每个栈由多个栈帧组成,每个栈帧对应着每次方法调用时所占的内存

每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法

问题

1.垃圾回收是否涉及栈内存? 

垃圾回收只回收堆内存的无用项。不需要对栈内存进行垃圾回收的处理。

2.栈内存分配越大越好吗?

栈并不是越大越好,大只是更多次的方法递归调用。并不能增加效率,反而会减少线程数量。

3.方法内的局部变量是否线程安全?

如果方法内局部变量没有逃离方法的作用范围,他是线程安全的。

如果是局部变量引用了对象,并逃离方法的作用范围,需要考虑线程安全。

栈内存溢出

栈帧过多导致栈内存溢出(无限递归)

栈帧过大导致栈内存溢出

线程运行诊断

案例1:cpu占用过多

定位,用top定位哪个进程对cpu的占用过高

ps H -eo pid,tid,%cpu|grep 进程id(用ps命令进一步定位是哪个线程引起的cpu占用过高)

jstack 进程id(可以根据线程id找到有问题的线程,进一步定位到问题代码的源码行号)

案例2:程序运行很长时间没有结果

jstack 进程id,可能是多个线程发生了死锁

3.本地方法栈

Java虚拟机调用本地方法,需要给这些本地方法提供内存。

本地代码,不是用java编写的。Java有限制,不能直接和操作系统打交道,就需要由c或c++编写的本地方法,来真正的和操作系统底层的API打交道。native 

4.堆

通过new关键字,创建的对象都会使用堆内存

特点

它是线程共享的,堆中对象都需要考虑线程安全的问题。

有垃圾回收机制。

堆内存溢出

对象被当成垃圾回收的条件是没有人使用他,如果不断地产生对象,而产生的新对象永远有人在使用,这样的对象达到一定数量,就会导致堆内存耗尽。

堆内存诊断

工具

19_堆_内存诊断_jmap_哔哩哔哩_bilibili

20_堆_内存诊断_jconsole_哔哩哔哩_bilibili

21_堆_内存诊断_jvirsualvm_哔哩哔哩_bilibili

5.方法区

方法区是所有Java虚拟机线程共享的区,它存储了跟类相关的区(成员变量、方法数据、成员方法构造器方法以及他们的代码)。

方法区在虚拟机启动时被创建,逻辑上是堆的组成部分。?

文章来源:https://blog.csdn.net/yesyesyes_yes/article/details/146281567
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/ops/166226.html

相关文章

Qt QML实现弹球消砖块小游戏

前言 弹球消砖块游戏想必大家都玩过,很简单的小游戏,通过移动挡板反弹下落的小球,然后撞击砖块将其消除。本文使用QML来简单实现这个小游戏。 效果图: 正文 代码目录结构如下: 首先是小球部分,逻辑比较麻…

现代密码学 | 具有数字签名功能的安全方案

1.案例背景 1.1冒用签名触发信任危机,360安全大脑率先截杀解除警报 2020年8月,360安全大脑独家发现冒用数字签名的网络攻击再度活跃,且继此前360安全大脑披露过的Go Daddy、Starfield Secure、赛门铁克、Verisign和DigiCert等国际知名CA证书…

C++初阶——类和对象(二)

C初阶——类和对象(二) 本期内容书接上回,继续讨论类和对象相关内容。类和对象属于C初阶部分,主要反映了面向对象编程的三大基本特点之一——封装,在C的学习中占有举足轻重的地位! 一、类对象模型 1.如何…

SEO优先级矩阵:有限资源下的ROI最大化决策模型

SEO优先级矩阵:有限资源下的ROI最大化决策模型 引言 在数字营销领域,搜索引擎优化(SEO)是提升网站流量和转化率的关键策略之一。然而,SEO的实施往往需要投入大量的时间和资源,尤其是在资源有限的情况下&a…

【解决报错】:detected dubious ownership in repository at ‘D:/idea_code/xxx‘问题

解决报错:detected dubious ownership in repository at D:/idea_code/xxx‘问题 git config --global --add safe.directory *原因 这个错误提示表明 Git 检测到仓库的所有权存在问题,仓库的所有者与当前用户不匹配。Git 在 2.35.2 版本之后引入了一个…

.py与.pyw的区别。用pythonw执行pyside6程序有什么好处?

在 Windows 系统中,使用 .pyw 扩展名并通过 pythonw.exe 运行 Python 脚本的主要目的是隐藏控制台窗口,这对于图形界面(GUI)程序尤为重要。以下是详细解释: 1. .py vs .pyw 的核心区别 .py 文件:默认关联到…

Winfrom基础知识41-60

41. 如何实现自定义控件的复杂绘制? 答案: 继承 Control 类并重写 OnPaint 方法,使用 Graphics 对象进行复杂绘制。 示例: public class CustomGraph : Control {protected override void OnPaint(PaintEventArgs e){base.OnPa…

用Python打造AI玩家:挑战2048,谁与争锋

文章目录 一、创作背景 二、效果图 三、准备工作 1. 安装Chrome和Chrome Driver 2. 安装Python库 四、代码说明 ‌1. init_driver 函数‌ 2. play_2048 函数‌ 五、完整代码 六、改进版本 七、主要模块 八、核心算法分析 1. 棋盘状态获取 2. 位置权重系统 3. 连…