网站首页 > 技术文章 正文
首先,良好的编码实践非常重要。在Java程序中,访问速度、资源限制等问题的原因大多是由代码不规范引起的。
单例使用场景
单例模式在减少资源占用、提高访问速度方面有很多好处,但并不是所有场景都适合单例。
简单来说,单例主要适用于以下三个方面:
多线程场景下,通过线程同步来控制资源的并发访问。
多线程场景控制数据共享并允许多个不相关的进程或线程之间进行通信(通过访问同一资源来控制)。
控制实例的生成,单例只实例化一次,节省资源;
不要随意使用静态变量
当一个对象被定义为变量时,GC通常不会回收该对象所占用的内存。
示例如下:
A类{
B b = 新 B();
此时,静态变量b的生命周期与A类同步,即如果A类不被卸载,则对象b将驻留在内存中,直到程序终止。
创建Java对象时需要注意的事项
根据业务使用场景,尽量避免循环新增对象。
这是因为系统需要时间来创建对象,也需要时间来管理和垃圾收集这些对象。因此,在控制范围内,尽量保证对象的最大复用。最好用基本数据类型或数组替换对象。
使用final修饰符时的注意事项
带有final修饰符的类不是派生的,即不能被继承。在核心Java代码中,有很多被final修饰的类,例如java.lang。班级。
如果一个类是final的,那么该类的所有方法都是final的。 Java编译器会寻找机会()所有final方法,这与具体的编译器实现有关。这样做可以平均提高 50% 的性能。
A类{
无效(整数大小){
this.size = 大小;
整数大小;
//方法变为final,性能更好
A类{
最终无效(int大小){
this.size = 大小;
整数大小;
将/访问实例变量的方法设为final:一个简单的/方法应该设为final,它告诉编译器这个方法不会被重载,可以设为“”。
使用局部变量的规范
调用方法时传递的参数以及调用过程中创建的临时变量都保存在栈(Stack)中,速度更快;其他变量,如静态变量、实例变量等,都是在堆(Heap)中创建的,速度较慢。
处理包装类型和使用场所的基本类型
基本类型:byte、short、int、long、float、、char、
对应的封装类型:Byte、Short、Int、Long、Float、、、
基本类型和包装类型在使用过程中可以相互转换,但它们生成的内存区域完全不同。基本类型的生成和处理都是在栈上处理的。包装类型是引用类型,它的对象是在堆中生成的实例。
在集合类对象中,处理需要处理的对象时适合使用包装类型,其他情况建议使用基本类型进行处理。
使用原始数据类型而不是对象
s1 =“你好”;
这个方法会创建一个“hello”字符串,JVM的字符缓冲池会缓存这个字符串。
s2 = new(“你好”);
除了以这种方式创建字符串之外,s2引用的底层对象还包含一个char[]数组,该数组依次存储h、e、l、l、o。
使用说明
实现同步需要大量的系统开销作为代价,甚至可能会造成死锁。所以尽量避免不必要的同步控制。
调用该方法时,会直接锁定当前对象。在该方法执行完毕之前,其他线程无法调用当前对象的其他方法。更灵活的用法是使用代码块同步,而不是在方法中同步。
使用说明
不要将资源清理放在方法中。这种方法很少使用。
由于GC的工作量很大,特别是在回收Young代内存时,常常会导致应用程序暂停。如果选择使用方法来清理资源,就会增加GC的负担,使程序的运行效率变差。
线程同步不是必需的,应尽可能使用。
等使用同步机制,导致减少。
使用说明
创建较大的对象时,应该使用带参数的构造函数来创建对象。
示例如下:
(整数,浮点数);
哈希扩展是一个非常消耗性能的事情。默认构造函数仅创建 16 个对象,即 0.75。最好准确估计所需的最佳尺寸。对于 也是如此。
减少变量的重复计算
for (int i = 0; i < list.size(); i++) {...}
// 应改为
for (int i=0, l=list.size(); i < l; i++) {...}
避免不必要的对象创建
A a = 新A();
如果(我==1){
列表.add(a);
// 应改为
如果(我==1){
A a = 新A();
列表.add(a);
使用说明
在try-catch中,所使用的资源必须能够被释放,以避免资源泄漏,这最好以块的形式进行。无论程序执行过程中是否出现异常,中的代码都会被执行,从而保证资源被正确关闭。
使用说明
无参构造函数创建一个字符数组,默认大小为16。在使用过程中,如果数组长度超过16,则需要重新分配内存,创建一个更大容量的数组,并复制原数组,旧数组必须被丢弃。
大多数情况下,可以在创建时指定大小,以避免容量不足以提高性能时自动增长。
sb=新的(int);
显式释放空间并让gc回收对象
大多数情况下,方法内部局部引用变量所引用的对象会变成垃圾,并在方法结束时被回收。因此,不需要在程序中显式地将局部引用变量设置为null。
示例如下:
空白 () {
obj = new();
……
对象=空;
随着()执行完毕,程序中局部引用变量obj的作用域结束,此时不需要执行obj = null。
反例如下:
空白 (){
obj=new();
……
对象=空;
//耗时、耗内存的操作
……
这时候就需要尽快释放不再使用的空间,执行obj = null显式释放局部引用变量obj。
二维数组使用规范
二维数据比一维数组占用的内存空间大约多 10 倍。
分割使用场景
尽量避免使用 split。 split使用正则表达式,效率相对较低。频繁的调用会消耗大量的资源。
如果确实需要频繁调用split,最好使用.split(,char),它可以缓存结果。
及使用规格
对于线性表和链表来说,随机查询的操作比移动指针的操作要好。添加和删?除操作优于需要移动数据的操作。
.() 使用指南
尝试使用 .() 来复制数组,它比通过循环复制数组要快得多。
缓存对象
当缓存经常使用的对象时,可以使用数组或者其他容器来缓存。这种方法需要您自己管理这些容器,可能会导致系统占用过多的缓存并降低性能。
您还可以使用一些第三方开源工具(例如 )进行缓存。它们基本上实现了 FIFO/FLU 等缓存算法。
尽量避免非常大的内存分配
有些问题并不是堆内存不足造成的,而是内存分配失败造成的。 (gc会对内存进行碎片整理)
如果分配的内存块必须全部是连续的,那么随着堆变满,找到更大的连续块将变得越来越困难。
try/catch 使用场景
不要在循环中使用 try/catch 语句。将 try/catch 放在循环的最外层。
- 上一篇: CPU眼里的:静态、全局、临时变量
- 下一篇: VuePress - Vue驱动的静态网站生成器
猜你喜欢
- 2025-01-14 一个不错的“短信验证”开源项目,开箱即用
- 2025-01-14 C++入门基础(万字总结)(建议收藏!!!)
- 2025-01-14 Java 中的静态字段和静态方法
- 2025-01-14 静态代码测试多语言特长生 Klocwork 2023.2更新快讯
- 2025-01-14 推荐一个嵌入式静态代码扫描工具!
- 2025-01-14 GO 编程:元编程之插件系统
- 2025-01-14 代码静态分析与安全检测工具COBOT
- 2025-01-14 VB脚本修改静态文本域内容:Wincc V14文本域显示任意文字的方法
- 2025-01-14 代码静态检查Findbugs使用说明
- 2025-01-14 VuePress - Vue驱动的静态网站生成器
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)