01JVM_内存结构

一、什么是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文件,当类被加载,常量池信息就会放入运行时常量池,并把里面的符号地址改为真实地址。

5.1StringTable面试题

特性

①常量池的字符串只是符号,第一次用到时才变为对象

②利用字符串机制,避免创建重复的字符串对象

③字符串变量的拼接是StringBuilder

④字符串常量的拼接是编译器优化

⑤使用intern方法把字符串对象放入串池

常量池与字符串池的关系

 

①运行时常量池的信息,都会被加载到运行常量池中,这时的a b ab都是常量池的对象,还没有变为java字符串对象,什么时候执行到响应代码然后创建

②ldc #2 会把a符号变为“a”字符串对象,放入StringTable

③ldc #3 会把b符号变为“b”字符串对象,放入StringTable

④ldc #4 会把ab符号变为“ab”字符串对象,放入StringTable

⑤StringTable[a,b,ab] hashtable结构,不能扩容,不重复的

字符串变量拼接

问:s3==s4? False。

s3的ab在字符串常量池中,s4是变量拼接new String(“ab”)了一个对象在堆中。地址不一样是false

编译器优化

问:s3==s5? True

s3的ab在字符串常量池中。当s5进行字符串常量拼接时,会从常量池看是否存在,发现存在s5就指向了常量池的ab

intern_jdk1.8

s.intern();将这个字符串对象s尝试放入串池,如果字符串池有就返回ab地址,没有就放入返回对象s地址

分析:

 

 

intern_jdk1.6

s.intern();将这个字符串对象s尝试放入串池,如果字符串池有就返回ab地址,没有就放入返回ab新地址

以上的分析,常量池没有ab的时候,s2=s.intern()放入ab,返回的不是s的地址

面试题

5.2StringTable位置 

 

①jvm内存结构1.6

永久代只有full GC情况下进行内存垃圾回收效率低,StringTable属于常量池的一部分

②jvm内存结构1.8

垃圾回收效率高,属于堆的一部分

5.3 StringTable能垃圾回收

在内存紧张的时候会发生垃圾回收

5.4 StringTable性能调优

①因为StringTable由HashTable实现的,增加HashTable桶的个数,减少字符串放入串池的时间

-XX:StringTableSize=xxxx

//最低为1009

②通过intern方法减少重复入池,保证相同的地址在StringTable只存储一份。

6.直接内存Direct Memory

定义

①常见于NIO操作时,用于数据缓冲区

②分配回收成本高,但读写性能高

③不受JVM内存回收管理

基本使用

Direct Memory直接内存是操作系统和java代码都可以访问的一块区域。磁盘文件读取的时候到直接内存,java代码也可以访问直接内存。

内存溢出

①直接内存也会导致内存溢出问题

②OutOfMemoryError:Direct buffer memory

释放原理

直接内存的回收不是通过JVM的垃圾回收来释放的,通过unsafe.freeMemory手动释放

直接内存分配和回收原理

①使用unsafe对象完成直接内存的分配回收,回收需要手动调用freeMemory方法

ByteBuffer实现类内部,使用了Cleaner虚引用来监测ByteBuffer对象。一旦ByteBuffer对象被垃圾回收,那么会由ReferenceHandler守护线程通过Cleaner的clean方法调用freeMemory释放直接内存。

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

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

相关文章

Redis限流实践:实现用户消息推送每天最多通知2次的功能

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师…

java从入门到起飞(八)——循环和递归

文章目录 Java循环1. 什么是循环?1.1 为什么需要循环?1.2 循环的分类 2. Java中的循环结构2.1 for循环2.2 while循环2.3 do-while循环 3. 循环控制语句3.1 break语句3.2 continue语句 4. 总结 Java递归1. 什么是递归2. 递归的原理3. 递归的实现4. 递归的…

更换 yum 阿里源 - 手把手教你怎么配置,在也不需要求别人了 - 看懂一个就相当于看懂了其他的linux系统

更换阿里源 我的是centos8 当然 centos7 也可以换 后面有更详细的怎么配 ,再也不用求别人怎么弄了 最直接的方式 直接复制 执行 centos7 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo或者 wget -O /etc/yum.repos.…

基于SpringBoot + Vue的项目整合WebSocket的入门教程

1、WebSocket简介 WebSocket是一种网络通信协议,可以在单个TCP连接上进行全双工通信。它于2011年被IETF定为标准RFC 6455,并由RFC7936进行补充规范。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性…

酷雷曼第二期无人机技能培训圆满举办

第2期无人机技能培训 2023年8月24日-8月25日,第二期酷雷曼无人机技能培训及执照考试在北京圆满举办,来自五湖四海、全国各地的合作商千里相聚,培训现场热闹融洽,再续精彩盛况。 随着《无人驾驶航空器飞行管理暂行条例》正式发布…

性能测试 —— Jmeter 命令行详细

我们在启动Jmeter时 会看见:Don’t use GUI mode for load testing !, only for Test creation and Test debugging.For load testing, use CLI Mode (was NON GUI) 这句话的意思就是说,不要使用gui模式进行负载测试,gui模式仅仅是创建脚本…

Mysql JSON

select json_extract(c2, $.a) select c2->"$.a" // json_extract的语法糖 (取出的值会保留"双引号" so不适合实战) 注:mysql若是引擎Mariadb则不支持json操作符->>语法糖 select c2->…

扫地僧静态养站王站群:搜狗SEO站群收录养站效果

扫地僧静态养站王站群:Sogou搜狗SEO出站及收录效果,扫地僧静态站群采用了静态生成式的方式,只需要一个后台管理系统即可管理多个网站,大大提高了建站效率。建站大概45天左右,收录率百分之三十至百分之五十左右 如果对购买的域名进行把控&…

游戏思考30(补充版):关于逆水寒铁牢关副本、白石副本和技能的一些注释(2023/0902)

前期介绍 我是一名逆水寒的玩家,做一些游戏的笔记当作攻略记录下来,荣光不朽-帝霸来源视频连接 传送门 一、旧版铁牢关(非逆水寒老兵服) (1)老一:巨鹰 1)机制一:三阵风…

ubuntu20.04 Supervisor 开机自启动脚本一文配置

前言: 最近发现一种非常好的开机启动服务方式,不光可以开机自启动,而且还可以进行开机节点的进程守护,这样大大确保了线程的稳定情况,这种服务甚至可以守护开机的进程,所以比之前设置 rc.local 开机自启动脚本一文配置节点好出很多,它甚至可以使用网页登录监管我开机自启…

手写RPC框架--4.服务注册

RPC框架-Gitee代码(麻烦点个Starred, 支持一下吧) RPC框架-GitHub代码(麻烦点个Starred, 支持一下吧) 服务注册 服务注册a.添加服务节点和主机节点b.抽象注册中心c.本地服务列表 服务注册 a.添加服务节点和主机节点 主要完成服务注册和发现的功能,其具体流程如下&…

【Springcloud】elk分布式日志

【Springcloud】elk分布式日志 【一】基本介绍【二】Elasticsearch【1】简介【2】下载【3】安装【4】启动 【三】Logstash【1】简介【2】下载【3】安装【4】启动 【四】Kibana【1】简介【2】下载【3】安装【4】启动 【五】切换中文【六】日志收集 【一】基本介绍 (…

【测试开发】Mq消息重复如何测试?

本篇文章主要讲述重复消费的原因,以及如何去测试这个场景,最后也会告诉大家,目前互联网项目关于如何避免重复消费的解决方案。 Mq为什么会有重复消费的问题? Mq 常见的缺点之一就是消息重复消费问题,产生这种问题的原因是什么呢…

VMware 安装 黑群晖7.1.1-42962 DS918+

本例的用的文件 1、ARPL 1.0beat 引导文件 vmdk格式: https://download.csdn.net/download/mshxuyi/88309308 2、DS918_42962.pat:https://download.csdn.net/download/mshxuyi/88309383 一、引导文件 1、创建一个虚拟机 2、下一步,选稍后…

Linux图形栈入门概念

Mesa在图形栈中的位置 游戏引擎: 游戏引擎指的是一种软件框架,通过编程和各种工具,帮助开发者设计、构建和运行视频游戏。它相当于一个虚拟的世界创造工具,提供了各种功能模块和资源,如渲染引擎、物理引擎(碰撞检测、重…

HTTP代理只能代理HTTP协议吗?

HTTP代理是一种代理服务器,它可以充当客户端和服务器之间的中介,以帮助客户端访问服务器上的资源。但是,HTTP代理并不仅仅只能代理HTTP协议。 HTTP代理可以代理的协议 除了HTTP协议之外,HTTP代理还可以代理其他协议,例…

Apache实现weblogic集群配置

安装apache,安装相对稳定的版本。如果安装后测试能否正常启动,可以通过访问http://localhost/进行测试。安装Weblogic,参见文档将bea安装目录 weblogic81/server/bin 下的 mod_wl_20.so 文件copy到 apache安装目录下Apache2/modules/目录下A…

C++ 浅拷贝和深拷贝

目录 1. 浅拷贝 2. 深拷贝 1. 浅拷贝 浅拷贝只是拷贝一个指针,并没有新开辟一个地址,拷贝的指针和原来的指针指向同一块地址,如果原来的指针所指向的资源释放了,那么再释放浅拷贝的指针的资源就会出现错误 对一个已知对象进行拷贝…

【深入解析spring cloud gateway】06 gateway源码简要分析

上一节做了一个很简单的示例,微服务通过注册到eureka上,然后网关通过服务发现访问到对应的微服务。本节将简单地对整个gateway请求转发过程做一个简单的分析。 一、核心流程 主要流程: Gateway Client向 Spring Cloud Gateway 发送请求请求…

探索Apache Hive:融合专业性、趣味性和吸引力的数据库操作奇幻之旅

文章目录 版权声明一 数据库操作二 Hive数据表操作2.1 表操作语法和数据类型2.2 Hive表分类2.3 内部表Vs外部表2.4 内部表操作2.4.1 创建内部表2.4.2 其他创建内部表的形式2.4.3 数据分隔符2.4.4 自定义分隔符2.4.5 删除内部表 2.5 外部表操作2.5.1 创建外部表2.5.2 操作演示2.…