Java:java内存分析时,要考虑哪些因素?
任何Java内存分析的目标都是检查应用程序的内存消耗。它包括分析应用程序响应时间或CPU使用情况对内存容量的影响。例如,应用程序响应时间可能会造成内存不足和泄漏,从而导致严重的不稳定性。
此外,Java内存分析还包括查明导致这些内存问题的进程的方法。这些过程包括检查过度的垃圾收集。例如,如果垃圾收集影响响应时间,则解决方案是优化配置。
请记住,对于配置中的每一项更改,其效果必须是减少影响。有时,优化配置时问题无法解决。在这种情况下,考虑其他情况。例如,查看分配模式并分析内存使用情况本身。
内存分析是一个广泛的话题,但这里有一些重要的方面需要考虑:
逃逸分析
Java对象被创建并存储在堆中。在Java中,开发人员不决定是否应该在堆栈中生成对象。然而,在实践中,应该希望在堆栈上分配一个对象。主要是因为堆栈上的内存分配比堆中的内存分配便宜。此外,堆栈上的释放是免费的,堆栈由运行时有效管理。
因此,逃逸分析用于检查对象是否仅用于线程或方法。JVM执行转义分析,并决定是否在堆栈上创建对象。在堆栈上创建对象将提高Java应用程序的性能。
监视垃圾收集
通常,垃圾收集是一个收集当前未分配的资源的过程。然后,它启动释放,以便应用程序可以再次使用它。
根据JVM垃圾收集器,只要它根本不包含任何引用,它就会从内存中释放Java对象。JVM会自动收回不再使用的内存。如前所述,工作的垃圾收集器应该自动释放不再引用的对象的内存。要查看垃圾收集器是否正常工作,请将命令行参数-verbose:gc添加到虚拟机。
不同的语言有不同的机制。例如,Python有一个称为引用计数的附加功能,作为其垃圾收集模块的一部分。另一方面,Java垃圾收集特性非常严格,这使得Java成为一种内存安全的语言。
现在,如果是这样的话,为什么我们仍然需要Java内存分析?
答案很简单。有些Java应用程序符合其内存管理,并且性能良好。然而,并非所有Java应用程序都是平等的。因此,有一些复杂的Java应用程序由于内存限制而性能较差。
当应用程序有太多已分配对象并且分配得太快时,就会发生这种情况。由于年轻一代很快就满了,所以流失率很高,因此必须触发垃圾收集器(GC)。记住,高流失率可能会妨碍最佳发电规模。因此,开发人员在尝试优化垃圾收集本身之前,应该在代码中解决这个问题。
Java GC可以在不溢出旧一代的情况下进行管理。然而,这种方法以牺牲应用程序的性能为代价。考虑到Java内存管理不允许开发人员超出分配的内存。当内存消耗超出其分配时,将引发错误或异常。
检查应用程序的总体内存使用情况
jvisualvm是Java的内存分析工具之一,用于分析Java应用程序的运行时行为。它跟踪正在运行的Java程序,检查其内存和CPU消耗。此外,它还用于创建内存堆转储,以分析堆中的对象。
通常,如果应用程序中的进程运行时间长或内存消耗高,则该进程被认为是扩展的。程序的总使用或可用内存可通过以下方式在程序中获得:
java.lang.Runtime.getRuntime();
在java培训中,无论是理论知识,还是实战项目,都是紧跟市场和企业需求的,让你掌握最新技术,走在市场前沿。
监控执行的操作或方法
Java内存分析的一部分是监视应用程序中执行的操作或方法。开发人员通常使用基于事件的测量方法来分析各个方法的执行。这是在每个方法调用的开始和结束时使用日志和时间戳完成的。结果是调用单个方法的总次数以及每次调用的确切执行时间。
JVM工具接口(JVM TI)是Java运行时中的一个特殊回调,在方法执行的开始和结束时调用。然而,此过程的开销很高,可能会影响应用程序的运行时行为。因此,寻找使用字节码检测的现代性能测量方法。它减少了开销,提高了应用效率。
检查应用程序使用或加载的内存类/库
当构建一个复杂的Java应用程序时,预计某些事情最终会失败,或者会遇到OutOfMemoryException。内存问题总是带来新的和意想不到的挑战。因此,内存分析的最佳实践之一是检查应用程序正在使用或正在加载的内存类和库。
监视Java线程
活动Java线程是另一个要监视的JVM内存度量。在深入研究线程背后的概念之前,这里有两种类型的Java线程需要研究:
l 守护线程——这是用户线程的服务提供者。JVM创建守护进程线程。守护进程线程的生命取决于用户线程,因此它们的优先级较低。它们执行垃圾收集和其他内务处理过程。
l 用户线程——由应用程序或用户创建。这些是高优先级线程,JVM将等待它们完成任务。
线程可能会创建或破坏应用程序。如果线程数太多,会降低响应时间。这意味着线程数越高,处理器利用率越高。这背后的原因是每个线程所需的处理能力。要在线程之间频繁切换,需要处理能力。
当预期有大量并发请求时,使用的线程数会增加。需要注意的是,这将减少应用程序用户的响应时间。
你可以相应地管理线程。例如,线程尤其适用于处理并发任务,如获取数据或将数据写入数据库。开发人员使用线程来提高应用程序的性能,特别是当他们有I/O时。但是,请注意,当有大量线程执行并发工作时,问题很普遍。
另一个需要考虑的重要问题是线程开销,这会导致应用程序的总体速度下降。创建和销毁线程时会发生这种情况。此外,在保存和恢复线程状态时会发生开销。由于硬件资源有限且共享,因此存在开销。
使用Retrace进行JMX监视
Java是一种健壮的编程语言,它提供了处理内存消耗的工具和功能。此外,有许多方法可以执行Java内存分析。你可以选择更多以内存为中心的评测工具。一些工具专门用于Java内存泄漏分析或具有严格功能的通用APM,以监控应用程序。
Java管理扩展(JMX)是一种用于监视和管理Java应用程序的Java技术。它在开发人员中得到广泛接受,因为它支持通用管理系统。此外,它在应用程序需要注意时提供通知。此外,它还会更改应用程序的状态,以提供问题的解决方案。JMX是一个强大的工具。当JMX与Retrace配对时,它会显示应用程序的整体性能指标。