
jvm
文章平均质量分 86
jvm
爱上口袋的天空
一步一流年,止不住的脚步,挽不回的青春!
展开
-
JVM内存模型和JMM(Java内存模型)的异同
JVM内存模型和JMM(Java内存模型)不是一回事。JMM的目的是为了解决Java多线程对共享数据的读写一致性问题,通过Happens-Before语义定义了Java程序对数据的访问规则,修正之前由于读写冲突导致的Cache数据不一致的问题。具体到Hotspot VM的实现,主要是由OrderAccess类定义的一些列的读写屏障来实现JMM的语义。JVM内存模型则是指JVM的内存分区。JMM的目的是为了解决Java多线程对共享数据的读写一致性问题,通过。转载 2021-08-31 23:11:38 · 511 阅读 · 0 评论 -
JVM主要组成部分及其作用
除了 BootstrapClassLoader 其他类加载器均由 Java 实现且全部继承自java.lang.ClassLoader。如果我们要自定义自己的类加载器,很明显需要继承 ClassLoader抽象类。类有两个关键的方法:加载指定二进制名称的类,实现了双亲委派机制。name 为类的二进制名称,resolve 如果为 true,在加载时调用 resolveClass(Class c) 方法解析该类根据类的二进制名称来查找类,默认实现是空方法建议的子类重写方法而不是方法。转载 2023-10-14 11:53:48 · 330 阅读 · 0 评论 -
while(true)导致的cpu过高问题
可以这样理解:当切换到别的进程时,别的进程告诉系统自己没什么事情要做,不需要那么多的时间,这个时候系统就会切换到下一个进程,直到回到这个死循环的进程上,而这个进程无论什么时候都再循环,所以一直会报告有事情要做,系统就会把尽可能多的时间分给他。一个进程如果是死循环,那么占有的CPU会很高,可以操作系统时间片运行的,到了一定时间不是会自动切换到别的进程吗?他的服务是一个dubbo服务,放在一个java项目中的,为了保证dubbo服务不退出,在启动dubbo服务后,他添加了。到时候的确会切换到别的进程。转载 2023-08-25 17:24:49 · 653 阅读 · 0 评论 -
Java 应用程序的 CPU 使用率飙升原因分析
线程称为轻进程,共享进程资源,因此线程调度在 CPU 中也是分时的。但是在 Java 中,我们使用 JVM 进行线程调度,所以一般来说,线程的调度有两种模式:分时调度和抢占式调度。:首先,无限循环会调用CPU寄存器进行计数,这个操作会占用CPU资源。除非操作系统时间片到期,否则无限循环不会放弃占用的CPU资源,并且无限循环会继续向系统请求时间片,直到系统没有空闲时间做其他事情。人们常说,计算密集型程序就是 CPU 密集型的,那么,Java 应用程序中有哪些操作是计算密集型的呢?:CPU 的空闲时间。转载 2023-08-25 17:14:46 · 1879 阅读 · 0 评论 -
PDFBox占用过多内存的BUG
使用PDFBox将超过80页的PDF文件转图片时,会占用很多的内存,期间还执行多次垃圾回收但是没啥子用。最近使用pdfbox 导入发现内存使用占用特别高,通过查阅官方资料发现pdfbox 在处理一些复杂的pdf 消耗内存特别高,这个是没法避免的,内存设置小的很有可能导致内存溢出。但它提供了一些可以减少内存使用的方案。具体代码就不写了,我从几个维度罗列一下。给大家使用pdfbox 后期做优化参考。这个默认使用的软引用如图:软引用是在内存即将溢出才会回收,所以也会生命周期会一直占用内存。转载 2023-08-19 21:10:32 · 2671 阅读 · 0 评论 -
jstack问题定位分析
主要是用于生成java虚拟机当前时刻的线程快照,线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环,请求外部资源导致的长时间等待等。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程在后台做什么事,或者等待什么资源。自带的一种堆栈跟踪工具。死锁:两个线程互相得到锁1、锁2,然后线程1等待线程2释放锁2,线程2等待线程1释放锁1.两者互相等待释放,于是就产生了死锁。转载 2023-08-19 20:45:07 · 462 阅读 · 0 评论 -
Druid连接池的监控stat造成内存泄漏
阿里的Druid连接池可以对sql进行监控。但是监控信息会存储在内存中,某些场景下会造成内存泄漏。转载 2023-08-19 20:34:15 · 1757 阅读 · 0 评论 -
惨遭DruidDataSource和Mybatis暗算,导致OOM
问题还没解决干净,但是这次的现象却有点不一样。一个平凡的工作日,我像往常一样完成产品提出的需求的业务代码,突然收到了监控平台发出的告警信息。异常的位置,由于对其印象深刻,所以这次直接看看Dump文件(由于Dump文件比较大,线上的被清除了,而我也忘记备份,所以这份文件是我时候场景还原的时候生成的)。列表由原来的几十几百个id变成了上万个,就我看的报错信息这里的日志打印出来这个list的大小就有三万多个。从这个线程的高占用内存情况来看,有几个是String类型的,是拼接SQL后的语句,这些是必不可少的。转载 2023-08-19 18:59:29 · 946 阅读 · 0 评论 -
JVM监控及诊断工具之Eclipse MAT
1、简介MAT(Memory Analyzer Tool)工具是一款功能强大的Java堆内存分析器。可以用于查找内存泄露以及查看内存消耗情况。MAT是基于Eclipse开发的,不仅可以单独使用,还可以作为插件的形式嵌入在Eclipse中使用。是一款免费的性能分析工具,使用起来非常方便。MAT可以分析heap dump文件。在进行内存分析时,只要获得了反映当前设备内存映像的hprof文件,通过MAT打开就可以直观地看到当前的内存信息。一般来说,这些内存信息包含:所...原创 2021-12-08 22:23:30 · 909 阅读 · 1 评论 -
JVM之执行引擎
1、概述执行引擎是Java虚拟机核心的组成部分之一 “虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。 JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM所.转载 2021-09-27 21:31:10 · 162 阅读 · 0 评论 -
JVM之内存泄露
一、内存泄露的理解与分析二、Java中内存泄露的8种情况1、静态集合类2、单例模式3、内部类持有外部类4、各种连接,如数据库连接、网络连接和IO连接等5、变量不合理的作用域6、改变哈希值测试代码如下:...原创 2021-12-13 21:34:12 · 353 阅读 · 0 评论 -
jvm之StringTable(字符串常量池)
1、String的基本特性String:字符串,使用一对 “” 引起来表示 String s1 = "atguigu" ; // 字面量的定义方式String s2 = new String("hello"); // new 对象的方式 String被声明为final的,不可被继承 String实现了Serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示String可以比较大小 String在jdk8及以前内部定义了final c转载 2021-10-05 22:54:06 · 391 阅读 · 0 评论 -
jvm 性能调优工具之 jinfo命令详解
一、jinfo1、简介 jinfo(Configuration Info for Java) 查看虚拟机配置参数信思,也可用于调整虚拟机的配置参数。 在很多情况下,Java应用程序不会指定所有的Java虚拟机参数。而此时,开发人员可能不知道某一个具体的Java虚拟机参数的默认值。在这种情况下,可能需要通过查找文档获取某个参数的默认值。这个查找过程可能是非常艰难的。但有了 jinfo工具,开发人员可以很方便地找到Java虚拟机参数的当前值。jinfo不仅可以查看运...原创 2021-11-27 12:15:18 · 15359 阅读 · 0 评论 -
JVM监控及诊断工具-命令之jstack
一、简介jstack( JVM Stack Trace):用于生成虚拟机指定进程当前时刻 的线程快照(虚拟机堆栈跟踪 )。线程快照就是当前虚拟机内指定进程的每一条线程正在执行的 方法堆栈的集合生成线程快照的作用:可用于定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等问题。这些都是导致线程长时间停顿的常见原因。当线程出现停顿时,就可以用jstack显示各个线程调用的堆栈情况。在thread dump中,要留意下面几种状态死锁,,Deadlock(重点关注)等待资原创 2021-11-30 23:08:43 · 1264 阅读 · 0 评论 -
JVM之垃圾回收相关概念
1、System.gc() 的理解在默认情况下,通过System.gc()者Runtime.getRuntime().gc() 的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。 然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用(不能确保立即生效) JVM实现者可以通过System.gc() 调用来决定JVM的GC行为。而一般情况下,垃圾回收应该是自动进行的,无须手动触发,否则就太过于麻烦了。在一些特殊情况下,如我们正在编写一个性转载 2021-10-11 22:56:10 · 216 阅读 · 0 评论 -
JVM监控及诊断工具-命令之jmap
1、简介jmap:导出内存映像文件&内存使用情况jmap( JVM Memory Map):作用一方面是获取dump文件(堆转储快照文件,二进制文件),它还可以获取目标Java进程的内存相关信息,包括Java堆各区域的使用情况、堆中对象的统计信息、类加载信息等开发人员可以在控制台中输入命令“jmap -help”查阅jmap工具的具体使用方式和一些标准选项配置一般来说,使用jmap指令生成dump文件的操作算得上是最常用 的jmap命令之一,将堆中所有 存活对象导出至一个文件之中原创 2021-11-29 22:14:57 · 1996 阅读 · 0 评论 -
JVM之垃圾回收器
1、GC 分类与性能指标1.1、垃圾回收器概述垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。 由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。 从不同角度分析垃圾收集器,可以将GC分为不同的类型。1.1.1、Java不同版本新特性语法层面:Lambda表达式、switch、自动拆箱装箱、enum、泛型 API层面:Stream API、新的日期时间、Optional、String、集合框架 底层优化:JVM优化、GC的转载 2021-10-24 12:15:33 · 2805 阅读 · 0 评论 -
JVM监控及诊断工具-命令之jhat
1、jhat:JDK自带堆分析工具基本情况jhat(JVM Heap Analysis Tool)Sun JDK提供的jhat命令与jmap命令搭配使用,用于分析jmap生成的 heap dump文件(堆转储快照)。jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,用户可以在浏览器中查看分析结果(分析虚拟机转储快照信息)。使用了jhat命令,就启动了一个http服务,端口是7000,Bihttp://localhost:7000/就可以在浏览器里分析。说明:jhat命令.原创 2021-11-29 22:43:51 · 3348 阅读 · 0 评论 -
JVM监控及诊断工具-命令之jcmd
1、简介 在JDK1.7以后,新增了一个命令行工具jcmd它是一个多功能的工具,可以用来实现前面除jsat之外所有命令的功能。比如:用它来导出堆、内存使用、查看]ava进程、导出线程信息、执行GC、JVM运行时间等。 jcmd拥有jmap的大部分功能,并且在Oracle的官方网站上也推荐使用jcmd命令代jmap命令2、命令:jcmd -l可以查看当前正在运行的所有JVM进程,和jps有点类似3、命令:jcmd pidPerfCounter....原创 2021-12-01 21:29:04 · 857 阅读 · 0 评论 -
对象在JVM中是怎么存储的?
对象通过new反射clone等方式创建完毕后被存储到堆中,那么对象是以什么样的方式存储在堆中的?当虚拟机遇到一条new字节码指令时,会先检查这个类型是否已经加载。如果还没有,就进行类加载过程,类加载检查通过后,虚拟机将为新生对象分配内存。一个对象所需的内存大小,在类加载完成后就可以确定下来,所以只需要把一块确定大小的内存从堆中划分出来。类型检查、分配内存、初始化零值、设置对象头、执行构造方法遇到new关键字,先检查这个指令的参数是否能在常量池中找到该类型的符号引用。转载 2021-09-20 20:43:51 · 268 阅读 · 0 评论 -
JVM内存新生代Eden区和Survivor区的比例是多少?为什么JVM新生代需要两个Survivor区?
JVM内存新生代Eden区和Survivor区的比例是8:1:1,其中,Eden区占用80%,Survivor占用20%,并且划分为大小相同的两部分,这样划分的原因是为了的问题。原创 2021-09-11 12:27:18 · 2063 阅读 · 0 评论 -
JVM监控及诊断工具-命令之jstat
一、jps (Java Process status)查看正在运行的Java进程启动如下程序:参数: -q: 仅显示ID -l 输出程序的全限定名 -m 输出进程启动时传递给main的参数 -v 列出JVM参数 通过jps名称查看进程详细信息:1、jps2、jps -q3、jps -l4、jps -m 在idea上添加参数5、jps -v 在idea上设置一下jvm参数 注意:...原创 2021-11-26 22:38:16 · 1811 阅读 · 0 评论 -
JVM之垃圾回收概述和相关算法
1、垃圾回收概述Java 和 C++语言的区别,就在于垃圾收集技术和内存动态分配上,C++语言没有垃圾收集技术,需要程序员手动的收集。 垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生 关于垃圾收集有三个经典问题: 哪些内存需要回收? 什么时候回收? 如何回收? 垃圾收集机制是Java的招牌能力,极大地提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展,Java的垃圾收集机制仍然在不断的演转载 2021-10-08 22:52:03 · 259 阅读 · 0 评论 -
JVM之对象的实例化内存布局与访问定位
1.对象的实例化1.1创建对象的方式new:最常见的方式、单例类中调用getInstance的静态类方法、XXXFactory的静态方法 Class的newInstance方法:反射的方式,在JDK9里面被标记为过时的方法,因为只能调用空参构造器,并且权限必须为 public Constructor的newInstance(Xxxx):反射的方式,可以调用空参或带参的构造器,权限没有要求 使用clone( ):不调用任何的构造器,要求当前的类需要实现Cloneable接口中的clon..转载 2021-09-19 22:27:05 · 124 阅读 · 0 评论 -
JVM监控及诊断工具之JConsole以及Visual VM
一、图形化工具主要分为以下两类1、JDK自带的工具jconsole:JDK自带的可视化监控工具。查看Java应用程序的运行概况、监控堆信息、永久区(或元空间)使用情况、类加载情况等 Visual VM:VIsual VM是一个工具,它提供了一个可视界面,用于查看Java虚拟机上运行的基于Java技术的应用程序的详细信息。 JMC:Java Mission Control,内置Java Flight Recorder。能够以极低的性能开销收集Java虚拟机的性能数据。2、第三方工具MAT:原创 2021-12-05 19:48:34 · 1038 阅读 · 0 评论 -
JVM之直接内存
1.直接内存概述不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。 直接内存是在Java堆外的、直接向系统申请的内存区间。 来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存 通常,访问直接内存的速度会优于Java堆。即读写性能高 因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存 Java的NIO库允许Java程序使用直接内存,用于数据缓冲区 代码示例/** * IO NIO转载 2021-09-20 20:23:18 · 271 阅读 · 0 评论