草庐IT

垃圾收集器的秘密:深入理解JVM性能调优

作者|波哥审校|重楼Java虚拟机(JVM)的自动内存管理是Java开发者的福音,它通过垃圾收集(GC)机制自动回收不再使用的对象,极大地简化了内存管理。然而,不恰当的GC配置或不理想的垃圾收集器选择可能会对应用性能产生负面影响。为了优化Java应用的性能,深入理解GC的原理和策略是至关重要的。本文笔者将详细探讨JVM的垃圾收集机制,包括内存模型、GC算法、各种垃圾收集器的特点及其调优策略。一、JVM内存模型深入解析JVM的内存模型是理解GC机制的基础。JVM将内存分为多个区域,主要包括堆(Heap)、方法区(MethodArea)、程序计数器(ProgramCounterRegister)、

java - JVM - WeakReferences 是否在次要 GC 中收集?

我想知道这会降低它们的用处。如果是这样,有没有办法让内存在主要GC上仅被弱引用为“垃圾”? 最佳答案 javadoc没有具体说明清除/破坏WeakReference的“时间尺度”。这将使你的问题的答案(至少在理论上)“它取决于实现”。事实上,JLS规范和javadocs甚至没有提到主要和次要集合。整个主题属于“实现细节”类别。如果您确实想要对GC敏感的引用,那么也许您应该使用SoftReference反而。其描述如下:"Allsoftreferencestosoftly-reachableobjectsareguaranteedto

java - 从 JVM 的角度来看,从原始数组继承是不可能的吗?

我的疑问是这个:在Java中,不允许从数组继承,即不能做这样的事情:classFloatVecextendsfloat[]{//Vectormethods.}FloatVecsomevec=newFloatVec()[]{1,2,3};//Witharrayinitializer.或者更好:classFloatVec3extendsfloat[3]{//Regularaccessor.publicfloatgetX(){returnthis[0];}//Orsay,makeitthe'this'implicitlikewithotherfields:publicvoidsetVec(f

java - 急切的java类加载

我正在尝试对运行在各种硬件和操作系统平台上的JVM进行一些基准测试。我创建了一个算法来练习我感兴趣的JVM部分,并打算多次运行该算法以找到一个合适的平均值。当我运行基准测试时,我发现第一次运行明显比后续运行长:132ms86ms77ms89ms72ms我怀疑类是延迟加载的,在第一次运行时会产生很大的开销。虽然我认为这确实是每个JVM所独有的一项功能,但目前我对此并不感兴趣。是否有标准的命令行选项或属性来预先加载类?或者有人有任何其他理论吗? 最佳答案 最简单的做法是忽略第一次运行。(如果这是一件有效的事情)注意:如果您运行相同的代码

java - 在 JVM 上启用逃逸分析的经验

我刚刚尝试在jdk6-u18VM(在solaris上)上启用-XX:+DoEscapeAnalysis选项,但体验相当令人失望。我正在运行一个scala应用程序,它有很多参与者(其中20,000个)。这是制造垃圾的方法!通常,该应用程序可以使用256Mb的堆运行,但会生成大量的垃圾。在其稳态中:将10%的时间花在GC上在150Mb的垃圾,然后进行GC我认为逃逸分析可能会有帮助,所以我启用了该选项并重新运行应用程序。我发现该应用程序越来越无法清除它收集的垃圾,直到它似乎最终将全部时间都花在了GC上,并且该应用程序在其完全分配时“趋于平缓”。在这一点上,我应该说应用程序没有抛出我预期的Ou

java - JVM 是否在 OutOfMemoryError 后自行终止

这个问题在这里已经有了答案:CantheJVMrecoverfromanOutOfMemoryErrorwithoutarestart(7个答案)关闭9年前。发生OutOfMemoryError后,JVM会自行终止吗?如果不是那么为什么?它会尝试取回资源吗?还是有其他原因?

java - 哪种免费的 JVM 实现具有最好的 PermGen 处理能力?

我在Sun的JRE6中运行Tomcat6,每对部署我都会遇到OutOfMemoryException:PermGen。我已经完成了PermGen解决方案的谷歌搜索并尝试了许多修复。没有工作。我读了很多关于Oracle的JRockit的好东西,以及它的PermGen分配如何在大小上达到千兆(与Sun的128M相比),虽然它没有解决问题,但它允许我在PermGen异常之间重新部署100次,而不是2现在的时间。JRockit的问题是要在生产环境中使用它,您需要购买值(value)数千美元的WebLogic。存在哪些其他(免费)选项更容忍PermGen扩展?以下JVM在这方面的表现如何?IBM

java - ServletContext 是每个 Web 应用程序一个还是每个 JVM 一个?

我怀疑ServletContext是每个Web应用一个,每个JVM一个。但是如果我在同一个JVM上运行多个Web应用程序。然后每个JVM有2个ServletContext。可能吗?有人可以详细说明一下吗? 最佳答案 每个webapp都有自己的ServletContext。的方式apidocs把它是:Thereisonecontextper"webapplication"perJavaVirtualMachine.(A"webapplication"isacollectionofservletsandcontentinstalledu

java - 将值存储为变量或再次调用方法更好吗?

最近,我开始学习一些Java。从我对JVM的了解来看,JIT似乎使它在需要CPU周期(即调用方法)的操作上变得非常快,但也使它非常需要内存。因此,当我需要来自与以前相同的方法的相同输出时,通常更好的方法是将之前的输出存储在变量中并再次使用它-同时一直将其保存在内存中-还是再次调用相同的方法? 最佳答案 更好的做法是将输出保存在变量中而不是再次调用该函数。只要需要,变量就会保留在内存中。在那之后,自动垃圾收集将负责将其从内存中释放出来。但是如果你调用这个函数,它会在每次被调用时耗尽它的激活记录堆栈的内存。因此,如果您希望您的程序不占用

java - 找出给定 Java 进程的 -Xms 和 -Xmx 变量值的命令?

我有一个java程序,我运行它并用jps找出它的进程ID。我如何查看此Java进程的-Xms和-Xmx变量的值是多少? 最佳答案 尝试jcmdVM.command_linejcmdVM.flags 关于java-找出给定Java进程的-Xms和-Xmx变量值的命令?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/27959837/