云时代架构阅读笔记一——Java性能优化(一)
Java语言学习了这么长时间之后,自己对于Java编程的一些细节还是稍微有点总结,正好根据云时代架构中《Java高级开发必会的50个性能优化的细节(珍藏版)》来叙述一些我和里面的点比较相符且有点感悟的地方。
1)尽量在合适的场合使用单例
单例模式我们并不陌生,软件设计的设计模式中单例模式相对来说是比较重要的一个。单例模式的优点非常明显,就是避免多次创建同一个对象,这样可以减轻系统加载的负担,减少内存的占用,使系统的总体效率有所提高。这里我也举一个单例模式的例子:
public class Singleton {
private static Singleton singleton;
private Singleton(){}
public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton()
}
return singleton;
}
}
可以看到单例模式的特点:1)有一个静态成员变量,变量的类型为本类;2)构造方法为私有,这是为了防止在外面调用构造函数。
通过这段代码:单例模式在当前成员变量已经创建了之后即已经存在了之后就不会再次创建而是直接返回这一个对象,这样可以防止对象的重复创建。
但是这种方法也有局限:这种写法是懒汉式的一种,但它只适用于单线程下的使用,当使用多线程的时候,如果有两个同时访问这段代码,第一个判断为空后就会创建一个对象,但此时第二个也已经执行完毕,也判断其为空,同样也会创建一个对象,这就使单例模式的作用没有发挥出来,有兴趣的可以多去研究研究。
2)尽量避免过多过常的创建Java对象。
这句话看着确实有道理,但是很少有人注意,感觉这句话没有很适合的场景,自己从来没有过多的创建过Java对象,这里我写一段大家非常之熟悉的代码:
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet rs = preparedStatement.executeQuery();
List<User> users = new ArrayList<User>();
while(rs.next()) {
User user = new User();
user.setUserName(rs.getString("username"));
user.setPassword(rs.getString("password"));
users.add(user);
}
return users;
这端代码相信经历过JavaWeb开发的人员们并不陌生甚至来说是非常熟悉,这段代码实现的就是从数据库查询出所有的用户并返回,当然这段代码本身是没有错误的,但是我现在稍微进行改进一下:
在while循环上面加一句话:User user = null; 然后将红色标注的部分改成user = new User();
这两个一对比就会发现,第一种虽然可以实现,但是没执行一次while循环就会创建一个User类的对象,假如数据库中有100000条数据,执行这一次查询之后就会创建100000个对象,这对系统造成的压力可想而知,虽然以现在的电脑配置等的处理这么多问题不是事。但是这种优化我们还是应该知道的;然后我们再来看第二写法,先是声明了一个对象,但并没有赋值;然后每执行一次while循环就只会给之前创建的这个对象赋值然后返回,也就是说,通过100000次循环之后,我们只是创建了一个对象,这和之前相比起来改进还是挺大的吧。
3)尽量在finally块中释放资源
异常的处理一直是被开发人员关注但却怎么也达不到完美的技术。可以这样说,如果一个程序员开发的系统将所有的异常都处理的非常好,那他绝对是超乎常人的存在。在日常开发中,我们也会遇到异常的问题,常见的有空指针、下标越界等,所以,异常的处理就显得特别重要,要不然将来让用户看到HTTP 500的时候用户会怎么想。而在异常处理中,finally一直没有被我们重视,一般我们在使用异常的时候仅仅使用try...catch并没有考虑到finally,但其实finally的存在使得我们在考虑什么时候关闭资源的问题不复存在,我不管你再try还是catch里面执行什么操作,在我finally这里就执行最后的收尾就可以了。日常使用的比如文件的关闭、对象的释放、使用最多的还有数据库对象的关闭等在finally中写上不仅使得程序的结构更加清晰,而且不会出现这样那样的问题。
云时代架构阅读笔记一——Java性能优化(一)的更多相关文章
- 云时代架构阅读笔记二——Java性能优化(二)
承接上文Java性能优化(一)https://www.cnblogs.com/guo-xu/p/11019267.html 4)尽量确定StringBuffer的容量 在说和这个标题相关之前,先说一下 ...
- 云时代架构阅读笔记六——Java内存模型详解(二)
承接上文:云时代架构阅读笔记五——Java内存模型详解(一) 原子性.可见性.有序性 Java内存模型围绕着并发过程中如何处理原子性.可见性和有序性这三个特征来建立的,来逐个看一下: 1.原子性(At ...
- 云时代架构阅读笔记七——Java多线程中如何使用synchronized关键字
关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...
- 云时代架构阅读笔记五——Java内存模型详解(一)
什么是Java内存模型 Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的访问差异,以实现让Java程序在各种平台下都能达到一致 ...
- 云时代架构阅读笔记十一——数据库SQL优化
网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 ...
- 云时代架构阅读笔记十五——之前碰到的Java面试题
1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致. 2.Java有 ...
- 云时代架构阅读笔记十六——Hystrix理解
背景 分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个基础服务.如下图,对于同步调用,当库存服务不可用时,商品服务请求线程被阻塞,当有大批量请求调用库存服务时,最终可能导致整个商品服 ...
- 云时代架构阅读笔记十四——我对Hash算法的理解
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是 ...
- 云时代架构阅读笔记九——web应用存在的问题及解决办法
web应用通常存在的10大安全问题 1.SQL注入 拼接的SQL字符串改变了设计者原来的意图,执行了如泄露.改变数据等操作,甚至控制数据库服务器, SQL Injection与Command Inje ...
随机推荐
- 【转】彻底搞透Netty框架
本文基于 Netty 4.1 展开介绍相关理论模型,使用场景,基本组件.整体架构,知其然且知其所以然,希望给大家在实际开发实践.学习开源项目方面提供参考. Netty 是一个异步事件驱动的网络应用程序 ...
- layer open type值类型
参考:http://layer.layui.com/api.html layer提供了5种层类型: 0:信息框,默认 1:页面层 2:iframe层 3:加载层 4:tips层
- ajax请求Controller,返回信息乱码问题
参考:https://blog.csdn.net/hgg923/article/details/53610548 @RequestMapping(value = "changeMobile& ...
- main.js index.html与app.vue三者关系详解
main.js index.html与app.vue三者关系详解 2019年01月23日 11:12:15 Pecodo 阅读数 186 main.js与index.html是nodejs的项目启 ...
- boost::program_options 解析命令行参数
源码: #include <boost/program_options.hpp> namespace po = boost::program_options; int main(int a ...
- 6专题总结-动态规划dynamic programming
专题6--动态规划 1.动态规划基础知识 什么情况下可能是动态规划?满足下面三个条件之一:1. Maximum/Minimum -- 最大最小,最长,最短:写程序一般有max/min.2. Yes/N ...
- Commons BeanUtils 中对Map的操作
CSDN学院招募微信小程序讲师啦 程序员简历优化指南! [观点]移动原生App开发 PK HTML 5开发 云端应用征文大赛,秀绝招,赢无人机! Commons BeanUtils 中对Map的操作 ...
- sklearn中调用PCA算法
sklearn中调用PCA算法 PCA算法是一种数据降维的方法,它可以对于数据进行维度降低,实现提高数据计算和训练的效率,而不丢失数据的重要信息,其sklearn中调用PCA算法的具体操作和代码如下所 ...
- MVC、MVT简介
一.MVC MVC的产生理念: 分工.让专门的人去做专门的事. MVC的核心思想: 解耦. M: Model,模型, 和数据库进行交互. V: View,视图, 产生html页面. C: Contro ...
- 从植发AI看智能手术机器人的国产化之路
在工作和生活的双重压力下,很多80后乃至90后的青年都"光荣"地加入了"脱发一族".为了拯救发际线或是不变成"地中海",很多人从此走上了寻医 ...