深入浅出JVM

JVM内存管理与垃圾回收机制 一、内存溢出和内存泄漏 1.1、内存溢出(OOM out of memory) ----内存不够用。 比如上厕所坑位不够 内存溢出是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory; 1.2、内存泄漏(Memory Leak) -----内存空间浪费,内存用完未释放 比如站着茅坑不出来,而且是永久占着 内存泄漏是指程序在申请内存后,无法释放已申请... 阅读详情

JAVA平台

这里写图片描述

  1. 先通过一张图直观的认识一下,可以看到JVM对下屏蔽了Platforms的细节,这也是为什么Java能跨平台;
  2. 可以看到JVM有两种,不过1.8以后Client模式基本没有了;
  3. JRE除了包含JVM以后,还包含了底层的类库,很多都是C和C++写的;
  4. JDK除了包含JRE,还包含了像javac这种编译工具和像JConsole的控制工具;

JVM运行时的数据区域

这里写图片描述

  • 程序计数器:指向当前线程正在执行的字节码指令的地址(行号)
  • 虚拟机栈:存储当前线程运行方法时所需要的数据,指令和返回地址
  • 本地方法栈(native):本地方法运行时所需要的数据,指令和返回地址
  • 方法区:类信息、常量
  • 堆(heap):对象

通过图也可以形象的看出,程序计数器、虚拟机栈、本地方法栈都是线程私有的,不存在线程安全问题,而堆和方法区是线程公有的。

虚拟机栈

下面具体聊一聊虚拟机栈(通过我们具体的方法的例子):

public void methodOne(int i) {
    int j = 0;
    int sum = i + j;
    Object acb = obj;
    long start = System.currentTimeMillis();
    methodTwo();
    return;
}

通过javap反编译class文件
这里写图片描述

可以通过下图看出虚拟机栈的作用及如何工作,每个方法都对应一个方法栈帧

这里写图片描述

JVM的内存模型

这里写图片描述

如果所示,内存被分为新生代、老年代、永久代。新生代又被分为8:1:1的eden区、s0和s1区。颜色和上面的JVM的数据区域对应,在小于1.8的时候,永久代在方法区上。那么当大量加载类的时候,很容易出现OutOfMemoryError,在1.8之后,永久代出现了元空间,是可以自动扩容的,好处显而易见,坏处就是可能会无限扩张,侵占别的内存空间。

假设现在理想状态下不触发大对象,阈值(threshold)和 age的状况下,new出一个9兆的对象,首先会放在eden区,满了,会触发Minor gc,这个8兆的对象会被放到s0,但是s0放不下,会有一个担保机制,直接被放进老年代。

GC

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

Minor GC 是发生在新生代中的垃圾收集动作,所采用的是复制算法。
新生代几乎是所有 Java 对象出生的地方,即 Java 对象申请的内存以及存放都是在这个地方。Java 中的大部分对象通常不需长久存活,具有朝生夕灭的性质。
当一个对象被判定为 “死亡” 的时候,GC 就有责任来回收掉这部分对象的内存空间。新生代是 GC 收集垃圾的频繁区域。
当对象在 Eden ( 包括一个 Survivor 区域,这里假设是 from 区域 ) 出生后,在经过一次 Minor GC 后,如果对象还存活,并且能够被另外一块 Survivor 区域所容纳( 上面已经假设为 from 区域,这里应为 to 区域,即 to 区域有足够的内存空间来存储 Eden 和 from 区域中存活的对象 ),则使用复制算法将这些仍然还存活的对象复制到另外一块 Survivor 区域 ( 即 to 区域 ) 中,然后清理所使用过的 Eden 以及 Survivor 区域 ( 即 from 区域 ),并且将这些对象的年龄设置为1,以后对象在 Survivor 区每熬过一次 Minor GC,就将对象的年龄 + 1,当对象的年龄达到某个值时 ( 默认是 15 岁,可以通过参数 -XX:MaxTenuringThreshold 来设定 ),这些对象就会成为老年代。
但这也不是一定的,对于一些较大的对象 ( 即需要分配一块较大的连续内存空间 ) 则是直接进入到老年代。
Full GC 是发生在老年代的垃圾收集动作,所采用的是标记-清除算法。
现实的生活中,老年代的人通常会比新生代的人 “早死”。堆内存中的老年代(Old)不同于这个,老年代里面的对象几乎个个都是在 Survivor 区域中熬过来的,它们是不会那么容易就 “死掉” 了的。因此,Full GC 发生的次数不会有 Minor GC 那么频繁,并且做一次 Full GC 要比进行一次 Minor GC 的时间更长。
另外,标记-清除算法收集垃圾的时候会产生许多的内存碎片 ( 即不连续的内存空间 ),此后需要为较大的对象分配内存空间时,若无法找到足够的连续的内存空间,就会提前触发一次 GC 的收集动作。

OOM异常

导致OutOfMemoryError异常的常见原因有以下几种:

  1. 内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
  2. 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
  3. 代码中存在死循环或循环产生过多重复的对象实体;
  4. 使用的第三方软件中的BUG;
  5. 启动参数内存值设定的过小;

此错误常见的错误提示:

  1. tomcat:java.lang.OutOfMemoryError: PermGen space
  2. tomcat:java.lang.OutOfMemoryError: Java heap space
  3. weblogic:Root cause of ServletException java.lang.OutOfMemoryError
  4. resin:java.lang.OutOfMemoryError
  5. java:java.lang.OutOfMemoryError

OOM解决办法

对tomcat容器,可以在启动时对jvm设置内存限度。对tomcat,可以在catalina.bat中添加:

set CATALINA_OPTS=-Xms128M -Xmx256M
set JAVA_OPTS=-Xms128M -Xmx256M

其中”-Xms128M”为最小内存,”-Xmx256M”为最大内存。

这个其实用过eclipse的人都知道,当配置的环境变量是jdk1.8以上的时候,eclipse打开都会报错,这个时候,就需要去ini文件设置内存大小。

机械拆装-基于Unity-总体设计 建立一个机械装配的场景 阅读详情

相关推荐

激光光束质量评估与光斑尺寸计算:从理论到MATLAB实践

本文详细解析激光光束质量评估与光斑尺寸计算的理论基础及MATLAB实践方法,重点介绍M²因子的测量与应用。通过高斯光束模型、CCD成像法和MATLAB算法实现,帮助读者掌握从理论到实践的完整流程,提升激光系统调试与评估能力。

weixin_29083373的博客 444

java中三种常见内存溢出错误的处理方法

https://www.cnblogs.com/shengs/p/10892399.html 相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各类问题经验的积累以及对问题根源的探索,终于有了一个比较深入的认识。 在解决java内存溢出问题之前,需要对jvm(java虚拟机)的内存管理有一定的认识。jvm管理的内存大致包括三种不同类型的内存区域:Permanent Generation space(永久保存区域)、Heap s.

weixin_42415158的博客 1166

潜行游戏设计:核心机制与关卡设计解析

潜行游戏作为动作游戏的重要分支,通过视觉遮蔽、声音传播和AI行为树等复杂系统,为玩家提供独特的策略体验。视觉隐蔽系统采用视野锥和光照值的双重判定,声学传播模型模拟距离衰减和材质穿透,而敌人AI行为树则包含巡逻、警戒和团队协作等状态节点。这些技术不仅提升了游戏的真实感和挑战性,还在《合金装备》《刺客信条》等经典作品中得到广泛应用。潜行游戏的关卡设计强调多路径拓扑结构和环境叙事元素,通过沙漏模型和动态难度调节,平衡自由度和开发成本。未来,基于ML的适应性AI和物理模拟的隐蔽系统将成为创新方向。

weixin_42497762的博客 179

JVM 系列(一) --- 深入浅出对 JVM 的理解

本篇文章主要介绍 **JVM 是什么, JVM 的内存布局是什么样的, JVM 的类加载机制是怎么一回事,以及垃圾回收的概念,**这些概念都是以后升学或者是找工作面试常考/常问的问题,因此需要我们经常回顾,本篇文章便可以当做常回顾的工具.我们在上学期间可能已经接触过虚拟机这个概念,虚拟机就是一个完整的计算机系统,其具有完整的硬件功能,并且运行在一个完全隔离的环境中,

Fug_Lee的博客 1685

国产麒麟系统PXE安装-UEFI引导

注意: 适用uefi引导 适用x86_64架构 一键部署脚本扣我 1.上传ISO到PXE服务器,拷贝ISO文件 # mkdir /kylin_iso # mount -o loop Kylin-Server-10-SP1-Release-Build04-20200711-x86_64.iso /kylin_iso/ 2.配置http,获取安装源 # yum -y install httpd # mkdir /var/www/html/{ks,kylin} # 注意一定是"/kylin_iso/

河静 5053

EZ-USB-FX3 slavefifo调试

最近使用fx3-usb-3.0调试slave fifo的传输,期间遇到许多难以理解的问题。在这里分享给大家,希望可以少走一些弯路,我自己是这样走过来的。 1,首先去官网下载原始的参考设计,并安装所提供的SDK软件:FX3SDKSetup_1.3.4.exe 2,接着把参考设计文档AN65974阅读一遍,分别创建新的SDK工程和FPGA工程。如果使用的原厂的开发板,那么可以按照文档提示,可以很顺畅的跑完整过测试。否则需要匹配自己的硬件,做针对性的更改和移植,而我走的是后一条路,于是开始了漫长的调试之路。.

YDY5659150的专栏 3630

JVM垃圾回收相关问题整理

哪些引用对象可以作为GC ROOT? JVM垃圾回收的根对象的范围有以下几种: 虚拟机栈中的引用对象 方法区中的类静态属性引用对象 方法区中常量引用的对象(final的常量值) 本地方法栈JNI(Java本地接口/Java Native Interface)的引用对象 JVM垃圾回收过程关于堆内存的结构划分? 在JVM中堆空间划分如下图所示 上图中,刻画了Java程序运行时的堆空...

duanduan_l的博客 503

三菱FX5U通信之CCLINK操作步骤

11. 连接 CC‐Link 用的端子排,连接 Ver.1.10 对应 CC‐Link 专用电缆。备注:1、以上对应的寄存器都是一一对应的,主站的点数可以比从站多,但是都需要一一对应起来。3.直接安装孔,用于直接安装的螺钉孔(2‐φ4.5,安装螺钉为 M4 螺钉)2.点阵 LED(显示模块中设置的站号和测试模式的内容)5.次段扩展连接器(连接扩展模块的扩展电缆的连接器)4.动作状态(显示 LED 显示模块的动作状态)10 电源连接器,用于连接电源电缆的连接器。1.扩展电缆(扩展时连接用的电缆)

ZXL622722的博客 6925

Java 内存溢出、内存泄漏分析及解决

一、内存溢出 内存溢出 (out of memory),是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory; 内存溢出的原因及解决方法: (1) 内存溢出原因: 内存中加载的数据量过于庞大,如一次从数据库取出过多数据; 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收; 代码中存在死循环或循环产生过多重复的对象实体; 使用的第三方软件中的BUG; 启动参数内存值设定的过小 (2)内存溢出的解决方案: 第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参

weixin_43946462的博客 1916

2022 七校联合NewStarCTF 公开赛赛道 WEEK5|MISC

2022 七校联合NewStarCTF 公开赛赛道 WEEK5|MISC

zerorzeror的博客 3110

【鸿蒙游戏上架审核规范指南】

华为鸿蒙游戏上架审核规范指南摘要

weixin_44161102的博客 916

深入浅出JVM,看完你就懂

JVM理论与实践,深入浅出,看完你就懂。

南客先生的博客 1046

最优控制 (Optimal Control) 算法详解及案例分析

最优控制是一种通过优化控制输入,使系统在满足约束条件的情况下达到最优性能的控制方法。其目标是最小化或最大化一个性能指标。

闲人编程的博客 2090

JVM-深入浅出JVM

JVM-深入浅出JVM

weixin_45226668的博客 737

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java必会!深入浅出聊 JVM 调优

在说 JVM 调优之前,我们先来看看什么是 JVM👇。JVM 是 Java Virtual Machine(Java虚拟机)的缩写,JVM 是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。(以上内容来自百度)

mxt51220的博客 829

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

JVM深入浅出

对于任何一门语言,要想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式。在本篇文章中,将重点研究java源代码的执行原理,即从程 序员编写JAVA源代码,到最终形成产品,在整个过程中,都经历了什么?每一步又是怎么执行的?执行原理又是什么?..... 当然,本篇文章的粒度可能稍微侧重于宏观方面,更细粒度的技术分析,需要在接下来的该系列文章中与大家分享.... ...

笙箫的博客 599

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

深入浅出JVM调优,看完你就懂

深入浅出JVM调优 基本概念: JVM把内存区分为堆区(heap)、栈区(stack)和方法区(method)。由于本文主要讲解JVM调优,因此我们可以简单的理解为,JVM中的堆区中存放的是实际的对象,是需要被GC的。其他的都无需GC。 下图文JVM的内存模型 从图中我们可以看到, 1、JVM实质上分为三大块,年轻代(YoungGen),年老代(Old Memory),及持久代(Per...

robinson_911的专栏 243

带你深入浅出?JVM

带你深入浅出????JVM1 结构浅撩1 话术介绍JVM一共分为三个组成部分:1 类加载子系统主要是将class文件加载到内存中的一个系统,其核心组件是类加载器2 运行时数据区子系统jvm私有部分虚拟机栈本地方法栈 程序计数器jvm公有部分方法区: 类元信息java堆3 执行引擎子系统:负责程序的执行和垃圾回收2 类加载的过程...

weixin_41109232的博客 273

JVM之二:深入浅出jvm

文章目录1、jvm模型2、类加载器2.1 加载2.2 验证2.3 准备2.4 解析2.5 初始化3、双亲委派机制4、native方法5、PC寄存器6、方法区7、栈:数据结构(先进后出,后进先出)8、堆9、JMM 1、jvm模型 2、类加载器 作用: 加载Class文件。 虚拟机自带的加载器 启动类(根)加载器 扩展类加载器 应用程序加载器 类加载机制: 其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则

weixin_39085109的博客 671

jvm 调优_深入浅出JVM调优,看完你就懂

深入浅出JVM调优基本概念:JVM把内存区分为堆区(heap)、栈区(stack)和方法区(method)。由于本文主要讲解JVM调优,因此我们可以简单的理解为,JVM中的堆区中存放的是实际的对象,是需要被GC的。其他的都无需GC。下图文JVM的内存模型从图中我们可以看到,1、JVM实质上分为三大块,年轻代(YoungGen),年老代(Old Memory),及持久代(Perm,在Java8中被取...

weixin_39788960的博客 404
上一篇: MAC下解决pip安装权限问题 OSError: [Errno 13] Permission denied OSError: [Errno 1] Operation not permitted:
杜鲁门
博客等级 码龄11年 219粉丝 316原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值