01JVM_内存结构

news/2024/7/7 21:44:01

一、什么是JVM

1.JVM的定义

Java程序的运行环境,java二进制字节码的运行环境

2.JVM的好处

①一次编写,到处运行

②自动内存管理,垃圾回收功能

③数组下标越界检查

④多态

3.jvm,jre,jdk的比较

 3.常见的JVM

主要学习的是HotSpot虚拟机

4.jvm的学习路线

 

①ClassLoader:java代码编译成二进制后,会经过类的加载器,这样才能加载到JVM运行

②Method Area:类是放在方法区的

③Heap:类的实例化对象放在堆区

④当类调用方法时,会用到虚拟机栈,程序计数器,本地方法栈

⑤方法的每行代码执行是在执行引擎的解释器逐行执行,频繁调用的方法热点代码在JIT即时编译器执行。GC垃圾回收对堆的不用对象进行回收

⑥需要和操作系统打交道的是本地方法接口。

二、内存结构

1.程序计数器

①定义

程序计数器(寄存器)记录下一条jvm指令的执行地址

②特点

线程私有的,不会存在内存溢出。

2.虚拟机栈

定义:

①每个线程运行需要的内存空间,称为虚拟机栈。

②每个栈由栈帧Frame组成,对应着每次调用方法(参数,局部变量,返回地址)时所占的内存

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

问题分析

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

不会。栈内存由栈帧组成,对应着每次调用方法时占用的内存。每次方法调用结束会自动弹出栈。

②栈内存分配越大越好吗?

不是。默认栈内存是1M,物理内存是一定的,所以栈内存越大,能够支持更多的递归调用。但是线程会变少。

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

线程安全:方法内的局部变量且无返回值。

线程不安全:方法内的局部变量有返回值。方法内的参数。

栈内存溢出 java.lang.stackOverflowError

①栈帧过多(方法递归调用)

②栈帧过大

③第三方类库的操作

修改栈内存大小-Xss

 栈溢出线程运行诊断

案例1:cpu占用过多怎么排查

①用top命令查看占用cpu最高的进程

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

jstack 进程id 可以根据线程id找到有问题的线程

3.本地方法栈

 在本地方法栈有带有native关键字的方法,作用是java调用本地的C或C++方法跟系统底层交互。

4.

Heap

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

堆的特点

①线程共享,堆中的对象需要考虑线程安全的问题

②有垃圾回收机制

堆内存溢出

大量的对象占据了堆内存的空间java.lang.OutOfMemoryError:java heap space导致堆内存空间溢出

使用-Xmx内存大小  修改堆内存

 

排查堆内存溢出的原因

①jps工具

查看当前系统有哪些java进程

②jmap工具

查看堆内存占用情况 jmap -heap 进程id

③jconsole工具

图像界面,多功能检测,连续监测

5.方法区

定义

①方法区线程共享的(堆也是)

②方法区在JVM启动创建且内存空间不连续,可以实现扩展

③方法区类似编译代码的存储区域。方法区是存放类的信息(成员变量,方法数据,成员方法和构造器的代码)

方法区组成

①在jdk1.6中:

方法区是概念的,用PermGen永久代实现方法区。存储类的信息,存储类的加载器,运行时常量池

②在jdk1.8中:

方法区是概念的,用Metaspace云空间实现方法区(使用系统内存,不由JVM管理内存,由操作系统管理)。存储类的信息,存储类的加载器,运行时常量池

方法区内存溢出 类加载过多

①1.8前:永久代内存溢出java.lang.OutOfMemoryError:PermGen

使用-XX:MaxPermSize=8m 指定永久代内存大小

②1.8后:元空间内存溢出 java.lang.OutOfMemoryError:Metaspace

使用-XX:MaxMetaspaceSize =8m 指定元空间内存大小

溢出的场景

Spring -生成大量的类

Mybatis

运行时常量池

 

①常量池

常量池就是一张常量表,虚拟机指令根据这张常量表找到要执行的类名,方法名,参数类型,字面量等信息

②运行时常量池

常量池是*.class文件,当类被加载,常量池信息就会放入运行时常量池,并把里面的符号地址改为真实地址。

 


http://lihuaxi.xjx100.cn/news/1503010.html

相关文章

Java 的线程安全机制之`synchronized`

前言:首先,线程表示一条单独的执行流,每个线程有自己的执行计数器,有自己的栈,但可以共享内存,共享内存是实现线程协作的基础,但共享内存有两个问题,竞态条件和内存可见性。解决这些…

解决RabbitMQ报错Stats in management UI are disabled on this node

文章目录 问题描述:解决步骤:进入容器后,cd到以下路径修改 management_agent.disable_metrics_collector false退出容器重启rabbitmq容器 问题描述: linux 部署 rabbitmq后,打开rabbitmq管理界面。点击channels&#…

【设计模式】Head First 设计模式——抽象工厂模式 C++实现

设计模式最大的作用就是在变化和稳定中间寻找隔离点,然后分离它们,从而管理变化。将变化像小兔子一样关到笼子里,让它在笼子里随便跳,而不至于跳出来把你整个房间给污染掉。 设计思想 提供一个接口,让该接口负责创建一…

如何做好银行统一报送系统UI设计

北京蓝蓝设计公司是一支由清华美院毕业的专业团队组成的设计公司。我们的设计师们在金融银行软件领域拥有12年的工作经验和丰富的行业知识。 在工作中我们常常思考银行金融反洗钱软件用户使用痛点是什么?我们发现用户的使用痛点往往是: 1功能入口不清晰…

java运行程序流程

java运行程序流程 检查JDK环境 java -version 新建Java文件(源文件)Hello.java 打开记事本,输入 public class Hello {public static void main(String[] args) {System.out.println("Hello");} } 保存文件,把文件后缀…

039 - sql逻辑操作符

前提: 做两个表employee和movie,用来练习使用; 表一:employee -- 创建表employee CREATE TABLE IF NOT EXISTS employee(id INT NOT NULL AUTO_INCREMENT,first_name VARCHAR(100) NOT NULL,last_name VARCHAR(100) NOT NULL,t…

【python零基础入门学习】python基础篇之判断与for循环(二)

本站以分享各种运维经验和运维所需要的技能为主 《python》:python零基础入门学习 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…

权限提升-PostgreSQL数据库提权+第三方应用提权

权限提升基础信息 1、具体有哪些权限需要我们了解掌握的? 后台权限,网站权限,数据库权限,接口权限,系统权限,域控权限等 2、以上常见权限获取方法简要归类说明? 后台权限:SQL注入,数…