Java是一种伟大的语言。它管理内存,传授面向对象的编程(思想),使我们更好地用它来编码。另外,它确实是一种“编写一次,到处运行“的语言。然而,Java应用程会遇到一些常见的开发者和应用者独耳熟能详的性能挑战。
内存泄露
Java的最大的好处之一是它能够管理内存模型。当对象不再使用时,Java会做清理工作。较旧的语言需要人工来管理内存,但开发者宁愿花时间专注于核心语言逻辑而不愿为内存分配而忧心。
话虽如此,却不能保证Java的内存管理没有问题,提供管理内存模型,或创建/销毁未使用的对象,(这些对象)都放在Java的“堆(Heap)“中,内存泄露通常是不正确编程的结果–通常,开发者没有消除某一对象的所有引用,因此,堆(空间)逐步耗尽,应用程序也将死机。
大多数人使用堆转储和/或事件探查器(profiler)来诊断内存泄漏。堆转储使你可看到哪个对象持有对集合的引用。它告诉你集合何处,但不能告诉你谁在存取该集合或其它能让你探究根源的特性。堆转储通常占用的空间也相当大,在千兆字节,分析并打开一个堆转储需要大量资源,然后读取它,并找出问题所在。
第二种方法,是组合堆转储和事件探查器,使你能接近点问题本质,但并不多。内存分析器尽力帮助您分析您的堆转储。他们有实时数据,现在可知道是谁创建的对象,但仍不知造成泄漏的真正根由。
堆转储和分析器都有益于开发和预生产,然而,一旦应用程序失控,分析器也不可用。隔离并解决内存泄漏最有效的方法来之一是通过事务(transaction)(管理)和代码路径分析。通过采取事务快照,可以获得问题所在及其原因,这通常会导致更少的停机时间和更好的MTTR。
缓慢的SQL
几乎每一应用程序都会使用JDBC数据库。应用中一个非常普遍的问题是糟糕的SQL的性能,这可有时由于字段未创建索引、获取的数据量太多或者其他原因所致。这会不利于应用的性能,因为大多数应用程序在每一应用请求中涉及很多SQL调用。
可能有很多造成SQL执行缓慢的原因,但是其中之一特别突出:对象-关系映射(ORM)。
ORM以成为将当今两大业务应用基础技术(面向对象的应用(Java,.NET)和关系数据库(Oracle、MySQL和PostgreSQL等))整合在一起的首选方法。今天的大多数应用采用关系数据库,对于许多开发人员而言,(ORM)这项技术可以消除需要升入探讨着两种技术如何相互作用的复杂度。然而,ORM使得应用需承受额外的负担,并极大地影响应用的性能,而一切表面上看起来很好。
在大多数情况下,检索数据所消耗的时间和占用资源的数量级远大于数据处理所需的时间及资源,因此,性能方面的考虑常包含访问和存储数据的工具和方法就不足为奇了。
虽然开发人员直观地使用(隐藏复杂性),但ORM在应用性能方面应占据很大的比重,以确保(开发人员)明白问题的实质。
线程/同步
由同步所产生的问题往往很难辨认,但是其对性能的影响却非常显著。
对同步的最根本的需要在于Java对并发的支持,这通过在相同的过程中执行不同的线程(thread)代码来实现。单独的线程之间可以共享相同的资源,以及内存中的对象。虽然是一种完成更多工作的有效方法(当以线程在等待I/O操作完成期间,另一线程可利用CPU来进行计算),但是也曝露出应用的干扰和一致性问题。
为防止这种情况,程序员在程序中引入“synchronized”关键字来强制并发线程的执行顺序。利用“synchronized”来防止线程在同一时间获得同一资源,并防止数据不一致。
然而在实践中,这个简单的机制却带来很大的副作用。现代企业的应用常采用多线程的实现模式,同时执行多个线程,对“共享”对象的争夺也随之加剧,同步将有效地强制并发处理转而为顺序执行。
目前,对于线程和同步问题没有银弹(silver bullet)。某些开发者依赖“防御”性编程方法,诸如加锁;而另一些开发者,则依赖STM(Software Transactional Memory Systems)来缓解这个问题。最好的开发组织是那些可以平衡代码审查/重写负担和性能问题的团队。
这些只是Java开发人员每天必须面对的应用性能问题,有许多有用的性能工作可以大大减少此类问题。
原文地址: http://simpleframework.net/simple/news/v.jsp?__news_beanId=0457345649_01078129255&__news_Id=3945
分享到:
相关推荐
### Java应用性能内存调优 #### 一、背景介绍 随着淘宝等大型电商平台的发展,每日的访问量达到了惊人的数量级。例如,Taobao每天的IPV(itemDetail)访问量超过1亿次,Detail机器每天的访问量达到了60万次。面对...
在构建高性能的大型分布式Java应用时,我们面临的是复杂的技术挑战和优化目标。要实现这样的系统,我们需要深入了解Java平台的特点,以及如何利用其优势来处理大规模数据和高并发请求。以下是一些关键的知识点: 1....
模块三主要讲解多线程性能调优,包括多线程编程的应用、线程安全性、多线程高并发带来的性能问题等。 模块四:JVM 性能监测及调优 模块四主要讲解 JVM 性能监测及调优,包括 Java 对象的创建和回收、内存分配等。 ...
《阿里巴巴Java性能调优实战》(2021华山版)则聚焦于Java应用的性能优化技巧,内容包括JVM内存调优、GC算法选择、线程池配置、数据库优化、网络I/O优化等关键领域。这本书通过实际案例分析,指导开发者如何定位并解决...
本文将详细介绍10种Java性能优化策略,并重点解析文档中提到的几个关键点。 #### 二、hashCode() 方法优化 1. **背景**:`hashCode()` 方法在Java中用于快速查找对象。当对象存储在哈希表中时,例如`HashMap`,其...
### 实现分布式Java应用的挑战与解决方案 尽管Java提供了丰富的库和技术栈来支持分布式应用的开发,但在实际应用中仍面临许多挑战,例如: - **一致性问题**:在分布式系统中保持数据的一致性是一项复杂任务,需要...
在Java编程领域,"高级应用"通常涵盖了许多复杂且深入的主题,这些主题对于初学者来说可能是挑战性的,但同时也是提升技能的关键。本教程将带你深入理解Java语言的核心特性,并探讨如何在实际项目中有效地利用它们。...
以下是几种常见的J2EE应用性能问题及其解决策略: 1. **数据库连接池太小**: - **症状**:在高负载下,应用组件的响应时间显著增加。 - **定位**:通过监测`getConnection()`调用来定位问题。 - **建议**:若`...
Java作为一种广泛使用的面向对象编程语言,其强大的功能和跨平台特性使其成为企业和开发者的首选。 1. Java基础:教程首先会介绍Java的基础知识,包括语法、变量、数据类型、运算符、控制结构(如if语句、for循环、...
分布式Java应用是现代企业级软件开发中的重要组成部分,它涉及到多台计算机...通过学习和掌握这些知识,开发者将能够设计和实现复杂的企业级分布式Java应用,应对各种挑战,如高并发、大数据处理和系统间的协同工作。
实现Java平台主要有三种方式,即Java虚拟机(JVM)、Java操作系统(Java Operating System)和Java芯片(Java Chip)。这三种方式各自有不同的特点和适用场景。 1. Java虚拟机(JVM): JVM是最常见且广泛使用的...
分布式JAVA应用基础与实战是Java开发领域中的一个重要话题,它涉及到如何通过网络将多个独立的计算机节点连接起来,协同处理任务,以实现系统的高可用性、高性能和可伸缩性。这一主题通常涵盖多个关键知识点,包括但...
分布式Java应用是计算机科学中的一个重要领域,它利用了Java语言的网络友好性,为实现大型、高并发、高性能的系统提供了可能。分布式计算技术有着悠久的历史,它从早期的C/S架构,到P2P模型,再到现在的云计算,始终...
首先,内存持续上升是Java应用中常见的性能问题,可能导致系统运行缓慢甚至崩溃。文件"24丨内存持续上升,我该如何排查问题?"和其备份提供了深入的指南。在排查内存问题时,我们需要关注几个关键点:检查是否存在...
书中还专门讨论了并发和多线程优化,这是Java应用中常见的性能挑战。作者解释了线程安全问题、锁的使用、并发工具类的应用,以及如何通过并行化处理提升程序执行效率。此外,对于Java 8及以后版本的新特性,如Lambda...
【标题】"2018华为软件精英挑战赛复赛代码 by java()" 涉及的知识点主要集中在数据处理、机器学习以及编程语言Java的应用上。这个标题表明了一个参赛者在2018年的华为软件精英挑战赛复赛中使用的Java代码,这是一场...
特别是对于多核多线程编程的性能优化,文档中所探讨的设计模式改进,可能对当时Java开发人员在架构设计时面临的性能挑战提供了解决方案。而随着技术的不断更新迭代,JDK的不断优化,设计模式的实现方式也可能随之...
【使用JAVA内存数据库h2database性能优化】 在开发应用程序时,我们经常遇到性能瓶颈,特别是当涉及到大量的IO操作时。数据库访问是这类问题的主要来源,特别是在处理高并发、实时计算和海量数据监控的情况下。例如...
在Linux平台上进行Java应用程序开发是一项技术性强且富有挑战性的工作,因为这涉及到对两种不同操作系统环境的理解和掌握。本文将深入探讨如何在Linux系统中高效地进行Java编程,包括环境配置、开发工具的选择、调试...