首页 > 其他分享 >企业级项目实战以及多年项目开发经验大牛打造 - - JVM

企业级项目实战以及多年项目开发经验大牛打造 - - JVM

时间:2024-09-05 19:21:00浏览次数:6  
标签:Survivor 内存 大牛 回收 企业级 线程 垃圾 JVM 加载

JVM

jvm分区

Heap (堆区):主要存储new出来的对象实例,Java堆中细分为:新生代和老年代,一个新生代分为1个Eden区和2个Survivor区,说明:绝大部分对象在Eden区生成,当Eden区装填满的时候,会触发Young Garbage Collection,即YGC。垃圾回收的时候,在Eden区实现清除策略,没有被引用的对象则直接回收。依然存活的对象会被移送到Survivor区。Survivor区分为so和s1两块内存空间。每次YGC的时候,它们将存活的对象复制到未使用的那块空间,然后将当前正在使用的空间完全清除,交换两块空间的使用状态。如果YGC要移送的对象大于Survivor区容量的上限,则直接移交给老年代

元空间区:jdk1.7的方法区移到了元空间,比如类元信息、字段、静态属性、方法、常量等都移动到元空间区元空间并不在虚拟机中,而是使用本地内存

栈:栈里面存的都是一些局部变量,比如8大基本数量类型,还有线程运行,方法运行都在栈里面,另外创建对象的时候的引用也是存在栈里面的

程序计数器:是一块较小的内存空间。是线程私有的。它可以看作是当前线程所执行的字节码的行号指示器

类加载

类加载器有这几个:

启动类加载器:jvm启动的时候,会优先加载<JAVA_HOME>\lib这个目录的核心类库。

扩展类加载器:负责加载<JAVA_HOME>\lib\ext这个目录的类。

应用程序类加载器:负责加载我们写的代码。

自定义类加载器:根据我们的需要,加载特定的类。

下图展示了类加载器直接的层次关系,成为类加载器的双亲委派模型。双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。

它的工作过程是这样的:

  1. 应用程序类加载器收到了类的加载请求,先问扩展类加载器是否可以加载。
  2. 扩展类加载器也不会直接去加载,他也是向上级启动类加载器询问是否可以加载。
  3. 启动类加载器在自己负责的目录搜索了一下,发现自己找不到这个类,就说不行,你自己加载吧。
  4. 扩展类加载器在自己负责的目录搜索了一下,发现自己找不到这个类,就说不行,你自己加载吧。
  5. 应用程序类加载器在自己负责的目录搜索了一下,找到了这个类,把Hello类加载进来。

双亲委派模型一个显而易见的好处就是Java类随着它的类加载器一起具备了一种带有优先级的层次关系。

双亲委派存在得意义是什么?

保证系统的安全

垃圾回收器有哪些?

串行垃圾回收器(Serial):它为单线程环境设计并且只使用一个线程进行垃圾回收,会暂停所有的用户线程。所以不适合服务器环境。

并行垃圾回收器(Parallel):多个垃圾回收线程并行工作,此时用户线程是暂停的,适用于科学计算/大数据处理等弱交互场景。jdk8默认的是使用的Parallel并行回收器

并发垃圾回收器(CMS):用户线程和垃圾收集线程同时执行(不一定是并行,可能交替执行),不需要停顿用户线程。互联网公司多用它,适用于对响应时间有要求的场景。

垃圾回收算法?

标记清除

复制算法:

标记整理:

分代收集算法:

JVM调优的几种场景

CPU占用过高

CPU过高的原因一般是,死循环,递归,计算量大,线程数过多,怎么确定CPU飙升的问题如下:

用top命令查看cpu占用情况

用top -Hp命令查看线程的情况

可以看到是线程id为7287这个线程一直在占用cpu,把线程号转换为16进制用jstack工具查看线程栈情况

内存溢出解决

程序发生内存泄漏后,进程的可用内存会慢慢变少,最后的结果就是抛出OOM错误。发生OOM错误后可能会想到是内存不够大,于是把-Xmx参数调大,然后重启应用。这么做的结果就是,过了一段时间后,OOM依然会出现。最后无法再调大最大堆内存了,结果就是只能每隔一段时间重启一下应用

用jstat分析gc活动情况

jstat是一个统计java进程内存使用情况和gc活动的工具,参数可以有很多,可以通过jstat -help查看所有参数以及含义

用jmap工具dump出内存快照

标签:Survivor,内存,大牛,回收,企业级,线程,垃圾,JVM,加载
From: https://blog.csdn.net/ZhTiY/article/details/141883956

相关文章

  • .NET 8 + WPF 企业级工作流系统
    前言推荐一款基于.NET8、WPF、Prism.DryIoc、MVVM设计模式、Blazor以及MySQL数据库构建的企业级工作流系统的WPF客户端框架-AIStudio.Wpf.AClient6.0。项目介绍框架采用了Prism框架来实现MVVM模式,不仅简化了MVVM的典型应用场景,还充分利用了依赖注入(DI)、消息传递以及容......
  • 企业级无侵入式DNS方案
    https://blog.csdn.net/qq_36996635/article/details/126062991首先,应用ServiceA通过DNS查询获取到ServiceB的可用IP列表DNS-F会拦截到ServiceA的查询请求,判断自己是否该查询的答案,如果有(服务已在VIPServer中注册)则直接返回IP列表;如果查询的服务在VIPServer中没有注册,DNS-F把......
  • JVM必备知识
    目录一:JVM由哪些部分组成,运行流程是怎么样的二:什么是程序计数器 三:Java的堆是啥 四:元空间是啥 五:方法区是啥 六:堆栈有什么区别七:什么是类加载器八:类加载器有哪些类型九:类加载的过程9.1:加载阶段9.2:验证阶段9.3:准备阶段9.4:解析阶段9.5:初始化阶段前言:有关JVM......
  • java基础知识-JVM知识详解
    一、JVM内存结构Java虚拟机(JVM)的内存结构主要分为几个不同的区域,每个区域都有其特定的目的和功能。以下是JVM内存结构的主要组成部分:先看一下总体的结构图程序计数器(ProgramCounterRegister)这是一个较小的内存块,用于存储当前线程所执行的字节码指令的地址。每......
  • [JVM]双亲委派
    什么是双亲委派机制首先,我们知道,虚拟机在加载类的过程中需要使用类加载器进行加载,而在Java中,类加载器有很多,那么当JVM想要加载一个.class文件的时候,到底应该由哪个类加载器加载呢?这就不得不提到"双亲委派机制"。首先,我们需要知道的是,Java语言系统中支持以下4种类加载器:Bootst......
  • JVM 垃圾回收机制:GC
    目录一、死亡对象的判断算法1.1 引用计数算法1.2 可达性分析算法二、垃圾回收算法2.1 标记-清除算法2.2 复制算法2.3 标记-整理算法2.4 分代算法三、垃圾收集器3.1 CMS收集器(老年代收集器,并发GC)3.2 G1收集器(唯一一款全区域的垃圾回收器)JVM的垃圾回收机......
  • 微信小程序从基础到发布全流程_企业级商城实战(‌含uni-app项目多端部署)‌
    微信小程序从基础到发布全流程_企业级商城实战(‌含uni-app项目多端部署)‌引言微信小程序作为微信生态中的重要一环,‌凭借其无需下载、‌即用即走的特点,‌迅速成为企业推广产品和服务的重要渠道。‌本文将从基础到发布全流程,‌详细介绍如何开发一个企业级商城微信小程序,‌并探讨......
  • Node.js构建千万级高可用企业级应用,深入六大核心业务场景
    Node.js构建千万级高可用企业级应用:‌深入六大核心业务场景Node.js,‌作为一种基于ChromeV8JavaScript引擎构建的开源运行时环境,‌已经在企业级应用中展现出其独特的优势。‌特别是在处理高并发、‌实时性要求高的应用场景中,‌Node.js凭借其非阻塞I/O模型、‌事件驱动特性,‌成为......
  • 【JavaEE初阶】JVM内存划分和类加载过程以及垃圾回收
    目录......
  • JVM面试(二)内存区域划分
    内存区划分Java虚拟机在执行Java程序的过程中会把它锁管理的内存划分为若干个不同的数据区域。这些区域有各自不同的用途,以及创建和销毁的时间。有的区域随着虚拟机的进程一直存在,有的区域依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范》的规定,Java虚拟......