jvm
文章平均质量分 51
CmdSmith
这个作者很懒,什么都没留下…
展开
-
堆内存溢出定位(Heap Dump)
使用 MAT 和 VisualVM 分析 heap dump 文件,定位堆内存溢出位置原创 2023-02-07 09:45:10 · 3586 阅读 · 0 评论 -
CPU过高问题定位(Thread Dump)
打开 Java Mission Control,查看线程一栏。(远程要打开 JMX,不然 JMC 连不了)原创 2023-02-05 22:25:15 · 975 阅读 · 0 评论 -
Visual VM 的 Visual GC 插件
visual vm 的 visual gc 插件原创 2023-02-04 15:57:32 · 180 阅读 · 0 评论 -
如何选择垃圾收集器?
如何选择垃圾收集器?原创 2023-02-03 10:12:18 · 181 阅读 · 0 评论 -
垃圾收集算法
普遍适用于所有垃圾回收算法的 JVM 调优标志包括如何选择堆的大小,如何选择代的大小,如何开启和设置 GC 日志,等等。这些基础的调优标志已经足以应付大多数的场景。当它们无法解决问题时,往往需要查看使用的 GC 算法中具体是哪些操作影响了性能,进一步判断如何调整对应的参数,从而最大程度地减少 GC 操作对应用程序性能的影响。调优特定收集器最要紧的信息是启动垃圾收集器后 GC 日志中的数据。还有一些其他的因素也会影响几乎所有垃圾回收算法的性能,包括分配巨型对象、对象的生命周期既不长又不短,等等。6.1原创 2021-07-12 18:09:16 · 756 阅读 · 1 评论 -
Oracle JDK 垃圾收集调优
使用 Oracle 的 JDK 时,垃圾收集性能调优的目标是减少执行 Full GC 周期所需的时间。不应该尝试调整 JVM 来最小化 Full GC 的频率,因为这通常会导致在必须要强制执行Full GC时需要长达数秒才能完成。在生产服务器的整个生命周期内实现较短垃圾收集时间的最简单和最可靠的方法是使用固定堆大小的收集器和并行年轻代收集器,将新生代大小限制为总堆的最多三分之一。Oracle 建议使用垃圾优先 (G1) 垃圾收集器。对于大多数生产引擎服务器(production engine serv翻译 2021-06-10 11:56:46 · 148 阅读 · 0 评论 -
CMS 并发模式失效(Concurrent mode failure)回退到 serial old 收集器
我正在分析 GC 暂停问题,我注意到当 CMS 使用并且并发模式失败或手动触发 GC(通过 System.gc( )) 使用的 STW 收集器似乎不是并行的。(我知道 ExplicitGCInvokesConcurrent 标志,但它不会解决并发故障)。我尝试使用 -XX:ParallelGCThreads=… -XX:ParallelCMSThreads=… 但它们似乎没有效果。我是从下面的 GC 日志行中推断出来的24.904: [Full GC (System) 24.904: [CMS.翻译 2021-06-04 13:49:17 · 956 阅读 · 0 评论 -
为什么清理年轻代比清理老年代更快
可以更快地清理 eden 的原因很简单:算法与 eden 空间中会在 GC 中幸存的对象数量成正比,而不与整个堆中的存活对象数量成正比。换句话说,如果你在 eden 中有 99% 的平均对象死亡率(即:99% 的对象无法在 GC 中存活,这不是不正常的),你只需要 look 并 copy 那 1%。对于Full GC,需要marked/swept完整堆中的所有活动对象。显然代价更为昂贵。...翻译 2021-06-04 11:22:35 · 121 阅读 · 0 评论 -
垃圾收集入门
现代 JVM 的类型繁多,最主流的四个垃圾收集器分别是:Serial 收集器(常用于单 CPU 环境)、Throughput(或者 Parallel)收集器、Concurrent 收集器(CMS)和 G1 收集器。垃圾收集概述垃圾回收的步骤:找到不再使用的对象、回收它们使用的内存、对堆的内存布局进行压缩整理。按逻辑将线程分为应用程序线程和处理垃圾收集的线程。垃圾收集器回收对象,或者在内存中移动对象时,必须确保应用程序线程不再继续使用这些对象。这一点在收集器移动对象时尤其重要:在操作过程中,对象的内存原创 2021-05-14 18:59:22 · 182 阅读 · 0 评论 -
百分位数(Percentiles)vs 平均数(averages)
与平均数(averages)相比,百分位数(Percentiles)更能体现应用程序响应时间的连贯性(consistent)。当平均响应时间似乎非常长并且单个数据看起来正常时,百分位数对于分析性能非常有用,且不会受到异常缓慢请求的影响。百分位数非常适合用于趋势分析、SLA 协议监控和日常性能评估。比如平均工资和中位数工资。...原创 2021-06-03 17:20:41 · 2276 阅读 · 0 评论 -
JDK 1.7.0_04 及更高版本(包括 Java 8 和 Java 9)提供的 Oracle JVM 垃圾收集器
随着 G1 终于在 1.7.0_04(Java 7 更新 4)版本中得到正式支持——即不再是实验性垃圾收集器,值得评估一下我们现在在 Sun JVM 中可用的垃圾收集器。以下所有详细信息都特别与 1.7.0_04 之后的 Sun JVM 相关。现在有七种主要的垃圾收集算法,其中一种(PS Scavenge)有两种截然不同的模式,我将它们称为两种不同的算法(即,有和没有自适应(adaptive) GC),另一种(并发收集器 the concurrent collector)有大量的选项,这使得它实际上至少有翻译 2021-06-03 13:59:36 · 272 阅读 · 0 评论 -
-XX:+ParallelGC 和 -XX:+ParallelOldGC 有什么区别?
Take a look at the HotSpot VM Options:-XX:+UseParallelGC = Use parallel garbage collection for scavenges. (Introduced in 1.4.1).-XX:+UseParallelOldGC = Use parallel garbage collection for the full collections. Enabling this option automatically sets -XX:原创 2021-06-02 18:43:31 · 1097 阅读 · 0 评论 -
-XX:+UseParallelGC 和 -XX:+UseParNewGC 的区别
问:它们是年轻代垃圾收集的算法。第二个 (UseParNewGC) 通过 concurrent 的老年代垃圾收集自动激活。但是,这两种并行算法之间有区别吗?答:经过大量搜索,我找到的最佳解释来自 Java Performance Tuning 网站的1.4.1 垃圾收集算法,2003 年 1 月 29 日从这些信息来看,主要区别(CMS 合作除外)似乎是 UseParallelGC 支持人体工程学,而 UseParNewGC 不支持。...原创 2021-06-02 18:36:25 · 1589 阅读 · 0 评论 -
JDK 1.4.1 中的垃圾收集算法,2003 年 1 月 29 日
1.4.1中各种垃圾收集器有什么区别?1.4.1 SDK 发布时至少带有六种不同的垃圾收集算法。要了解这些算法之间的差异,您首先需要了解在 1.4.1(以及自 1.2 版本之一以来的先前 JVM)中,JVM 堆分为两个主要区域:年轻代和年老代。首先,离题一下为什么有这两个堆区域。(注意,下面的解释是简化的,避免了诸如堆有更多像Perm空间这样的区域,以及在老年代创建对年轻代来说太大的对象等复杂性。)许多面向对象程序中的对象生命周期分析表明,大多数对象的生命周期往往非常短,具有中等生命周期的对象较少,而有翻译 2021-06-02 18:07:10 · 296 阅读 · 0 评论 -
查找正在运行的JVM进程的垃圾收集器是什么类型的
Java8及以下:jmap -heap <pid> | grep GC-XX:+UseParallelOldGC-XX:+UseParallelGC> jmap -heap 18352 | grep GCParallel GC with 10 thread(s)-XX:+UseParNewGC>jmap -heap 20620 | grep GCMark Sweep Compact GC-XX:+UseConcMarkSweepGC>jmap -原创 2021-05-25 19:54:10 · 328 阅读 · 0 评论 -
即时(Just-In-Time,JIT)编译器
即时(Just-In-Time,JIT)编译器是 Java 虚拟机的核心。对 JVM 性能影响最大的莫过于编译器,而选择编译器是运行 Java 程序时首先要做的选择之一——无论你是 Java 开发人员还是最终用户。幸运的是,在绝大多数情况下,只需要对编译器做一些基本的调优。4.1 JIT编译器:概览计算机——更具体说是 CPU——只能执行相对少而特定的指令,这被称为汇编码或者二进制码。因此,CPU 所执行的所有程序都必须翻译成这种指令。像 C++ 和 Fortran 这样的语言被称为编译型语言,因为它原创 2021-05-25 11:38:50 · 850 阅读 · 0 评论 -
Java是编译语言还是解释性编程语言?
Java实现通常使用两步编译过程。Java编译器将Java源代码编译为字节码。字节码由Java虚拟机(JVM)执行。现代JVM使用称为即时(JIT)编译的技术将字节码编译为硬件CPU在运行时即时理解的本机指令。JVM的某些实现可能选择解释字节码,而不是JIT将其编译为机器代码并直接运行。尽管它仍然被认为是“解释器”,但它与读取和执行高级源代码的解释器有很大不同(即,在这种情况下,不直接解释Java源代码,而是对Java编译器的输出字节码进行解释)。总而言之,根据执行环境的不同,字节码可以是:提前编译原创 2021-05-25 09:35:08 · 247 阅读 · 0 评论