JVM 2015/3/15

定义: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虚拟机线程共享的区,它存储了跟类相关的区(成员变量、方法数据、成员方法构造器方法以及他们的代码)。

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IP风险度自检,互联网的安全“指南针”

IP地址就像我们的网络“身份证”,而IP风险度则是衡量这个“身份证”安全性的重要指标。它关乎着我们的隐私保护、账号安全以及网络体验,今天就让我们一起深入了解一下IP风险度。 什么是IP风险度 IP风险度是指一个IP地址可能暴露用户真实身份或被网络平台…

【鸿蒙】封装日志工具类 ohos.hilog打印日志

封装一个ohos.hilog打印日志 首先要了解hilog四大日志类型: info、debug、warm、error 方法中四个参数的作用 domain: number tag: string format: string ...args: any[ ] 实例: //普通的info日志,使用info方法来打印 //第一个参数 : 0x0…

走路碎步营养补充贴士

走路碎步,这种步伐不稳的现象,在日常生活中并不罕见,特别是对于一些老年人或身体较为虚弱的人来说,更是一种常见的行走状态。然而,这种现象可能不仅仅是肌肉或骨骼的问题,它还可能是身体在向我们发出营养缺…

Python软件和搭建运行环境

目录 一、Python安装全流程(Windows/Mac/Linux) 1. 下载官方安装包 2. 详细安装步骤(以Windows为例) 3. 环境变量配置(Mac/Linux) 二、虚拟环境管理(关键!) 为什么需…

【蓝桥杯】省赛:神奇闹钟

思路 python做这题很简单,灵活用datetime库即可 code import os import sys# 请在此输入您的代码 import datetimestart datetime.datetime(1970,1,1,0,0,0) for _ in range(int(input())):ls input().split()end datetime.datetime.strptime(ls[0]ls[1],&quo…

RabbitMQ (Java)学习笔记

目录 一、概述 ①核心组件 ②工作原理 ③优势 ④应用场景 二、入门 1、docker 安装 MQ 2、Spring AMQP 3、代码实现 pom 依赖 配置RabbitMQ服务端信息 发送消息 接收消息 三、基础 work Queue 案例 消费者消息推送限制(解决消息堆积方案之一&#…

HW基本的sql流量分析和wireshark 的基本使用

前言 HW初级的主要任务就是看监控(流量) 这个时候就需要我们 了解各种漏洞流量数据包的信息 还有就是我们守护的是内网环境 所以很多的攻击都是 sql注入 和 webshell上传 (我们不管对面是怎么拿到网站的最高权限的 我们是需要指出它是…

camellia redis proxy v1.3.3对redis主从进行读写分离(非写死,自动识别故障转移)

1 概述 camellia-redis-proxy是一款高性能的redis代理(https://github.com/netease-im/camellia),使用netty4开发,主要特性如下: 支持代理到redis-standalone、redis-sentinel、redis-cluster。支持其他proxy作为后端…

贪吃蛇小游戏-简单开发版

一、需求 本项目旨在开发一个经典的贪吃蛇游戏,用户可以通过键盘控制蛇的移动方向,让蛇吃掉随机出现在游戏区域内的食物,每吃掉一个食物,蛇的身体长度就会增加,同时得分也会相应提高。游戏结束的条件为蛇撞到游戏区域的…

使用 Docker 部署前端项目全攻略

文章目录 1. Docker 基础概念1.1 核心组件1.2 Docker 工作流程 2. 环境准备2.1 安装 Docker2.2 验证安装 3. 项目配置3.1 项目结构3.2 创建 Dockerfile 4. 构建与运行4.1 构建镜像4.2 运行容器4.3 访问应用 5. 使用 Docker Compose5.1 创建 docker-compose.yml5.2 启动服务5.3 …

接口自动化测试用例

Post接口自动化测试用例 Post方式的接口是上传接口,需要对接口头部进行封装,所以没有办法在浏览器下直接调用,但是可以用Curl命令的-d参数传递接口需要的参数。当然我们还以众筹网的登录接口为例,讲解post方式接口的自动化测试用…

使用WireShark解密https流量

概述 https协议是在http协议的基础上,使用TLS协议对http数据进行了加密,使得网络通信更加安全。一般情况下,使用WireShark抓取的https流量,数据都是加密的,无法直接查看。但是可以通过以下两种方法,解密抓…

阿里百炼Spring AI Alibaba

文章目录 学习链接阿里百炼创建api-key查看api调用示例示例pom.xmlAQuickStartMultiChatStreamChat Spring AI Alibaba简单示例pom.xmlapplication.ymlHelloworldControllerDashScopeChatModelController图解spring AI的结构 deepseekpom.xmlapplication.ymlDeepSeekChatClient…

【模拟算法】

目录 替换所有的问号 提莫攻击 Z 字形变换 外观数列 数青蛙(较难) 模拟算法:比葫芦画瓢。思路较简单,考察代码能力。 1. 模拟算法流程,一定要在演草纸上过一遍流程 2. 把流程转化为代码 替换所有的问号 1576. 替…

【Linux】进程(1)进程概念和进程状态

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:Linux 目录 前言 一、什么是进程 二、task_struct的内容 三、Linux下进程基本操作 四、父进程和子进程 1. 用fork函数创建子进程 五、进程状态 1. 三种重…

配置blender的python环境

在blender的脚本出输入: import sys print(sys.executable) 2. 通过上述命令我们得到blener的python版本,下面我们在conda配置一个同样版本的python环境。 conda create -n blenderpy python3.11.9找到blender安装路径下的python文件夹,将它…

【bug日记】 编译错误

在我使用vscode的时候,我想用一个头文件和两个cpp文件,头文件是用来声明一个类的,一个cpp是用来类的成员函数,一个cpp是主函数 但是我写完编译发现会弹出找不到这个类成员函数这个cpp文件,爆出这样的错误 提示我找不到…

SQLAlchemy系列教程:批量插入数据

高效地批量插入数据对于应用程序的性能至关重要。SQLAlchemy为批处理操作提供了几种机制,可以最大限度地减少开销并加快数据库事务时间。在本指南中,我们将探讨如何使用SQLAlchemy执行批量插入,包括从基础技术到高级技术。 搭建环境 在开始之…

蓝桥杯十天冲刺-day1(getline读入空格)

getline读入带空格的字符串 解决cin或scanf无法读入空格的问题 作文标题 代码思路 主要通过这个代码体会getline函数可以输入空格的作用 用getline函数输入含空格的字符串&#xff0c;用length()函数记字符串长度 依次扫描不为空格的字符计数 #include<bits/stdc.h>…

使用py-ffmpeg批量合成视频的脚本

我有一个小米摄像头&#xff0c;用它录出来的视频全部都是3s一段3s一段的。其中有几个小时的视频我需要保存&#xff0c;当初直接把摄像头的卡文件导出来重命名掉了&#xff0c;那时候没有注意&#xff0c;之后想剪辑/发送给别人的时候发现疯了&#xff1a; 1.剪辑的话&#x…