![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
jvm
文章平均质量分 83
深山猿
不断进化的深山猿
展开
-
rpc接口并发调用实例与方法内部声明线程池导致的oom
问题背景需要根据id通过rpc调用查询具体信息,因为没有提供批量查询的接口,所以做法是挨个遍历查询,那意味着:如果有100个id,就需要顺序进行100次rpc调用,假设每次rpc接口的调用时间是50ms(这个速度很快了),那单单rpc调用就要占用5s,所以接口的响应会非常慢。下面进行优化。优化方案:方案一:让服务方提供批量查询接口,需要服务提供方配合,这里暂不采用。方案二:rpc服务的调用由顺序调用修改为并行调用,采用线程池实现rpc的并发调用。具体实现如下:1)创建线程的类public原创 2020-10-21 09:32:11 · 3354 阅读 · 0 评论 -
fullGC CMS退化为serialGC cmsGC循环发生
Full GC触发条件:(1)System.gc()方法的调用该方法不一定执行,但是执行的时候是fullgc。(2)老年代空间不足老年代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行Full GC后空间仍然不足,则抛出如下错误:java.lang.OutOfMemoryError: Java heap space为避免以上两种状况引起的FullGC,调优时应尽量做到让对象在MinorGC阶段被回收、让对象在新生代多存活一段时间及不要创建过大的对象及数组。(3)方原创 2020-08-19 19:23:19 · 2142 阅读 · 0 评论 -
arthas的使用
写在前面Arthas是阿里爸爸开源出来的一款java监控工具,命令行操作,完全面向开发人员,其专业行令人发指.安装过程wget https://alibaba.github.io/arthas/arthas-boot.jarjava -jar arthas-boot.jar下载完jar包之后需要联网下载相关的jar包,当然这些操作都是arthas-boot.jar自动执行的相关命令介绍由于官方文档给的已经很全了我这里就工作中比较常用的几个命令描述下 NAME转载 2020-08-12 17:06:04 · 278 阅读 · 0 评论 -
机器内存过高定位与机器调整
api机器内存持续很高,60%-70%,成为服务器指标中最差的指标,按道理使用高峰期能达到这个值,低峰期减半(即低于30%)才合适1)内存使用过高定位过程top 找到mem使用最高的进程KiB Mem : 15731936 total, 2667520 free, 9458472 used, 3605944 buff/cacheKiB Swap: 0 total, 0 free, 0 used. 5953500 avail MemPID USE...原创 2020-08-12 15:31:19 · 459 阅读 · 0 评论 -
G1回收器详解
从CMS垃圾回收器缺点说起1)过于占用CPU资源,牺牲吞吐量 -- 所有回收器的通病2)并发清理阶段存在浮动垃圾; -- 并发执行导致3)fgc算法是标记清除,会产生磁盘碎片 -- 标记整理算法导致4)新生代配合ParNewGC使用,存在STW问题。 --- 时间不可控,如果heap很大,可能GC时间很大,影响线上服务G1垃圾收集器一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存(堆内存6G以上)的机器;G1从jdk7开始,jdk9被设为默认垃圾收集器;G1内存分配策..原创 2020-08-12 15:23:51 · 10462 阅读 · 2 评论 -
CPU飙升问题的解决实例
项目使用现象:web项目,页面打开特别慢,反正就是慢。平常打开页面需要0.5s,现在需要3-5秒进入服务器(4核8G内存)查看原因:top发现:但是cpu波动过大,使用平常在 10%左右,会突然飙升到100%、200%甚至300%jmap -heap pid jvm内存已使用99.9%。jstat 发现发生了大量的fullgc.所以即使存在OOM,也是响应很慢,不会停止提供服务...原创 2020-01-10 14:07:01 · 5228 阅读 · 1 评论 -
线程安全 重排序 JMM和happenns-before
线程安全的概念:当存在多线程操作相同的对象时,在java语义之下,无论系统怎么调度和交替执行,最终获取的结果都是相同且正确的,那么就是线程安全。导致线程不安全的两个原因:主内存和线程工作内存数据不一致导致的(JMM结构)代码的重排序导致的JMM(java memory model)抽象结构模型CPU的处理速度和主存的读写速度不是一个量级的,为了平衡这种巨大的差距,每个CPU都会有...原创 2019-10-25 18:10:42 · 266 阅读 · 1 评论 -
JIT和codeCache
jvm解释执行 和 jit(即时编译技术)解释执行:java代码-javac->字节码-interpreter->解释成机器码执行jit(即时编译):java代码-javac->字节码-JITcompile->机器指令并存储说明:单次执行上jit会更加耗时,所以此时使用简单的解释执行,但是如果某段代码被多次重复执行,jit编译后的机器指令可以直接使用,而解释执行则需...原创 2019-10-24 21:39:14 · 2015 阅读 · 0 评论 -
查看jvm内存状态的方式 -NMT证明jvm内存多样性
查看jvm内存状态的方式1 图形化工具,如Jconsole、VisualVM2 指令 jps jmap -heap/dump jstack3 gc日志4 NMTNMT详解NMT特性可以用于展示jvm所有占用的内存使用,开启NMT并选择summary模式,-XX:NativeMemoryTracking=summary;为了方便获取和对比 NMT 输出,选择在应用退出时打印 NMT...原创 2019-10-24 21:24:08 · 1526 阅读 · 0 评论 -
OOM异常会导致JVM退出吗?
最近发现bi项目,5月6号有OOM错误,并且有dump文件生成,奇怪的是tomcat没有挂掉。即使发生了oom,程序也不一定会挂?jvm回收成功就可以。一、问题来源一次生产事故,由于一次性从数据库查询过多数据导致***线程*** OOM:Java heap space 异常(千万级表,JVM堆内存2G),但是在线程OOM发生时,java进程却没有立即挂掉。不符合所谓发生OOM,程序就会挂...转载 2019-06-11 15:33:58 · 5703 阅读 · 0 评论 -
bi项目oom调优
先简单介绍下项目:数据展示项目,合计有2千张页面,200多人使用,目前部分报表数据量较大,所以sql查询结果出来的也较慢。jvm内存oom,jvm自己宕掉,怎么确定是oom导致的呢?oom的几种表现形式:1)tomcat的catalina.outh中有异常日志,如执行cat catalina.out | grep OutOf,有类似如下结果22-Apr-2019 11:13:32.1...原创 2019-09-20 14:56:12 · 302 阅读 · 0 评论 -
sql查询结果太大导致oom解决方案
执行的查询sql结果集太大,导致oom的现象很常见,下面是一些解决方案条数限制的逻辑限制最多查询10万条,设置maxRow为10万+1条,如果实际查询到的rowNum为10万+1,那么说明超过最大限制条数,报错 public static int resultLimit = 100000; statement.setMa...原创 2019-05-27 11:40:42 · 10195 阅读 · 0 评论 -
java对象加载的过程,有哪些类加载器?双亲委派模型,为什么使用双亲委派模型,如何自定义类加载器?什么时候自定义?
java类的加载需要经历以下过程1) 编译:.java文件编译后生成.class字节码文件2) 加载:类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JVM内部,并存储在运行时内存区的方法区,然后将其转换为一个与目标类型对应的java.lang.Class对象实例3) 链接 : 原始的类信息平滑的转入jvm的过程验证:格式(class文件规范) 语义(final类是否有子...原创 2017-09-27 17:55:06 · 4287 阅读 · 3 评论 -
jvm堆中对象存活算法,内存泄漏,垃圾回收算法
首先说面:下面所有内容都是针对jvm 中堆区域。堆里面对象的回收jvm自动帮我们实现的,但是我们也需要了解其原理。jvm堆中对象存活算法及其优缺点1 引用计数算法给对象增加引用计数器,每当有一个地方引用它时,计数器值加1;引用失效时,计数器值减1。当计数器的值为0时,代表可以回收了。但是很难解决对象之间的相互循环引用.2 可达性分析算法以一些称为”GC ROOTS”的节点作为起点,从...原创 2019-02-15 15:52:37 · 240 阅读 · 0 评论 -
java 强 软 弱 虚引用的理解正确使用
1、强引用(StrongReference)强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。如:Object o=new Object(); // 强引用当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。如果不使用时,要通过如下方式来弱化引...转载 2018-12-02 12:52:01 · 7135 阅读 · 0 评论 -
jvm的垃圾回收过程讲解,字符字节位,jvm几个面试题
了解java虚拟机堆内存的分配策略堆内存: 新生代(1个eden+2个survior)+老生代New的对象首先进入eden中,经历一次minorGC后,如果对象还在则进入survior区域;其后每经过一次minorGC则会存活次数增加一个,到达一定的程度后进入老生代块中;minorGC:对新生代堆块进行垃圾回收,因为此时大多数的对象都是朝生夕死,所以使用复制算法;fullGC:对老生代区...原创 2019-02-15 17:05:46 · 408 阅读 · 0 评论 -
Jdk8-从持久代到metaspace
了解持久代持久代作用:持久代是在方法区(静态区)中,用以加载和存放class文件,存放类信息。常量池与持久代:jdk7开始,常量池已经不在持久代之中进行分配了,而是移到了堆中。持久代内存获取:持久代因为是方法区的一部分,所以其占用的内存是从jvm内存中获取的持久代移除过程1.7之前 常量池存在于方法区(持久代)1.7 常量池从方法区移到堆中1.8 移除持久代,设置metaspa...原创 2019-02-22 15:33:06 · 630 阅读 · 0 评论 -
jvm各种回收器,各自优缺点,重点CMS、G1
串行、并行与并发下面2个名词都是并发编程中的概念,在谈论垃圾收集器的上下文语境中,它们可以解释如下:串行:单个线程执行垃圾回收,并且此时用户线程仍然处于等待状态。 并行:指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。 并发:指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上。新生代回收器:Seri...原创 2019-02-19 15:14:17 · 16139 阅读 · 1 评论 -
jvm内存配置、参数,实例解析,5种内存溢出种类及原因分析
jvm配置参数查看ps -ef | grep tomcat 结果:work 31591 1 4 May16 ? 02:00:01 /data/j2sdk/bin/java -Djava.util.logging.config.file=/data/bi/tomcat/conf/logging.properties -*********jvm参数配置方法...原创 2019-02-20 10:31:51 · 3145 阅读 · 0 评论 -
jvm指令,jvm内存溢出实例,JConsole和MAT分析使用,NewRatio无效
jvm相关的指令简单解析jps :JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。命令格式jps [options] [hostid]option参数-l : 输出主类全名或jar路径-q : 只输出LVMID-m : 输出JVM启动时传递给main()的参数-v : 输出JVM启动时显示指定的JVM参数其中[option]、[ho...原创 2019-02-20 16:50:30 · 858 阅读 · 1 评论 -
gc日志获取与分析
GC日志获取GC参数JVM的GC日志的主要参数包括如下几个:-XX:+PrintGC 输出GC日志-XX:+PrintGCDetails 输出GC的详细日志-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2017-09-04T21:53:59.234+0800)-XX...原创 2019-02-20 19:16:38 · 2860 阅读 · 0 评论 -
jvm内存分配,OS的内存和磁盘,堆栈优缺点对比,常量池
为什么需要jvm,jvm的作用jvm:Java Virtual Machine,即java虚拟机,来模拟通用的计算机,有着一套虚拟的完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。 JVM是一种规定好的标准规范, 定义了.class文件在其内部运行的相关标准和规范。有了jvm才能执行.class文件,java程序才能正常执行。jvm内存划分及存储的内容共分为6个部分:...原创 2019-02-15 12:01:45 · 1037 阅读 · 2 评论