
java虚拟机
自由圣骑士
喜欢学习、喜欢接近新事物。
展开
-
java执行反射代码导致频繁创建奇怪的类从而发生元数据区被占满FUllGc案例
查看 JVM GC 日志没有一丝耽搁,老王立刻调出了线上GC日志,在日志里,看到了一个“Metadata GC Threshold”的字样,类似于如下日志:【Full GC(Metadata GC Threshold)xxxxx, xxxxx】通过GC日志,老王立即定位到这次频繁的Full GC,实际上是JDK 1.8以后的Metadata元数据区导致的。奇怪了,Metadata区域一般是放一些加载到JVM里去的类,为什么会被频繁的塞满,进而触发Full GC呢?老王陷入了沉思,一旁的小猛和彪转载 2020-07-03 13:49:07 · 3987 阅读 · 2 评论 -
Java GC:干掉 cms,zgc 才是未来
JAVA程序最爽的地方是它的GC机制,开发人员不需要关注内存申请和回收问题。同时,JAVA程序最头疼的地方也是它的GC机制,因为掌握JVM和GC调优是一件非常困难的事情。在ParallelOldGC、CMS、G1之后,JDK11带来的全新的「ZGC」为我们解决了什么问题?Oracle官方介绍它是一个Scalable、Low Latency的垃圾回收器。所以它的目的是「降低停顿时间」,由此会导致吞吐量会有所降低。吞吐量降低问题不大,横向扩展几台服务器就能解决问题了啦。ZGC目标如下图所示,ZGC的目标主转载 2020-06-09 10:56:36 · 256 阅读 · 0 评论 -
JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof 使用详解
现实企业级Java应用开发、维护中,有时候我们会碰到下面这些问题:OutOfMemoryError,内存不足内存泄露线程死锁锁争用(Lock Contention)Java进程消耗CPU过高…这些问题在日常开发、维护中可能被很多人忽视(比如有的人遇到上面的问题只是重启服务器或者调大内存,而不会深究问题根源),但能够理解并解决这些问题是Java程序员进阶的必备要求。本文将对一些常用的JVM性能调优监控工具进行介绍,希望能起抛砖引玉之用。一、 jps(Java Virtual Machine转载 2020-05-25 10:36:04 · 298 阅读 · 0 评论 -
神奇的 perfma:一站式解决所有 JVM 疑难杂症!
每一个Java程序员应该都碰到过或多或少的JVM问题,比如:一台8G的服务器怎么配置JVM参数?我的JVM参数是否合理?如何分析内存Dump文件?如何分析线程Dump文件,想看一些高质量的JVM相关的文章等等。如果你从来没有碰到过这些问题,那你真的不能算是一个合格的Java程序员!JVM参数分析这是PerfMa公司推出的第一款产品,为用户学习和使用JVM参数提供便利。即使不太懂JVM参数的初...原创 2020-04-09 14:14:29 · 19537 阅读 · 1 评论 -
java的反射机制与通过反射创建对象的四种方式
java的反射机制与通过反射创建对象的四种方式原创 2019-11-26 16:40:48 · 263 阅读 · 0 评论 -
Tomcat性能调优和JVM的性能调优
1、Tomcat性能调优找到Tomcat根目录下的conf目录,修改server.xml文件的内容。对于这部分的调优,我所了解到的就是无非设置一下Tomcat服务器的最大并发数和Tomcat初始化时创建的线程数的设置,当然还有其他一些性能调优的设置。下图是我根据我机子的性能设置的一些参数值,给各位详细解释一下吧:1、URIEncoding=“UTF-8”:设置Tomcat的字符集。这种配...原创 2019-09-16 14:17:50 · 461 阅读 · 0 评论 -
通过简单的代码去讲解jvm的实现原理与运行机制
1、区域划分jvm的区域划分如下所示:大致就是分为:程序计数器,虚拟机栈,堆,方法区,本地方法栈,这几个部分。接下来我们从自己写好的Java代码如何通过JVM来运行的角度,来分析一下JVM里这些区域是如何支撑我们的Java代码跑起来的。2、程序计数器假设我们有如下的一个类,就是最最基本的一个HelloWorld而已:public class HelloWorld { ...原创 2019-09-10 14:38:26 · 246 阅读 · 0 评论 -
频繁的反射代码的执行导致方法区满了触发FullGC 线上惨案的分析、排查、解决
1、本文背景本文会给大家讲解一个比较特殊的JVM优化案例,这个优化案例本身是因为新手工程师对JVM优化可能了解了一个半吊子,然后不知道从哪里找来了一个非常特殊的JVM参数错误的设置了一下,就导致线上系统频繁的出现Full GC的问题。但是我们后续大量的优化案例其实都是各种各样奇形怪状的场景,因为正是各种奇怪场景才能让大家逐步积累出来较为丰富的JVM优化实战经验了解的场景越多,自己未来在处理J...原创 2019-09-10 14:12:05 · 2650 阅读 · 3 评论 -
扒一扒 JVM 的垃圾回收机制,拿大厂offer少不了它!
1、技术背景先了解一波按照套路是要先装装X,谈谈JVM垃圾回收的前世今生的。说起垃圾回收(GC),大部分人都把这项技术当做Java语言的伴生产物。事实上,GC的历史比Java久远,早在1960年Lisp这门语言中就使用了内存动态分配和垃圾回收技术。2、 哪些内存需要回收?猿们都知道JVM的内存结构包括五大区域:程序计数器、虚拟机栈、本地方法栈、堆区、方法区。其中程序计数器、虚拟机栈、本地...原创 2019-09-10 13:35:13 · 108 阅读 · 0 评论 -
java相关的流程图
1、spring的生命周期Spring作为当前Java最流行、最强大的轻量级容器框架,了解熟悉spring的生命周期非常有必要;1、首先容器启动后,对bean进行初始化。2、按照bean的定义,注入属性。3、检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给bean,如BeanNameAware等。4、以上步骤,bean对象已正确构造,通过实现BeanPos...原创 2019-08-31 11:55:19 · 212 阅读 · 0 评论 -
Java中的clone克隆方法
Java中对象的创建clone 顾名思义就是 复制 , 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。我们回顾一下:在java语言中,有几种方式可以创建对象呢?使用new操作符创建一个对象使用clone方法复制一个对象那么这两种方式有什么相同和不同呢?new操作符的本意是分配内存。程序...原创 2019-08-12 15:01:07 · 259 阅读 · 0 评论 -
一次 jvm 的 Full GC 导致的工作线程卡顿造成系统A宕机问题
1、业务场景简单来说,这是一套分布式系统,系统A需要将一个非常核心以及关键的数据通过网络请求,传输给另外一个系统B。所以这里其实就考虑到了一个问题,如果系统A刚刚将核心数据传递给了系统B,结果系统B莫名其妙宕机了,岂不是会导致数据丢失?所以在这个分布式系统的架构设计中,采取了非常经典的一个 Quorum 算法。1.1、Quorum 算法这个算法简单来说,就是系统B必须要部署奇数个节点,比...原创 2019-08-20 11:32:12 · 1729 阅读 · 0 评论 -
java虚拟机的性能调优
JVM内存调优对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数。Full GC** Full GC会对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个堆进行回收,所以比较慢,因此应该尽可能减少Full GC的次数。**导致Full GC的原因年老代(Tenured)被写满调优时尽量让对象在新生代GC时被回收、让对象在新生代...原创 2019-08-02 14:38:40 · 445 阅读 · 0 评论 -
Minor GC、Major GC、Full GC
Minor GCJVM堆内存被分为两部分:年轻代(Young Generation)和老年代(Old Generation)。年轻代年轻代是所有新对象产生的地方。当年轻代内存空间被用完时,就会触发垃圾回收。这个垃圾回收叫做Minor GC。年轻代被分为3个部分——Enden区和两个Survivor区。年轻代空间的要点:大多数新建的对象都位于Eden区。当Eden区被对象填满时,就会执行...原创 2019-08-02 11:48:15 · 352 阅读 · 0 评论 -
java垃圾回收机制
什么是垃圾回收垃圾回收(Garbage Collection,GC),顾名思义就是释放垃圾占用的空间,防止内存泄露。有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。Java 语言出来之前,大家都在拼命的写 C 或者 C++ 的程序,而此时存在一个很大的矛盾,C++ 等语言创建对象要不断的去开辟空间,不用的时候又需要不断的去释放控件,既要写构造函数,又要写析...转载 2019-08-05 19:11:45 · 128 阅读 · 0 评论 -
JVM的内存结构
JVM内存结构由上图可以清楚的看到JVM的内存空间分为3大部分:堆内存方法区栈内存其中栈内存可以再细分为java虚拟机栈和本地方法栈,堆内存可以划分为新生代和老年代,新生代中还可以再次划分为Eden区、From Survivor区和To Survivor区。其中一部分是线程共享的,包括 Java 堆和方法区;另一部分是线程私有的,包括虚拟机栈和本地方法栈,以及程序计数器这一小部分内存...原创 2019-08-02 19:25:37 · 154 阅读 · 0 评论 -
垃圾收集算法
标记清除算法标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。在标记阶段首先通过根节点(GC Roots),标记所有从根节点开始的对象(从GCRoots开始可以到达的对象),未被标记的对象就是未被引用的垃圾对象。然后,在清除阶段,清除所有未被标记的对象。适用场合:存活对象较多的情况下比较高效适用于年老代(即旧生代)缺点:容易产生内存碎片,再来一个比较大的对象时(典型情况:该...原创 2019-08-02 17:58:45 · 129 阅读 · 0 评论 -
垃圾收集器
JVM垃圾收集器发展历程第一阶段,Serial(串行)收集器在jdk1.3.1之前,java虚拟机仅仅能使用Serial收集器。 Serial收集器是一个单线程的收集器,但它的“单线程”的意义并不仅仅是说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。第二阶段,Parallel(并行)收集器Parallel收...原创 2019-08-02 16:42:08 · 490 阅读 · 0 评论