最近由于工作的原因,对Java的性能优化比较关注,其间也看到不少比较好的文章系列,比如Program-Think同学的Java性能优化系列。平常工作的时候,发现稍微有点好想法的时候,把自己独自一个人关在小屋子里集中精力思考,效果很不错,俗称“闭关”,大家也可以试一试。
谈到Java优化,我认为一切开始之前,最最重要的是找到一个合适的profile工具,这里有篇文章介绍的很详细:How to Fix Memory Leaks in Java,里面介绍了许多有用的profile工具,不用花太多时间,找到合适你自己的就行了,我用的是jprofile,感觉还不错。记住,重要的是,在每个优化开始之前,一定要用profile工具分析性能的问题出在哪边,千万不要想当然。
今天就先将两个简单的例子作为开头吧,大家轻松轻松。
例子一:
class A {
int a_num;
B b;
}
class B{
int b_num;
A a;
}
如果改成下面这样怎么样?
class AB {
int a_num;
int b_num;
}
某些Java应用程序当对象太多而垃圾回收器还没有来得及回收的时候,就可能会导致堆内存溢出,其实内存溢出是分为栈内存溢出和堆内存溢出的,关于堆和栈的区别,可以参考program-think的这篇文章,讲的通俗易懂。关于上面的这个例子,就是我在实际编码中发现的一个造成内存消耗严重的一个问题,你或许还会认为上面那种写法更技术,更××。如果A的实例和B的实例个数很少的时候还好,但是如果他们的实例个数达到上百万的级别的时候,你就会思考一下是不是要换成下面这种写法了。首先你要了解怎么去计算一个对象会占多少字节的内存,然后思考为什么下面的写法会比上面的占用更少的内存?
例子二:
如果你用Java写程序,那么你会怎么样把一个数组objct_array:Object[]加到一个list:java.util.List中去?
我并不清楚你是怎么写的,不过我却见过一种非常常用的写法:
list.addAll(java.util.Arrays.asList(objct_array));
其实,如果不是在内核运算的地方,或者某个对性能要求很高的地方写这句话完全没有问题,但如果在某个关键的地方,比如在某个要调用极多次数的方法里写用这个方法,也许就会出现问题。在这种地方,最好还是不要偷懒,用最原始但很高效的数组来解决问题。
Object[] old_array = array;
array = new Object[old_array.length + new_array.length];
System.arraycopy(old_array, 0, array, 0, old_array.length);
System.arraycopy(new_array, 0, array, old_array.lengyh, new_array.length);
事实上:ce_list.addAll(java.util.Arrays.asList(ce_array));这句效率是非常慢的,它将
一个数组变成了一个list又变成一个数组又变成一个list,因为内部是这样实现的:
public static List asList(Object[] a) {
return new ArrayList(a); // 新建了一个对象,同时数组变成一个list.
}
public boolean addAll(Collection c) {
Object[] a = c.toArray(); // 看这里, list又变成了一个数组,绕了一圈啊
int numNew = a.length;
ensureCapacity(size + numNew); // Increments modCount
System.arraycopy(a, 0, elementData, size, numNew); // 这个跟修改后做的差不多
size += numNew;
return numNew != 0;
}
结果证明:修改后这部分消耗的临时内存没有了,速度也变快了。
分享到:
相关推荐
Java安全是指在Java编程和应用开发过程中采取的一系列措施,旨在保护Java应用程序、系统和数据免受恶意攻击、数据泄露和其他安全威胁的影响。Java安全主要涉及以下几个方面: 代码安全性:Java提供了强大的安全机制...
Java 反射机制安全漫谈 Java 反射机制是 Java 语言中的一种强大功能,允许程序在运行时访问和修改类的信息。然而,这种功能也引入了安全隐患。本文将讨论 Java 反射机制的安全问题,重点介绍反射机制的基本概念、...
Java反射机制是Java提供的一种强大的动态类型功能,允许程序在运行时检查类的信息并操作类的对象。在Java安全领域,反射常被用于漏洞利用和代码审计。本文将深入探讨Java反射在安全方面的应用,特别是针对类的加载、...
Java安全漫谈 - 反射篇(3)深入讲解了如何在Java中通过反射机制处理可变长参数和访问私有方法。反射是Java中一个强大的特性,它允许程序在运行时检查和操作类、接口、字段和方法,极大地增强了代码的灵活性。然而,这...
Java反序列化漏洞详解 Java安全领域中的反序列化漏洞是一个重要的议题,它涉及的是将对象从二进制数据恢复为程序可以理解的形式时可能存在的安全隐患。反序列化是序列化过程的逆向操作,序列化是将对象的状态转换...
此模块为软件优化性能欢迎大家下载此模块。
原因是,通常我们在新建一个RMI Registry的时候,都会直接绑定一个对象在上面,也就是说我们示例代码中的Server其实包含了Registry和Serve
Java安全漫谈 - 04.RMI篇(1)1
标题与描述中的“漫谈Java数据库存取技术”聚焦于探讨Java领域中处理数据库存取的多种技术。本文将深入解析这些技术的核心概念、优势与局限性,以及它们如何适应不断变化的IT环境。 ### JDBC:Java数据库连接的基石...
漫谈Java垃圾收集器 Java垃圾收集器是Java虚拟机(JVM)中的一种自动内存管理机制,旨在释放程序员从手动内存管理的繁琐工作中解脱出来。垃圾收集器通过跟踪对象的引用关系,确定哪些对象是可以被释放的,然后将其...
漫谈分布式架构 初识分布式架构与意义 如何把应用从单机扩展到分布式 大型分布式架构演进过程 分布式架构设计 主流架构模型-SOA架构和微服务架构 领域驱动设计及业务驱动规划 分布式架构的基本理论CAP、BASE...
Java安全漫谈与Java代码审计是开发者在进行Java应用程序开发时必须关注的重要领域。Java作为广泛应用的编程语言,其安全性直接影响到系统稳定性和用户数据安全。以下是对标题和描述中涉及知识点的详细解释: 1. **...
cnki 数字图书馆论文。pdf格式
Java FX概述 Java FX是一种基于Java的富互联网应用(RIA)平台,旨在提供丰富的用户体验和跨平台的解决方案。Java FX平台主要包括Java FX脚本语言、编译器和运行环境三个部分。Java FX脚本语言是一种基于Java的新...
详解性能测试漫谈:详解自动化性能测试软件测试什么是性能测试?性能测试是在上线前对系统进行端到端性能测试的惟一方法。性能测试解决方案是:1.使用最少的硬件模拟成百上千的用户与系统进行交互2.测量最终用户的...
JavaThings-Java安全漫谈笔记相关《 Java安全漫谈》是我在写的一点Java学习相关的随笔,不是很严谨,也不是啥高科技。这个存储库主要是记录并整理一下,附加一些代码。Java安全漫谈目录 人口统计字节码:远程字节码...
Java安全漫谈 - 06.RMI篇(3)深入探讨了Java远程方法调用(RMI)中的安全问题,特别是利用Java序列化协议来执行远程代码。在RMI服务中,codebase机制允许加载远程类,从而可能引发安全风险。本文通过分析网络数据包,...
01.漫谈兼容内核之一:Wine的系统结构.pdf 02.漫谈兼容内核之二:关于kernel-win32的对象管理.pdf 03.漫谈兼容内核之三:关于kernel-win32的文件操作.pdf 04.漫谈兼容内核之四:Kernel-win32的进程管理.pdf 05.漫谈...
漫谈兼容内核之一:ReactOS怎样实现系统调用 漫谈兼容内核之二:关于kernel-win32的对象管理 漫谈兼容内核之三:Kernel-win32的文件操作 漫谈兼容内核之四:Kernel-win32的进程管理 漫谈兼容内核之五:Kernel-win32...
Java安全漫谈 - 08.反序列化篇(2)1