![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
jvm
文章平均质量分 82
MG-net
这个作者很懒,什么都没留下…
展开
-
JVM调优
一、概述1、生产环境中的问题生产环境发生了内存溢出应该如何处理 生产环境应该给服务器分配多少内存合适 如何对垃圾回收器的性能进行调优 生产环境CPU负载飙高应该如何处理 生产环境应该给应用分配多少线程合适 无log,如何确定请求是否执行了某行代码 无log,如何实时查看某个方法的入参和返回值2、调优基本问题为什么要调优 防止OOM出现,对JVM规划和预调优 解决程序运行中各种OOM 减少full GC的出现频率,决绝运行慢、卡顿的文图 调优的方向 合理的编写代码原创 2022-02-02 14:53:39 · 561 阅读 · 0 评论 -
JVM知识点
1、包装类的缓存2、 String声明的字面量,都是放在字符串常量池中,而常量池JDK6放在永久代、JDK7以后放在堆空间在JDK6之前,由于常量池在永久代,所以intern调用自后,helloworld生成在永久代,所以str不等于str1在JDK7之后,由于常量池在堆中,所以intern调用后,常量池中会存放堆中helloworld对象的引用,所以str等于str1//返回了一个 new String String str = new String("hello")原创 2022-01-29 14:18:06 · 414 阅读 · 0 评论 -
分析GC日志
一、GC日志参数查看文章:JVM运行时参数_liming0025的专栏-CSDN博客一、JVM参数选项类型1、类型1:标准参数选项特点比较稳定,各版本差距不到以 - 开头各种选项运行java或者java -help可以查看全部的标准选项补充内容-server与-client2、类型2:-X参数选项特点非标准化参数功能还是比较稳定的,但是可能会改变以 -X 开头各种选项运行java -X 命令可以看到所有X选项JVM的JIT编译模式相关的选项特别地3、类型3:-XX参数选项二、添加JVM参数选项https原创 2022-01-16 16:05:45 · 1034 阅读 · 0 评论 -
JVM运行时参数
一、JVM参数选项类型1、类型1:标准参数选项特点 比较稳定,各版本差距不到 以 - 开头 各种选项 运行java或者java -help可以查看全部的标准选项 补充内容 -server与-client 2、类型2:-X参数选项特点 非标准化参数 功能还是比较稳定的,但是可能会改变 以 -X 开头 各种选项 运行java -X 命令可以看到所有X选项 JVM的JIT编译模式相关的选项 特别地3、类型3:-XX参数选项二、添加JVM参数选项原创 2022-01-16 14:46:02 · 650 阅读 · 0 评论 -
JVM监控之图形化工具
一、工具概述使用命令行工具存在以下的局限性:无法获取方法级别的分析数据,如方法之间的调用关系、各方法的调用次数和调用时间等 要去用户登陆到java应用所在的宿主机上 分析数据通过终端输出,结构不够直观随着java应用的官方使用,越来越多的图形化工具问世1、JDK自带工具jConsole:查看应用运行概况、监控堆信息、永久区使用情况、类加载情况等 Visual VM:提供了可视化界面,用户查看JVM二、jConsole三、Visual VM四、eclipse MAT五、J原创 2022-01-15 18:18:43 · 2018 阅读 · 0 评论 -
JVM监控工具之命令行篇
一、概述使用数据说明问题、使用知识分析问题、使用工具处理问题 无监控、不调优,因为没有一次性的处理,所有需要根据实际情况才能调优二、jps-查看正在运行的java进程1、基本情况jps(java Process Status):显示指定系统内所有HotSpot虚拟机进程(查看JVM进程信息),用于查询正在运行的JVM进程。对于本地JVM进程来说,进程的本地虚拟机ID和操纵系统的进程ID是一只的,也是唯一的。2、测试3、基本语法-q:仅仅显示LVMID,即本地虚拟机原创 2022-01-09 16:38:19 · 975 阅读 · 0 评论 -
JVM调优概述
一、性能优化的步骤1、发现问题-性能监控GC频繁 cup load 过高 OOM 内存泄漏 死锁 程序响应时间长2、排查问题-性能分析打印GC日志,通过GCviewr或者gceasy分析日志信息 命令行工具:jstack、jmap、jinfo等 dump出堆文件,使用内存分析工具分析文件 使用阿里Arthas或者jconsle、JVisualVM来实时查看JVM状态 jstack查看堆、栈信息3、解决问题-性能调优适当增加内存、根据业务场景选择垃圾回收器 优化代码、控原创 2022-01-09 10:37:56 · 86 阅读 · 0 评论 -
类的加载器
一、概述ClassLoader是java核心组件,所有Class都是有ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息的二进制流数据读入JVM内部,转换为一个目标类对应的java.lang.Class对象实例。然后交给JVM进行链接、初始化等操作。因此,ClassLoader在整个装载阶段,只能影响到类的加载,而无法通过ClassLoader去改变链接、初始化的行为。至于他是否可以执行,则由Execution Engine(执行引擎)决定。类的加载方式:显原创 2022-01-08 12:36:58 · 684 阅读 · 0 评论 -
类的加载过程(生命周期)
一、概述生命周期的7个阶段:从使用过程看:最后会在方法区,存在类的模版,之后就可以使用这个类了。二、过程1:Loading阶段(加载)所谓加载,就是将字节码文件加载到机器内存中,并在内存中构建出Java类的原型-类模版对象,其是一个java类在JVM内存中的一个快照,JVM将字节码文件中解析出来的常量池、类字段、类方法都存储到模版中,这样JVM在运行期间可以通过类模版获取到类中的任意信息、遍历成员变量、方法调用。反射机制也基于这个。1、加载完成的操作查找并加载二进制数据,原创 2022-01-06 09:10:25 · 4128 阅读 · 1 评论 -
字节码指令
一、概述字节码对于jvm相当于机器语音对一计算机,属于基本指令。字节码由一个字节长度的代表着某种含义的数字(操作码,Opcode),以及跟随其后的零至多个代表操作所需的参数(操作数,Operands)而构成。由于JVM采用的是操作数栈而不是寄存器的结构,所以大多数指令不包含操作数,只有一个操作码。操作码最多不超过256.1、执行模型2、字节码与数据模型操作指令一般都跟所操作的数据类型有关系,例如:iload就是加载一个int类型数据,同样fload加载一个float类型数据。i代表.原创 2022-01-04 21:32:33 · 1552 阅读 · 0 评论 -
Class文件的概述
一、概述字节码文件的跨平台性Java语言,跨平台语言 编译后的class文件,在不同平台上运行 现在阶段出现的高级语言,基本都是跨平台的语言了,已经成为一门语言的的必选特征了 Java虚拟机,跨语言平台 不与语言进行捆绑,而是和class文件进行捆绑,只要遵循class规范,不论什么语言都可以运行在JVM上 想要让一个java程序正确的在JVM中运行,源码就必须编译成符合规范的字节码 前端编译:java源码->class文件 javac 常用工具之一:词法解析、语法原创 2021-12-17 23:06:09 · 2111 阅读 · 0 评论 -
JVM-垃圾回收器
一、GC分类与性能指标二、不同的垃圾回收期概念1、Serial回收器:串行回收2、ParNew回收器:并行回收3、Parallel回收器:吞吐量优先原创 2021-12-11 11:38:01 · 574 阅读 · 0 评论 -
垃圾回收的相关感念
一、System.gc()的理解调用会触发Full GC,进行垃圾回收释放内存,无法保证对垃圾收集器的调用,无法确定执行时间。二、内存溢出和内存泄漏内存溢出(OOM):没有空间内存,垃圾回收器也无法提供更多的可用内存。可能是堆内存设置不够或者是代码问题。在OOM之前一般情况下都会调用一次GC,当GC后空间还是不足才抛出OOM异常,当然也不是任何情况都调用,当出现一个超大对象,并且超过堆的最大值,那么JVM判断GC也无法解决问题,直接抛出OOM。内存泄漏(Memory Leak):只有对象不再原创 2021-12-05 15:49:00 · 410 阅读 · 0 评论 -
JVM-垃圾回收器的相关算法
一、标记阶段:引用计数算法GC过程:标记阶段、清除阶段(先识别、在清除)垃圾标记阶段:判断对象是否存活二、标记阶段:可达性分析算法三、对象finalization机制四、MAT于JProfiler的GC Roots溯源五、清除阶段:标记-清除算法六、清除阶段:复制算法七、清除阶段:标记-压缩算法八、小结九、分代收集算法十、增量收集算法、分区算法...原创 2021-12-05 11:16:38 · 290 阅读 · 0 评论 -
JVM-垃圾回收概述
一、什么是垃圾关于垃圾收集经典问题:哪些垃圾需要回收 什么时候回收 如何回收垃圾收集什么:运行程序中,没有任何指针指向的对象,这个对象就是需要回收的垃圾。在jdk中垃圾回收器一直在优化。二、为什么需要GC不进行垃圾回收,内存迟早会消耗完,发生溢出 需要JVM整理内存碎片,清理出整片的内存,分配给新对象 没有GC,就无法保证应用程序正常运行三、早期垃圾回收早期的C和C++ 都是手动回收、申请内存的,相对比较灵活。但是增加了代码的复杂度。如果忘记回收可能出现内存泄漏,所谓内存原创 2021-12-03 08:47:04 · 369 阅读 · 0 评论 -
JVM-StringTable
一、String的基本特性String 字符串,用""引起来表示 String s1 = "G1"; String s2 = new String("G1"); String 生命为final,不可被继承 String 实现序列化接口(Serializable)、可排序Conparable<String>、CharSequence jdk1.8 使用char数组进行存储,jdk1.9之后使用byte数组进行存储 String堆空间主要部分,用char存储比用byte存储浪费原创 2021-12-02 09:10:04 · 439 阅读 · 0 评论 -
JVM-执行引擎
一、执行引擎概述JVM核心支撑之一。JVM主要任务就是把字节码加载到内存中在让执行引擎进行执行。执行引擎的任务就是把字节码文件编译成操作系统可识别的的本地机器指令。执行引擎的工作过程:执行引擎在执行过程中究竟需要执行什么样子的字节码指令完全依赖于PC寄存器 每当执行完一项指令操作后,PC寄存器就会更新下一条需要被执行的指令地址 当然方法在执行的过程中,执行引擎有可能会通过存储在局部变量表中的对象引用准确定位到存储在java堆区中的对象实例信息,以及通过对象头中的元数据指针定位到目标对象的类型原创 2021-11-29 22:35:18 · 1743 阅读 · 1 评论 -
对象实例化内存布局和访问定位
一、对象的实例化1、对象创建的方式new:最常见的,用其他方式new 对象 Class的newInstance() :反射的方式(jdk9已过时,只能调用public 空参的构造器) Constructor的newInstance(Xxx):反射的方式,相对灵活 使用clone():不调用任何构造器,类需要实现Cloneable接口 使用反序列化:从文件、网络等获取对象的二进制流 第三方库Objenesis2、对象创建的步骤判断对象对应的类是否加载、连接、初始化(类内存中是否存在)原创 2021-11-24 21:53:49 · 386 阅读 · 0 评论 -
JVM-方法区(元空间)
一、栈、堆、方法区的交互关系从线程共享与否的角度来看:下面一个简单的图示,说明了栈、堆、方法区之间关系:person 对象的引用存放在栈中 new Person() 对象本身存放在堆中 Person 生成的结构,class文件存放在方法区二、方法区的理解方法区是线程共享的,存放的java文件编译后的指令(class)。尽管所有方法区在逻辑上都属于堆的一部分,但一些简单的实现可能不会选择去进行GC或者进行压缩。但是HtoSpotJVM,把方法区叫做Non-Heap,目..原创 2021-11-23 22:41:32 · 991 阅读 · 0 评论 -
JVM-堆空间
一、概念处于运行时数据区,进程唯一的(也就是一个JVM一个)。JVM创建的时候一起被创建,空间大小就确定了,也是JVM最大的一块内存。逻辑上连续、物理上可以不连续。几乎所有的对象和数组都分配在堆上。也是GC主要的区域。大部分内存都共享,会分出来一部分,每个线程独有->TLAB。二、设置堆内存大小与OOM1、堆内存的细分(分代)jdk7之前:新生区+养老区+永久区(方法区)Young Generation Space 新生区 Young/New 又分为Eden区和Sur..原创 2021-11-21 18:46:02 · 1551 阅读 · 0 评论 -
运行时数据区及线程
一、运行时数据区的结构一个有意思的比喻,执行引擎相当于厨师,运行时数据区相当于做饭的材料去,厨师用什么拿什么,做完饭之后需要收拾(GC)。看下面的图:红色部分是同进程声明周期(JVM),灰色区域是同线程声明周期,所以如果村存在5个线程,那么就有5份程序计数器、本地方法栈、虚拟机栈,他们共享一份方法区、堆。针对JVM优化主要就是针对方法区和堆,因为大部分都是垃圾回收都是在堆中进行,JDK8之后,方法区也叫元空间使用的是本地内存,一般情况下不会溢出。一个JVM对应一个Runtime实例.原创 2021-11-18 22:29:55 · 549 阅读 · 1 评论 -
类加载器子系统
是整个JVM的第一部分,主要负责把字节码文件加载到内存中。并且只负责class文件加载。加载的类信息放在称为方法区的内存空间中,处理类信息,方法区还会存放运行时常量池信息,包含字符串和数字常量(这部分常量信息是Class文件常量池部分的内存映射)类加载子系统加载class文件分为三个过程:加载阶段-Loading 根据全限定明获取类的二进制的字节流 将这个字节流所代表的的静态存储结构转化为方法区的运行数据结构 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区.原创 2021-11-08 22:20:45 · 131 阅读 · 0 评论 -
JVM内存结构梳理
简单内存结构如下:又类加载器把class文件加载到内存中 生成一个class对象主要存在到方法区 按照程序的字节码指令,进行一次往下执行详细:1、类加载子系统2、运行时内存区3、执行引擎...原创 2021-11-07 19:26:02 · 57 阅读 · 0 评论 -
JVM的简单介绍
一、整体结构整个JVM可以分为三个部分,以HotSpot虚拟机为例:类加载器(ClassLoader):负责把字节码文件生成Class对象放入内存 运行时数据区:保存Class对象,分为线程共享的方法区、堆,非共享的JVM栈、本地方法栈、程序计数器(PC register) 执行引擎:包括解释执行器、编译器(JTI)、垃圾回收期,负责把字节码转换为机器码二、java代码的执行流程java文件是通过前端编译器(javac等),生成字节码文件(.class)。主流JVM都是解释器和编译器并存的原创 2021-11-05 22:35:49 · 364 阅读 · 0 评论