作为当前全球最热门之一的开发语言,Java正在野蛮地扩张自己的领土,从单片机到安卓,随处可见Java的身影。随着越来越多的人加入Java开发环境,阶级分化也逐渐明显。大神和菜鸟,往往只有一线之隔,今天小编就要把这层窗户纸捅破。

开发过程中,那些被称为“666”的大神,领先你的,往往也只有几个快捷键的距离。一些简单的技巧和开发习惯,往往能让你在开发过程中事半功倍。

避免重复创建对象

为什么?

更少的对象会需要更少的垃圾回收

使用的空间越少,应用的性能越好

怎么做?

重复利用一个对象,而不是在每次需要的时候都去创建一个功能一样的对象

(这样做)

String s = “No longer silly”;

(不要这样)

String s = new String(“silly”);

不可变类中既提供构造函数,又提供了静态工厂方法的,优先考虑使用静态工厂方法。复用那些一旦初始化(使用静态初始化)就不会改变的对象。+++

避免循环引用

为什么

一组相互引用的对象,如果他们没有被其他对象直接引用的话,它们会变得不可达,这样会导致它们一直都保留在内存里。

怎么做

你可以使用强引用来表示“父到子“的引用关系,使用弱引用来表示“子到父”的引用关系。

了解和学习一下 JVM 内存管理

为什么

有些人认为Java 程序员不需要知道内部 JVM 内存管理。毫无疑问,这种观点明显是错误的,如果想拓宽知识面和提升排除故障能力,你就必须要了解和学习一下 JVM 内存管理

怎么做?

JVM 内存分为 3 个内存空间

Java Heap:适用于所有的JVM厂商,通常用来拆分 YoungGen(幼苗 ) 和OldGen(终身享用)空间。

PermGen(永久代):适用于SunHotSpot VM((PermGen 空间在 Java7 或者Java8 更新中将会被删除)

Native Heap(C-Heap):适用于所有的JVM厂商。正如你所看到的,JVM内存管理比使用 Xmx 设置最大值更为复杂。你需要查看每个角度,包括本地和PermGen 需求以及从主机上查看物理内存可用性(CPU core)。

使用==操作符来替代equals(Object)方法

为什么

==操作符的性能更好

例如,对于字符串比较,equals()方法会去比较字符串对象里的字符。==操作符会比较两个对象的引用,来比较它们是否指向同一个实例。

怎么做:

当且仅当a==b 的时候才会有a.equals(b)

例如,对于重复调用的地方,使用静态工厂方法来返回相同的对象。

避免使用finalizer

为什么

垃圾回收器需要单独记录等待终结的对象

调用finalize方法也有一定的开销

Finalizer是不安全的,因为它有可能会复活一个对象,这样会干扰垃圾回收。

避免使用引用对象

为什么

和finalizer一样,垃圾回收器需要特别处理软引用、弱引用以及幽灵引用。

尽管引用对象在某些方面很有作用,例如,简化cache的实现,但是大量引用对象的存在会使得垃圾回收运行缓慢。

记录一个引用对象的开销远远超过一个普通对象(强引用)的开销.

避免使用对象池

为什么

对象池不仅会使得更多的数据对象保持活动,同时会使得对象的存活时间延长.

值得注意的是,大量存活的数据对象的处理是GC的瓶颈,GC被优化成适合于处理许多寿命较短的对象

并且,创建新的对象而不是保持旧的对象存活,会对缓存的局部性有益.

不过,在一个包含大量大对象的环境下,例如大的数组,性能或许会因为使用对象池而有所提升。

选择好的算法和数据结构

为什么

考虑一下通过链表来实现队列的场景

即使你的程序不需要遍历整个链表,但是垃圾回收器还是需要这样做的。

如果元素的封装者没有把元素没有把元素放在内存中邻近的位置,这样会破坏缓存局部性。因而会导致程序长时间的暂停,尤其是对象的指针分散在一个很大的堆区时,垃圾回收器会在标记阶段追随指针的时候频繁遭遇缓存失效。

避免使用System.gc

为什么

Java语言规范里没有保证调用System.gc会做什么。如果它规定了的话,或许会超出你的期望,也或许每次调用都做不同的事情。

避免使用太多的线程

为什么

进程上下文切换的次数会随着要调度的进程的数目相应地增长,这样会对性能有隐性的影响。

例如,IntelA-64处理器上的本地线程上下文的大小大概是几千KB。

回顾静态占用需求

为什么

设法对静态内存占用进行合理的评估,在真正进行数据测试之前,设置一些 JVM 能力起点是非常有用的。

怎么做

应用程序以及相关数据将决定 Java堆空间占用需求。通过静态内存,可预测下面的内存需求:

确定将会有多少不同的应用程序部署到预先计划的一个单独的 JVM 进程上,确定有多少个类需要在运行时加载:包括第三方 API。确定数据缓存占用,如应用程序加载内部缓存数据结构(和第三方 API)。 确定允许建立的中间件线程数量。

在 JVM 进程上部署的应用程序越多,对本地内存和 PermGen 空间的要求就越高。数据缓存并不是序列化为一个磁盘或数据库,它将从 OldGen 空间里面需要额外的内存。设法对静态内存占用进行合理的评估,在真正进行数据测试前,设置一些JVM能力起点是非常有用的。对于32 位JVM, 通常不推荐一个Java堆大小超过2GB(-Xms2048m,-Xmx2048m),对于 JavaEE应用程序和线程来说这样将需要足够的内存和本机堆 PermGen。这个评估是非常重要因为太多的应用程序部署在一个32 位JVM进程上很容易导致本机堆耗尽;尤其是在多重线程环境。对于64位JVM, 一个3GB或者4GB 的 Java 堆/JVM 进程是推荐的起点。

避免不需要的异常

为什么

异常处理会占用一定的事件,并且会打断程序的正常执行流程。

作者曾经遇到这样一场景,在客户的应用里,一个正常的执行流程每秒会抛出成千上万的NullPointerException。这个错误被纠正后,应用的性能里面有了一个数量级的提升。

避免使用大对象

为什么

大对象有时候需要直接在堆而不是在线程本地存储区(thread local areas, TLA)进行内存分配。

大对象直接在堆上分配是有坏处的,因为它会更快地产生内存碎片。在虚拟机(例如JRockit)上分配大对象会降低性能,因为分配内存的时候会使用堆的全局锁。

过度使用大对象会造成频繁的全栈压缩,这样做是具有破坏性的,而且这样会导致导致所有的线程暂停很长一段时间。

留着肯定有用,让你脱胎成技术大神的JAVA开发技巧相关推荐

  1. 让你脱胎成技术大神的JAVA开发技巧

    开发过程中,那些被称为"666"的大神,领先你的,往往也只有几个快捷键的距离.一些简单的技巧和开发习惯,往往能让你在开发过程中事半功倍. 避免重复创建对象 为什么? 更少的对象会需 ...

  2. python资料包-5个G的Python学习资料包:让你从零基础成编程大神!

    原标题:5个G的Python学习资料包:让你从零基础成编程大神! 这年头不会点编程 都不好意思说自己是大学生 那些玩转Python的大牛们 几乎成了全民崇拜的偶像 但对于我们这种毫无基础的小白 自学编 ...

  3. Lale的使用 留着肯定有用的

    UILabel *label = [[UILabelalloc] initWithFrame:CGRectMake(0, 0, 75, 40)];   //声明UIlbel并指定其位置和长宽 labe ...

  4. 疯狂python讲义pdf_如何自学成Python大神?这份学习宝典火爆 IT 圈!

    都说人生苦短,我用 Python.为什么? 简单明了的理由当然是开发效率高.但是学习 Python 的初学者往往会面临以下残酷的现状: 网上充斥着大量的学习资源.书籍.视频教程和博客,但是大部分都是讲 ...

  5. 如何自学成Python大神?这份学习宝典火爆 IT 圈!

    都说人生苦短,我用 Python.为什么? 简单明了的理由当然是开发效率高.但是学习 Python 的初学者往往会面临以下残酷的现状: 网上充斥着大量的学习资源.书籍.视频教程和博客,但是大部分都是讲 ...

  6. 判断数组相同数c语言_单片机常用的14个C语言算法,看过的都成了大神!

    算法(Algorithm):计算机解题的基本思想方法和步骤. C语言入门视频教程_9天精通Linux C语言 - 创客学院​www.makeru.com.cn 算法的描述:是对要解决一个问题或要完成一 ...

  7. 《乘风者周刊》 专家博主:琦彦 ——一个半路出家的文科生如何逆袭成技术大咖

    简介: "二流的技术人员,善于倾听.善于交流,也能作出一流的成绩"  英国作家毛姆曾说过,"一流的作家是天才型,二流的作家是一点天赋加努力型".   这是技术人 ...

  8. 红盟php 解密,php教程_求大神将一个java的aes解密帮忙改写成php版的

    阅读推荐: php教程_PHP 5.4中引用的的几个小问题 艾轩油画西藏女孩 php教程_JavaScript与HTML结合的基本使用方法整理 php教程_将PHP作为Shell脚本语言使用 会声会影 ...

  9. 一周成python大神_python大神进阶路线

    学习路线: 1.硬件: 1.操作系统简介 2.第二篇:操作系统 2.linux基础: 1.初始Linux 2.基本使用 3.Linux进阶 3.python基础 : 1.python基础大纲 2.变量 ...

最新文章

  1. python 提交表单登录不成功_Python http requests模拟登录与提交表单的实现问题
  2. fileupload.class.php,php文件上传类
  3. 越南估值最高的电商公司之一:Tiki获1亿美元融资!
  4. 机器人环境感知算法之鲁棒感知阶段
  5. 用CubeSLAM跑自己的数据集
  6. matlab信息量估计法估计嵌入率,LSB密写分析-信息量估计法
  7. JavaScript:屏蔽浏览器右键点击事件
  8. rubyinstaller官网无法访问的解决办法
  9. vim编辑器下载Linux版,强大的vim编辑器【下载!linux基础命令豪华版】
  10. 传奇程序员云风:从创业到被招安,细数我这20年程序人生
  11. PCL中3D点云特征描述与提取(二)
  12. 2022年全球市场三维测量产品总体规模、主要生产商、主要地区、产品和应用细分研究报告
  13. ionicapp开场动画_动画开场类型
  14. Linux 内核文件系统模块结构体关系图
  15. 基于微信共享洗衣小程序系统设计与实现 开题报告
  16. windows10电脑在哪配置DNS
  17. 谷歌正式发布Android 12,UI更好看,应用更快,打造独属于自己的定制化属性
  18. Fedora的服务详解zz
  19. 发送手机验证码,验证手机验证码,包括数据表的设计
  20. 机械革命无法使用U盘启动linux,机械革命bios设置,教您机械革命bios怎么设置u盘启动...

热门文章

  1. 安装Exchange Server2016管理工具
  2. django 1.8 官方文档翻译: 3-4-2 基于类的内建通用视图
  3. 那些在学习iOS开发前就应该知道的事(part 1)
  4. 最新行政区划编码数据
  5. Symbian的内存管理机制
  6. SQL Server 表分区实战系列(文章索引)
  7. 重构代码(应如写诗)
  8. 在Kubernetes集群上部署高可用Harbor镜像仓库
  9. Spring+Shiro的踩坑
  10. PHP原生处理select结果集的函数介绍