让你脱胎成技术大神的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入门教学资源。帮助大家在成为Java架构师的道路上披荆斩棘。需要资料的欢迎加入学习交流群:9285,05736

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503187.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java大牛分享的面试知识点

1.基本部分 无论使用哪种编程语言,基础始终是您不能忽视的部分。以下是经常出现的十点,当然最好熟悉。 使用length属性获取数组的长度,public,private,protected,friendly。 计算2 * 8的最有效方法是等于…

看Java大牛是如何高效学习的?你掌握好这些了吗?

1. 能够认清自己 一个技术专家,年龄不是那么可怕,可怕的是你不符合他们的年龄技术深度。当你把你的工作换成一个刚刚毕业的人,你很快就会被淘汰。所以,你必须选择你感兴趣的方向,因为只有这样,你才有兴趣深…

Java大牛的一些总结,献给对未来还在迷茫中的你!

恍然间,发现自己在这个行业里已经摸爬滚打了五年了,原以为自己就凭已有的项目经验和工作经历怎么着也应该算得上是一个业内比较资历的人士了,但是今年在换工作的过程中却遭到了重大的挫折。详细过程我就不再叙述,在此,…

java初学者只要掌握了以下十大原则,可以让你的技术飙升

1. 将一些需要变动的配置写在属性文件中 比如,没有把一些需要并发执行时使用的线程数设置成可在属性文件中配置。那么你的程序无论在DEV环境中,还是TEST环境中,都可以顺畅无阻地运行,但是一旦部署在PROD上,把它作为多…

一位资深程序员大牛给Java初学者的学习建议

糖糖发现最近很多想要学习Java的小白或者转行到Java这个行业的伙伴们不知道怎样学习才能学得更多专业,今天糖糖给大家整理了一些前辈们的学习方法和技巧,以及常看的一些书籍。这些也非常适合初入Java行业的伙伴们。咱们就来一起看看。 首选对于在校的一…

Java学习的5个阶段,助大家步步攀升

第一阶段:基础阶段(Java基础) 你将要在这个阶段学会的技能: 软件行业信息了解、 java的魅力和安装、 变量、 常量、 算术、 关系、 逻辑、 三目、 if else、 switch、 while、 for、 for高级、 do while、 方法、 方法算法、 封…

java学习明确的路线规划奉上,助大家进阶

1.刚开始需要知道什么 Java SE是我们Java入门的开端,是Java学习的基石,这块内容也就是大家所熟悉的坦克大战、聊天软件、五子棋这些桌面级项目所组成的。学完了Java SE部分,接下来就该选择方向了。 2. Java SE中应该关注的内容 下面我们将…

深入理解Java中的位操作

与、或、非、位移 原码、反码、补码 字节、位、超区间...... 开始本章节之前,我们先思考一个问题: byte a 33; byte b -3;若我们输出a、b的二进制字符串是多少? 答案是这样的么? a->// 00100001 b->// 10100001当然…

同样是Java程序员,如何比别人更优秀?

随着互联网时代的飞速发展,越来越多的人投身于软件开发行业,大家都称他们为程序员,或者码农。 这些程序员的水平也是参差不齐的,有些人从比较好的学校毕业,水平却一般般;也有些人从一般搬的学校毕业&#…

初学Java编程经常遇到的问题,你们遇到过吗?

随着互联网时代的飞速发展,越来越多的人投身于软件开发行业,大家都称他们为程序员,或者码农。 这些程序员的水平也是参差不齐的,有些人从比较好的学校毕业,水平却一般般;也有些人从一般搬的学校毕业&#…

Java技术学习笔记:C/S 与B/S 区别

C/S 是Client/Server 的缩写,是客户机与服务器结构的应用程序,服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、Informix 或SQL Server。客户端需要安装专用的客户端软件。 B/S是B…

学习Java编程equals()和hashCode()方法

equals()和hashCode()区别? equals():反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值。 hashCode():计算出对象实例的哈希码,并返回哈希码,又称为…

Java技术依然备受追捧,主要学习内容有哪些?

Java技术依然备受追捧,主要学习内容有哪些?Java 语言是一门随时代快速发展的计算机语言程序,其深刻展示了程序编写的精髓,加上其简明严谨的结构及简洁的语法编写为其将来的发展及维护提供了保障。 在众多的主流编程语言中&#x…

六本JAVA架构书,构建科学得架构知识体系

今天把我看过的 6 本架构方面的书都推荐给大家,总有一本满足你的需要。 1. 《大型网站技术架构:核心原理与案例分析》 这是比较早,比较系统介绍大型网站技术架构的书,通俗易懂又充满智慧,即便你之前完全没接触过网站开…

最难学的十大编程语言,Java排第二,它竟是第一名!

开发者经济分析公司 SlashData 曾发布了《 2018 年第 2 季度各国开发者状况》调查报告,共有 167 个国家的 20500 多名开发者参与其中。 报告面向全球所有类型的程序员,对使用每种主要编程语言的活跃开发者数量进行了最新的估计。其中,JavaSc…

java编程中的持有对方引用是什么意思?有什么作用?

持有对方引用比如 A类有: h、j、 k, 3种方法,B类有 h 1种方法,但我B类必须要用到 A 类的 k方法怎么办呢?那么下面就要引入引用了!我在 B 类中创建个A类的引用,例如 如果在同一包下就不用导包了 …

Java学习之数据库中的范式和反范式

范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。数据库的设计范式是数据库设计所需要满足的规范。只有理解数据库的设计范式,才能设计出高效率、优雅的数据库,否则可能会设计出错误的数据库。 反范式&…

Java开发中如何用JDBC连接起数据库?

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口&…

Java程序员最值得学习的10大技术

程序员们是最具有挑战性的工作,我们最大的挑战就是保持自己了解新的技术。技术变化很快,你大概每两年就会看到一个新版本的编程语言和框架。 就拿2017年来说,AR、VR、区块链、人工智能等等已经扑面而来了。除了这些离我们较远的,说几个离我们…

Java开发环境搭建详细步骤

安装JDK 首先下载jdk进官网下载jdk 选择相应的系统。 一键安装即可。 安装后会有两个jre,一个jdk内部的,和jdk外部的 关于两套jre的解释 一个jre文件在JDK的外部,一个jre文件在JDK内部,这就是所谓的专用JRE和公用JRE 专用 J…