前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JVM看这篇就够了!

JVM看这篇就够了!

作者头像
Java团长
发布于 2019-07-11 04:10:19
发布于 2019-07-11 04:10:19
67900
代码可运行
举报
运行总次数:0
代码可运行

概念

虚拟机:指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统 ,是物理机的软件实现。常用的虚拟机有VMWare,Visual Box,Java Virtual Machine(Java虚拟机,简称JVM)。

Java虚拟机阵营:Sun HotSpot VM、BEA JRockit VM、IBM J9 VM、Azul VM、Apache Harmony、Google Dalvik VM、Microsoft JVM…

启动流程

基本架构

Java运行时编译源码(.java)成字节码,由jre运行。jre由java虚拟机(jvm)实现。Jvm分析字节码,后解释并执行。

JVM由三个主要的子系统构成:

  • 1.类加载器子系统
  • 2.运行时数据区(内存)
  • 3.执行引擎

垃圾收集(GC:Garbage Collection)

1.如何识别垃圾,判定对象是否可被回收?

  • 引用计数法:给每个对象添加一个计数器,当有地方引用该对象时计数器加1,当引用失效时计数器减1。用对象计数器是否为0来判断对象是否可被回收。缺点:无法解决循环引用的问题
  • 根搜索算法:也称可达性分析法,通过“GC ROOTs”的对象作为搜索起始点,通过引用向下搜索,所走过的路径称为引用链。通过对象是否有到达引用链的路径来判断对象是否可被回收(可作为GC ROOTs的对象:虚拟机栈中引用的对象,方法区中类静态属性引用的对象,方法区中常量引用的对象,本地方法栈中JNI引用的对象)

2.Java 中的堆是 GC 收集垃圾的主要区域,GC 分为两种:Minor GC、Full GC ( 或称为 Major GC )。

  • Minor GC:新生代(Young Gen)空间不足时触发收集,由于Java 中的大部分对象通常不需长久存活,新生代是GC收集频繁区域,所以采用复制算法。
  • Full GC:老年代(Old Gen )空间不足或元空间达到高水位线执行收集动作,由于存放大对象及长久存活下的对象,占用内存空间大,回收效率低,所以采用标记-清除算法。

GC算法

按照回收策略划分为:标记-清除算法,标记-整理算法,复制算法。

  • 1.标记-清除算法:分为两阶段“标记”和“清除”。首先标记出哪些对象可被回收,在标记完成之后统一回收所有被标记的对象所占用的内存空间。不足之处:1.无法处理循环引用的问题2.效率不高3.产生大量内存碎片(ps:空间碎片太多可能会导致以后在分配大对象的时候而无法申请到足够的连续内存空间,导致提前触发新一轮gc)
  • 2.标记-整理算法:分为两阶段“标记”和“整理”。首先标记出哪些对象可被回收,在标记完成后,将对象向一端移动,然后直接清理掉边界以外的内存。
  • 3.复制算法:把内存空间划为两个相等的区域,每次只使用其中一个区域。gc时遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题。不足之处:1.内存利用率问题2.在对象存活率较高时,其效率会变低。

按分区对待可分为:增量收集算法,分代收集算法

  • 1.增量收集:实时垃圾回收算法,即:在应用进行的同时进行垃圾回收,理论上可以解决传统分代方式带来的问题。增量收集把对堆空间划分成一系列内存块,使用时先使用其中一部分,垃圾收集时把之前用掉的部分中的存活对象再放到后面没有用的空间中,这样可以实现一直边使用边收集的效果,避免了传统分代方式整个使用完了再暂停的回收的情况。
  • 2.分代收集:(商用默认)基于对象生命周期划分为新生代、老年代、元空间,对不同生命周期的对象使用不同的算法进行回收。

按系统线程可分为:串行收集算法,并行收集算法,并发收集算法

  • 1.串行收集:使用单线程处理垃圾回收工作,实现容易,效率较高。不足之处:1.无法发挥多处理器的优势 2.需要暂停用户线程
  • 2.并行收集:使用多线程处理垃圾回收工作,速度快,效率高。理论上CPU数目越多,越能体现出并行收集器的优势。不足之处:需要暂停用户线程
  • 3.并发收集:垃圾线程与用户线程同时工作。系统在垃圾回收时不需要暂停用户线程

GC收集器常用组合

JVM性能调优思路

理解GC日志

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[GC [PSYoungGen: 8192K->1000K(9216K)] 16004K->14604K(29696K), 0.0317424 secs] [Times: user=0.06 sys=0.00, real=0.03 secs]
[GC [PSYoungGen: 9192K->1016K(9216K)] 22796K->20780K(29696K), 0.0314567 secs] [Times: user=0.06 sys=0.00, real=0.03 secs]
[Full GC [PSYoungGen: 8192K->8192K(9216K)] [ParOldGen: 20435K->20435K(20480K)] 28627K->28627K(29696K), [Metaspace: 8469K->8469K(1056768K)], 0.1307495 secs] [Times: user=0.50 sys=0.00, real=0.13 secs]
[Full GC [PSYoungGen: 8192K->8192K(9216K)] [ParOldGen: 20437K->20437K(20480K)] 28629K->28629K(29696K), [Metaspace: 8469K->8469K(1056768K)], 0.1240311 secs] [Times: user=0.42 sys=0.00, real=0.12 secs]

常见异常

  • StackOverflowError:(栈溢出)
  • OutOfMemoryError: Java heap space(堆空间不足)
  • OutOfMemoryError: GC overhead limit exceeded (GC花费的时间超过 98%, 并且GC回收的内存少于 2%)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java团长 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Jmeter(四十三)_合理分配堆内存
内存泄露是指你的应用使用资源之后没有及时释放,导致应用内存中持有了不需要的资源,这是一种状态描述;
飞天小子
2019/05/14
1.2K0
JMeter笔记16 | 性能参数配置及测试监听
从软件上看,JMeter监听器有很多,后续内容详细再介绍。本文介绍长时间执行测试计划的两个监听器Summary Report和Aggregate Report 。
虫无涯
2023/02/15
7850
Jmeter(二十一)_脚本参数化与内存溢出的解决方案
首先准备你的参数数据。我在bin/data中新建了一个dat文件,记事本另存为修改编码为UTF-8,注意用户名和密码是一一对应的,用英文逗号隔开
飞天小子
2018/08/31
1K0
Jmeter(二十一)_脚本参数化与内存溢出的解决方案
Linux下 Tomcat内存溢出
Tomcat本身不能直接在计算机上运行,需要依赖于操作系统和一个Java虚拟机。JAVA程序启动时JVM会分配一个初始内存和最大内存给APP。当APP需要的内存超出内存的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。
星哥玩云
2022/07/04
3.5K0
深入理解Java中的内存溢出内存溢出内存溢出的几种情况(OOM 异常)导致内存溢出的原因内存溢出的解决方法
OutOfMemoryError 异常: 除了程 序计数器外 , 虚拟机内 存的其他几 个运行时区 域都有发生OutOfMemoryError(OOM)异常的可能。
desperate633
2018/08/22
3.1K0
Tomcat中JVM内存溢出及合理配置
Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机。Tomcat的内存溢出本质就是JVM内存溢出,所以在本文开始时,应该先对Java JVM有关内存方面的知识进行详细介绍。
流柯
2018/08/30
2.4K0
基于jmeter完成压测
jmeter 算是我们日常比较常用的压测工具,这篇文章笔者就介绍一下基于 win10 完成 jmeter 的安装及使用。
程序员Leo
2023/08/07
4030
基于jmeter完成压测
五花八门的内存溢出
九转成圣
2024/04/10
1160
记一次内存溢出的分析经历——thrift带给我的痛orz
说在前面的话 朋友,你经历过部署好的服务突然内存溢出吗? 你经历过没有看过Java虚拟机,来解决内存溢出的痛苦吗? 你经历过一个BUG,百思不得其解,头发一根一根脱落的烦恼吗? 我知道,你有过! 但是我还是要来说说我的故事.................. ---- 背景: 有一个项目做一个系统,分客户端和服务端,客户端用c++写的,用来收集信息然后传给服务端(客户端的数量还是比较多的,正常的有几千个), 服务端用Java写的(带管理页面),属于RPC模式,中间的通信框架使用的是thrift。 thrif
Janti
2018/04/10
2.5K1
记一次内存溢出的分析经历——thrift带给我的痛orz
JMeter性能测试之负载与监听实战
JMeter 线程组实际上建立了一个线程池,JMeter 根据用户的设置进行线程池初始化,在运行时做各种运行逻辑处理。如途中所示,我们先看看线程组中的参数说明:
全栈程序员站长
2021/07/15
8330
JMeter性能测试之负载与监听实战
Tomcat之jvm及连接数设置
1、错误提示:java.lang.OutOfMemoryError: Java heap space
流柯
2018/08/31
1.5K0
使用 JMeter 进行 Dubbo 性能测试
说到性能测试工具,你会立刻联想到哪一个?ab(ApacheBench)、JMeter、LoadRunner、wrk…可以说市面上的压测工具实在是五花八门。那如果再问一句,对 Dubbo 进行性能压测,你会 pick 哪一个?可能大多数人就懵逼了。可以发现,大多数的压测工具对开放的协议支持地比较好,例如:HTTP 协议,但对于 Dubbo 框架的私有协议:dubbo,它们都显得力不从心。
kirito-moe
2019/09/09
2.4K0
使用 JMeter 进行 Dubbo 性能测试
【YashanDB知识库】kettle同步大表提示java内存溢出
【问题描述】kettle同步大表提示ERROR:could not create the java virtual machine!
用户10349277
2025/02/25
720
JMeter JMeter自身运行性能优化
单台机器的下JMeter启动较大线程数时可能会出现运行报错的情况,或者在运行一段时间后,JMeter每秒生成的请求数会逐步下降,直到为0,即JMeter运行变得很“卡”。
授客
2019/09/10
2.2K0
JMeter JMeter自身运行性能优化
【YashanDB 知识库】kettle 同步大表提示 java 内存溢出
【问题描述】kettle 同步大表提示 ERROR:could not create the java virtual machine!
用户11441800
2025/02/21
980
Tomcat报错—Tomcat内存溢出及大小调整
本文记录一些常见的Tomcat经常出现的内存溢出问题,在查询大量数据和加载jar包出现异常。一般JVM内存溢出(OOM),分为堆内存溢出和PermGen区内存溢出:
全栈程序员站长
2022/07/19
3.1K0
使用Jmeter测试MD5加密接口性能测试实战
性能测试过程中,有时候会遇到需要进行加解密的接口,下面我就来介绍如何针对MD5加密接口进行性能测试 1、首先找开发了解需求,知道是一个http类型的post请求,需要对请求的applianceId参数进行MD5加密处理,然后把该参数输入到sign,最后发起请求给服务器 2、我们需要做的就是问开发拿到MD5加密函数(java),然后通过jmeter的前置处理器BeanShell PreProcessor,就可以实现该效果 3、由于applianceId也需要参数化,所以需要使用CSV数据文件处理
jmeter技术研究
2019/10/19
1.8K0
使用Jmeter测试MD5加密接口性能测试实战
Java虚拟机--运行时数据区与内存溢出
存放的数据是JVM加载的类信息,常量,静态变量和编译器编译后的代码等,这里要注意的是JDK1.8之后已经将这个方法区删除了,使用元空间,metaspace代替了,理由有如下:
王小明_HIT
2019/08/13
5130
Java虚拟机--运行时数据区与内存溢出
几种常见的内存溢出与解决办法
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/154723.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/07
1.3K0
几种常见的内存溢出与解决办法
聊一聊,JMeter分布式性能测试!
在做后端服务器性能测试中,我们会经常听到'分布式'。但你是否了解分布式呢?今天,我们就来给大家讲讲,在企业实战中,如何使用分布式进行性能测试,实战过程中,又有哪些地方要特别注意?
测试开发技术
2024/01/05
3410
聊一聊,JMeter分布式性能测试!
推荐阅读
相关推荐
Jmeter(四十三)_合理分配堆内存
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档