请描述一次您在项目中遇到的Java性能问题,以及您是如何定位并解决这个问题的?

1、低效代码,低效代码会导致内存消耗增加、响应时间延长以及系统整体效率降低。最终,低效代码会降低用户体验,增加运营成本,并限制应用程序的扩展以应对负载的增加。
摆脱低效代码首先我会注意一些低效模式,比如:没有适当退出条件的嵌套循环、不必要的对象创建和实例化、过度同步、低效数据库查询等。
2、开发过程中可能会遇到字符串拼接的情况,我们一般不会使用String ,而使用StringBuilder
String result="";
for(int i=0;i<1000;i++){
result += "example"
}

改进后的代码
StringBuilder sb = new StringBuilder();
for(int i=0;i<1000;i++){
sb.append("example");
}
String str = sb.toString();

因为String类是不可变的,一旦创建,其值就不能修改。原因是String底层是使用final修饰的;而StringBuilder类是可变的,提供了一些列方法用于修改字符串内容。

3、上面仅仅是低代码开发过程中代码优化,其实还有内存泄漏、线程死锁、臃肿的库和依赖关系、并发问题、过度的垃圾回收等
内存泄漏:Java中的垃圾回收机制GC可以自动识别和回收不再使用的内存,然而即使有了这些先进的机制,即使最熟练的程序员也仍有可能遇到并无意中引入Java内存泄漏。
内存泄漏最明显的特征是OutOfMemoryError heap error,那我们可以先检查最可能的字段,静态字段、集合和声明为静态的大型对象,它们可能会在应用程序的整个生命周期中阻塞重要内存。
比如在方法中定义 public static List list = new ArrayList();
对象一旦定义为static,就会在项目启动的时候加载并初始化内存对象。因此在初始化列表时移除静态关键字就能大大减少内存使用量。
线程死锁:有2个线程(线程1和线程2)试图以不同的顺序获取两个锁(锁1和锁2)。这样就引入了循环等待,增加了死锁的可能性。
为了解决这个问题,重构代码,确保线程始终以一致的顺序获取锁。为此,我们引入全局锁顺序,并确保所有线程都遵循相同的顺序。

防止线程死锁的技巧:
锁排序--确保所有线程在获取锁时遵循想太多饿顺序,以防止循环等待。
实施锁超时--如果线程无法再指定时间内获取锁,则释放所有获取的锁并重试。
 

  • 16
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值