java程序员必备——Java 性能优化的 45 个细节

整理了13大Java面试必备的高清思维导图 + 45W字PDF 终于出世 熬了七天七夜,整理了九大应付面试的思维导图 + 一份 45W字 的程序员内功修炼手册。当时我就是靠着这份思维导图拿到了大厂 offer 的。 阅读详情

点关注,不迷路;持续更新Java架构相关技术及资讯热文!!!

眼尖的朋友可能还看见了此博客页面左上角还有惊喜哟

在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身。养成良好的编码习惯非常重要,能够显著地提升程序性能。

1. 尽量在合适的场合使用单例

使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面:

  • 控制资源的使用,通过线程同步来控制资源的并发访问;
  • 控制实例的产生,以达到节约资源的目的;
  • 控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。

2. 尽量避免随意使用静态变量

当某个对象被定义为static变量所引用,那么GC通常是不会回收这个对象所占有的内存,如
···
public class A{
private static B b = new B();
}
···
此时静态变量b的生命周期与A类同步,如果A类不会卸载,那么b对象会常驻内存,直到程序终止。

3. 尽量避免过多过常地创建Java对象

尽量避免在经常调用的方法,循环中new对象,由于系统不仅要花费时间来创建对象,而且还要花时间对这些对象进行垃圾回收和处理,在我们可以控制的范围内,最大限度地重用对象,最好能用基本的数据类型或数组来替代对象。

4. 尽量使用final修饰符

带有final修饰符的类是不可派生的。在JAVA核心API中,有许多应用final的例子,例如java、lang、String,为String类指定final防止了使用者覆盖length()方法。另外,如果一个类是final的,则该类所有方法都是final的。java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关),此举能够使性能平均提高50%。

如:让访问实例内变量的getter/setter方法变成”final:

简单的getter/setter方法应该被置成final,这会告诉编译器,这个方法不会被重载,所以,可以变成”inlined”,例子:

class MAF {
	public void setSize (int size) {
		_size = size;
	}
	private int _size;
}

更正

class DAF_fixed {
	final public void setSize (int size) {
		_size = size;
	}
	private int _size;
}

5. 尽量使用局部变量

调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快;其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。

6. 尽量处理好包装类型和基本类型两者的使用场所

虽然包装类型和基本类型在使用过程中是可以相互转换,但它们两者所产生的内存区域是完全不同的,基本类型数据产生和处理都在栈中处理,包装类型是对象,是在堆中产生实例。在集合类对象,有对象方面需要的处理适用包装类型,其他的处理提倡使用基本类型。

7. 慎用synchronized,尽量减小synchronize的方法

都知道,实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。synchronize方法被调用时,直接会把当前对象锁了,在方法执行完之前其他线程无法调用当前对象的其他方法。所以,synchronize的方法尽量减小,并且应尽量使用方法同步代替代码块同步。

8. 尽量不要使用finalize方法

实际上,将资源清理放在finalize方法中完成是非常不好的选择,由于GC的工作量很大,尤其是回收Young代内存时,大都会引起应用程序暂停,所以再选择使用finalize方法进行资源清理,会导致GC负担更大,程序运行效率更差。

9. 尽量使用基本数据类型代替对象

String str = "hello";

上面这种方式会创建一个“hello”字符串,而且JVM的字符缓存池还会缓存这个字符串;

String str = new String("hello");

此时程序除创建字符串外,str所引用的String对象底层还包含一个char[]数组,这个char[]数组依次存放了h,e,l,l,o

10. 多线程在未发生线程安全前提下应尽量使用HashMap、ArrayList

HashTable、Vector等使用了同步机制,降低了性能。

11. 尽量合理的创建HashMap

当你要创建一个比较大的hashMap时,充分利用这个构造函数

public HashMap(int initialCapacity, float loadFactor);

避免HashMap多次进行了hash重构,扩容是一件很耗费性能的事,在默认中initialCapacity只有16,而loadFactor是 0.75,需要多大的容量,你最好能准确的估计你所需要的最佳大小,同样的Hashtable,Vectors也是一样的道理。

12. 量减少对变量的重复计算

如:

for(int i=0;i<list.size();i++)

应该改为:

for(int i=0,len=list.size();i<len;i++)

并且在循环中应该避免使用复杂的表达式,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。

13. 尽量避免不必要的创建

如:

A a = new A();
if(i==1){
	list.add(a);
}

应该改为:


if(i==1){
	A a = new A();
	list.add(a);
}

14. 尽量在finally块中释放资源

程序中使用到的资源应当被释放,以避免资源泄漏,这最好在finally块中去做。不管程序执行的结果如何,finally块总是会执行的,以确保资源的正确关闭。

15. 尽量使用移位来代替’a/b’的操作

"/"是一个代价很高的操作,使用移位的操作将会更快和更有效

如:

int num = a / 4;
int num = a / 8;

应该改为:

int num = a >> 2;
int num = a >> 3;

但注意的是使用移位应添加注释,因为移位操作不直观,比较难理解。

16.尽量使用移位来代替’a*b’的操作

同样的,对于’*'操作,使用移位的操作将会更快和更有效

如:

int num = a * 4;
int num = a * 8;

应该改为:

int num = a << 2;
int num = a << 3;

17. 尽量确定StringBuffer的容量

StringBuffer 的构造器会创建一个默认大小(通常是16)的字符数组。在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再丢弃旧的数组。在大多数情况下,你可以在创建 StringBuffer的时候指定大小,这样就避免了在容量不够的时候自动增长,以提高性能。

如:

StringBuffer buffer = new StringBuffer(1000);

18. 尽量早释放无用对象的引用

大部分时,方法局部引用变量所引用的对象会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null。

例如:

Java代码

Public void test(){
	Object obj = new Object();
	……
	Obj=null;
}

上面这个就没必要了,随着方法test()的执行完成,程序中obj引用变量的作用域就结束了。但是如果是改成下面:

Java代码

Public void test(){
	Object obj = new Object();
	……
	Obj=null;
	//执行耗时,耗内存操作;或调用耗时,耗内存的方法
	……
}

这时候就有必要将obj赋值为null,可以尽早的释放对Object对象的引用。

19. 尽量避免使用二维数组

二维数据占用的内存空间比一维数组多得多,大概10倍以上。

20. 尽量避免使用split

除非是必须的,否则应该避免使用split,split由于支持正则表达式,所以效率比较低,如果是频繁的几十,几百万的调用将会耗费大量资源,如果确实需要频繁的调用split,可以考虑使用apache的StringUtils.split(string,char),频繁split的可以缓存结果。

21. ArrayList & LinkedList

一个是线性表,一个是链表,一句话,随机查询尽量使用ArrayList,ArrayList优于LinkedList,LinkedList还要移动指针,添加删除的操作LinkedList优于ArrayList,ArrayList还要移动数据,不过这是理论性分析,事实未必如此,重要的是理解好2者得数据结构,对症下药。

22. 尽量使用System.arraycopy ()代替通过来循环复制数组

System.arraycopy() 要比通过循环来复制数组快的多。

23. 尽量缓存经常使用的对象

尽可能将经常使用的对象进行缓存,可以使用数组,或HashMap的容器来进行缓存,但这种方式可能导致系统占用过多的缓存,性能下降,推荐可以使用一些第三方的开源工具,如EhCache,Oscache进行缓存,他们基本都实现了FIFO/FLU等缓存算法。

24. 尽量避免非常大的内存分配

有时候问题不是由当时的堆状态造成的,而是因为分配失败造成的。分配的内存块都必须是连续的,而随着堆越来越满,找到较大的连续块越来越困难。

25. 慎用异常

当创建一个异常时,需要收集一个栈跟踪(stack track),这个栈跟踪用于描述异常是在何处创建的。构建这些栈跟踪时需要为运行时栈做一份快照,正是这一部分开销很大。当需要创建一个 Exception 时,JVM 不得不说:先别动,我想就您现在的样子存一份快照,所以暂时停止入栈和出栈操作。栈跟踪不只包含运行时栈中的一两个元素,而是包含这个栈中的每一个元素。

如果您创建一个 Exception ,就得付出代价,好在捕获异常开销不大,因此可以使用 try-catch 将核心内容包起来。从技术上讲,你甚至可以随意地抛出异常,而不用花费很大的代价。招致性能损失的并不是 throw 操作——尽管在没有预先创建异常的情况下就抛出异常是有点不寻常。真正要花代价的是创建异常,幸运的是,好的编程习惯已教会我们,不应该不管三七二十一就抛出异常。异常是为异常的情况而设计的,使用时也应该牢记这一原则。

26. 尽量重用对象

特别是String对象的使用中,出现字符串连接情况时应使用StringBuffer代替,由于系统不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理。因此生成过多的对象将会给程序的性能带来很大的影响。

27. 不要重复初始化变量

默认情况下,调用类的构造函数时,java会把变量初始化成确定的值,所有的对象被设置成null,整数变量设置成0,float和double变量设置成0.0,逻辑值设置成false。当一个类从另一个类派生时,这一点尤其应该注意,因为用new关键字创建一个对象时,构造函数链中的所有构造函数都会被自动调用。

这里有个注意,给成员变量设置初始值但需要调用其他方法的时候,最好放在一个方法。比如initXXX()中,因为直接调用某方法赋值可能会因为类尚未初始化而抛空指针异常,如:public int state = this.getState()。

28. 在java+Oracle的应用系统开发中,java中内嵌的SQL语言应尽量使用大写形式,以减少Oracle解析器的解析负担。

29. 在java编程过程中,进行数据库连接,I/O流操作,在使用完毕后,及时关闭以释放资源。因为对这些大对象的操作会造成系统大的开销。

30. 过分的创建对象会消耗系统的大量内存,严重时,会导致内存泄漏,因此,保证过期的对象的及时回收具有重要意义。JVM的GC并非十分智能,因此建议在对象使用完毕后,手动设置成null。

31. 在使用同步机制时,应尽量使用方法同步代替代码块同步。

32. 不要在循环中使用Try/Catch语句,应把Try/Catch放在循环最外层

Error是获取系统错误的类,或者说是虚拟机错误的类。不是所有的错误Exception都能获取到的,虚拟机报错Exception就获取不到,必须用Error获取。

33. 通过StringBuffer的构造函数来设定它的初始化容量,可以明显提升性能

StringBuffer的默认容量为16,当StringBuffer的容量达到最大容量时,它会将自身容量增加到当前的2倍+2,也就是2*n+2。无论何时,只要StringBuffer到达它的最大容量,它就不得不创建一个新的对象数组,然后复制旧的对象数组,这会浪费很多时间。所以给StringBuffer设置一个合理的初始化容量值,是很有必要的!

34. 合理使用java.util.Vector

Vector与StringBuffer类似,每次扩展容量时,所有现有元素都要赋值到新的存储空间中。Vector的默认存储能力为10个元素,扩容加倍。

vector.add(index,obj) 这个方法可以将元素obj插入到index位置,但index以及之后的元素依次都要向下移动一个位置(将其索引加 1)。 除非必要,否则对性能不利。同样规则适用于remove(int index)方法,移除此向量中指定位置的元素。将所有后续元素左移(将其索引减 1)。返回此向量中移除的元素。所以删除vector最后一个元素要比删除第1个元素开销低很多。删除所有元素最好用removeAllElements()方法。

如果要删除vector里的一个元素可以使用 vector.remove(obj);而不必自己检索元素位置,再删除,如int index = indexOf(obj);vector.remove(index)。

35. 不用new关键字创建对象的实例

用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了Cloneable接口,我们可以调用它的clone()方法。clone()方法不会调用任何类构造函数。

下面是Factory模式的一个典型实现:

public static Credit getNewCredit()
{
	return new Credit();
}

改进后的代码使用clone()方法:

private static Credit BaseCredit = new Credit();
public static Credit getNewCredit()
{
	return (Credit)BaseCredit.clone();
}

36. 不要将数组声明为:public static final

37. HaspMap的遍历:

Map<String, String[]> paraMap = new HashMap<String, String[]>();
for ( Entry<String, String[]> entry : paraMap.entrySet() )
{
	String appFieldDefId = entry.getKey();
	String[] values = entry.getValue();
}

利用散列值取出相应的Entry做比较得到结果,取得entry的值之后直接取key和value。

38. array(数组)和ArrayList的使用

array 数组效率最高,但容量固定,无法动态改变,ArrayList容量可以动态增长,但牺牲了效率。

39. 单线程应尽量使用 HashMap, ArrayList,除非必要,否则不推荐使用HashTable,Vector,它们使用了同步机制,而降低了性能。

40. StringBuffer,StringBuilder的区别在于:

java.lang.StringBuffer 线程安全的可变字符序列。一个类似于String的字符串缓冲区,但不能修改。StringBuilder与该类相比,通常应该优先使用StringBuilder类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。为了获得更好的性能,在构造StringBuffer或StringBuilder时应尽量指定她的容量。当然如果不超过16个字符时就不用了。 相同情况下,使用StringBuilder比使用StringBuffer仅能获得10%~15%的性能提升,但却要冒多线程不安全的风险。综合考虑还是建议使用StringBuffer。

41. 尽量使用基本数据类型代替对象。

42. 使用具体类比使用接口效率高,但结构弹性降低了,但现代IDE都可以解决这个问题。

43. 考虑使用静态方法,如果你没有必要去访问对象的外部,那么就使你的方法成为静态方法。它会被更快地调用,因为它不需要一个虚拟函数导向表。这同时也是一个很好的实践,因为它告诉你如何区分方法的性质,调用这个方法不会改变对象的状态。

44. 应尽可能避免使用内在的GET,SET方法。

45.避免枚举,浮点数的使用。

以下举几个实用优化的例子:

①. 避免在循环条件中使用复杂表达式

在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。例子:

import java.util.Vector;
class CEL {
	void method (Vector vector) {
		for (int i = 0; i < vector.size (); i++) // Violation
		;
		// ...
	}
}

更正:

class CEL_fixed {
	void method (Vector vector) {
		int size = vector.size ()
		for (int i = 0; i < size; i++)
		;
		// ...
	}
}

②. 为’Vectors’ 和 'Hashtables’定义初始大小

JVM为Vector扩充大小的时候需要重新创建一个更大的数组,将原原先数组中的内容复制过来,最后,原先的数组再被回收。可见Vector容量的扩大是一个颇费时间的事。

通常,默认的10个元素大小是不够的。你最好能准确的估计你所需要的最佳大小。例子:

import java.util.Vector;
public class DIC {
	public void addObjects (Object[] o) {
		// if length > 10, Vector needs to expand
		for (int i = 0; i< o.length;i++) {
			v.add(o);
			// capacity before it can add more elements.
		}
	}
	public Vector v = new Vector();
	// no initialCapacity.
}

更正:

自己设定初始大小。

public Vector v = new Vector(20);

public Hashtable hash = new Hashtable(10);

③. 在finally块中关闭Stream

程序中使用到的资源应当被释放,以避免资源泄漏。这最好在finally块中去做。不管程序执行的结果如何,finally块总是会执行的,以确保资源的正确关闭。

④. 使用’System.arraycopy ()'代替通过来循环复制数组

例子:

public class IRB
{
	void method () {
		int[] array1 = new int [100];
		for (int i = 0; i < array1.length; i++) {
			array1 [i] = i;
		}
		int[] array2 = new int [100];
		for (int i = 0; i < array2.length; i++) {
			array2 [i] = array1 [i];
			// Violation
		}
	}
}

更正:

public class IRB
{
	void method () {
		int[] array1 = new int [100];
		for (int i = 0; i < array1.length; i++) {
			array1 [i] = i;
		}
		int[] array2 = new int [100];
		System.arraycopy(array1, 0, array2, 0, 100);
	}
}

⑤. 让访问实例内变量的getter/setter方法变成”final”

简单的getter/setter方法应该被置成final,这会告诉编译器,这个方法不会被重载,所以,可以变成”inlined”,例子:

class MAF {
	public void setSize (int size) {
		_size = size;
	}
	private int _size;
}

更正:

class DAF_fixed {
	final public void setSize (int size) {
		_size = size;
	}
	private int _size;
}

⑥. 对于常量字符串,用’String’ 代替 ‘StringBuffer’

常量字符串并不需要动态改变长度。

例子:

public class USC {
	String method () {
		StringBuffer s = new StringBuffer ("Hello");
		String t = s + "World!";
		return t;
	}
}

更正:把StringBuffer换成String,如果确定这个String不会再变的话,这将会减少运行开销提高性能。

⑦. 在字符串相加的时候,使用 ’ ’ 代替 " ",如果该字符串只有一个字符的话

例子:

public class STR {
	public void method(String s) {
		String string = s + "d" // violation.
		string = "abc" + "d" // violation.
		}
		}

更正:

将一个字符的字符串替换成’ ’

public class STR {
	public void method(String s) {
		String string = s + 'd'
		string = "abc" + 'd'
		}
		}

以上仅是Java方面编程时的性能优化,性能优化大部分都是在时间、效率、代码结构层次等方面的权衡,各有利弊,不要把上面内容当成教条,或许有些对我们实际工作适用,有些不适用,还望根据实际工作场景进行取舍,活学活用,变通为宜。

密码学实战:如何利用生日攻击破解哈希函数 本文深入探讨了生日攻击在密码学中的应用及其对哈希函数的威胁。通过分析生日悖论的数学原理,揭示了哈希函数在实际应用中的脆弱性,并提供了防御策略,如升级哈希算法、正确使用加盐技术等。文章结合实战案例,帮助开发者理解如何有效防范此类攻击,确保系统安全。 阅读详情

相关推荐

使用openair包分析气象数据

气象数据通常是有规律的时间序列,分析气象数据时需要对空气质量测量、气象数据和扩散模型输出进行分析。openair 是用于分析空气质量数据或更广泛的大气成分数据的R软件包。该软件包广泛应用于学术界、公共和私营部门。该项目最初由英国自然环境研究委员会(NERC)资助,并由英国环境部(Defra)提供额外资金。

Christina 2519

Java程序员必备——Java 性能优化的五大技巧

点关注,不迷路;持续更新Java架构相关技术及资讯热文!!! 眼尖的朋友可能还看见了此博客页面左上角还有惊喜哟 要对你的 java 代码进行优化,需要理解 java 不同要素之间的相互作用,以及它是如何与其运行时的操作系统进行交互的。使用下面这五个技巧和资源,开始学习如何分析和优化你的代码吧。 在我们开始之前, 你也许会担心许可的问题. Java 为 Oracle 公司所有,遵循 Oracl...

Java____superman的博客 436

PCIe链路均衡实战:从Preset调节到系数优化的完整指南(附Synopsy IP案例)

本文深入解析PCIe链路均衡技术,从Preset调节到系数优化的全流程实战指南,特别针对PCIe 3.0/4.0中的Recovery.Equalization状态进行详细说明。通过Synopsy IP案例,展示如何应对高速信号完整性挑战,优化前向反馈均衡(FFE)机制,提升系统性能。

peace的博客 1054

Java性能优化之编程技巧总结

程序的性能受代码质量的直接影响。在本文中,主要介绍一些代码编写的小技巧和惯例,这些技巧有助于在代码级别上提升系统性能。 1、慎用异常 在Java软件开发中,经常使用 try-catch 进行错误捕获,但是,try-catch 语句对系统性能而言是非常糟糕的。虽然在一次 try-catch中,无法察觉到它对性能带来的损失,但是,一旦try-catch被应用于循环之中,就会给系统性能带来极大的伤害。 ...

weixin_34198583的博客 483

告别手绘!用Aseprite+Unity Tilemap,从AI生成到2D游戏地图的保姆级搭建流程

本文详细介绍了如何利用Aseprite和Unity Tilemap从AI生成素材到搭建2D游戏地图的完整流程。涵盖AI生成素材的预处理、图层管理、动画制作,以及Unity中的Tilemap系统配置和性能优化技巧,帮助开发者高效创建像素风游戏地图。

weixin_29015483的博客 583

【Stata双重差分模型】双重差分DID的具体操作步骤

本案例将详细阐述如何使用双重差分法进行实证分析,并展示具体的STATA操作代码。

a519573917的博客 2万+

阿里45K高级Java研发岗,必备技能清单

相信你可能经历过这些: 已经工作两三年了,每个项目都会加班加点全力以赴去完成,薪资增长幅度却不如人意。 听说年后离职的老同事,金三刚拿下高薪offer,年薪直奔50万了。 由于现在的公司接触不到新技术,因为缺少核心竞争力,感到无比焦虑,未来职业道路怎么走? 最后,如果大家如果在自学遇到困难,想找一个java的学习环境,可以加入我们的java学习圈,点击我加入吧,会节约很多时间,减少很多在学习中遇到...

shenlinlin123456的博客 1180

Unity 横版游戏开发天花板?状态机、联机同步与横版动作游戏架构全都有

在 Unity 横版动作游戏开发领域,最耗时间的往往不是角色移动,而是整套“可扩展架构”的搭建。包括角色状态管理、敌人 AI、武器系统、关卡编辑器、联机同步、输入适配、UI 与存档系统等。2D Action Platformer Kit 的核心价值,并不只是“提供素材”,而是它已经帮开发者搭好了一整套适用于横版动作游戏的底层框架。

2403_88403568的博客 425

阿里45K高级Java岗,必备技能清单

相信你可能经历过这些: 已经工作两三年了,每个项目都会加班加点全力以赴去完成,薪资增长幅度却不如人意。 听说年后离职的老同事,金三刚拿下高薪offer,年薪直奔50万了。 由于现在的公司接触不到新技术,对自己的市场竞争力无比焦虑,未来职业道路怎么走? 这个凛冽寒冬,你终于明白,现在的工作机会很少,薪资很难有较大涨幅,Java工程师的年薪是技能决定的,是时候去提高技能,提前规划未来职业发展路径了...

mikechen的互联网架构 1537

YOLO系列算法改进 | C2PSA改进篇 | 融合FSD频域结构解耦模块 | 双域解耦感知,兼顾全局亮度与局部纹理,适应红外小目标与边缘部署场景 | ICME 2026

YOLO系列算法改进 | C2PSA改进篇 | 融合FSD频域结构解耦模块 | 双域解耦感知,兼顾全局亮度与局部纹理,适应红外小目标与边缘部署场景 | ICME 2026 (以YOLO26最新目标检测模型为基础,利用C2PSA_FSD创新模块进行改进)

2502_91881744的博客 315

USB_TYPE-C 母座电路设计

本文详细介绍了USB Type-C接口(C2765186)的电路设计要点,重点解析了电源、识别和数据三部分的关键连接方案。电源部分需并联VBUS和GND引脚并加宽走线以承载3A电流;识别部分必须为CC1/CC2引脚配置5.1kΩ±1%精度的下拉电阻,这是触发PD充电的核心条件;数据部分通过短接正反插引脚实现盲插功能。文档还提供了完整的引脚对照表,并强调PCB布局需注意ESD防护、差分走线阻抗控制等要点,为Type-C接口设计提供了实用指导。

在读研究生,FPGA电路设计与功能开发。 586

阿里45K高级Java岗,必备技能清单!

相信你可能经历过这些: 已经工作两三年了,每个项目都会加班加点全力以赴去完成,薪资增长幅度却不如人意。 听说年后离职的老同事,金三刚拿下高薪offer,年薪直奔50万了。 由于现在的公司接触不到新技术,对自己的市场竞争力无比焦虑,未来职业道路怎么走? 这个凛冽寒冬,你终于明白,现在的工作机会很少,薪资很难有较大涨幅,Java工程师的年薪是技能决定的,是时候去提高技能,提前规划未来职业发展路径了。 ...

shenlinlin123456的博客 249

一站式讲解Wireshark网络抓包分析的若干场景、过滤条件及分析方法

本文详细讲解常用的抓包工具、抓包分析的网络场景、分析抓包时的多种过滤条件以及如何结合常用的协议去分析排查问题,给大家提供一个借鉴或参考。

dvlinker的技术专栏 5万+

阿里45K高级Java岗,必备技能清单来了!

Java工程师是高薪职业,近年来互联网的高速发展下,更是一度成为抢手的热门职业,以至于投身到这个职业的人越来越多,千军万马过独木桥,想要不掉队,唯有努力学习,成为互联网公司高薪争抢的中高端Java工程师,才能不惧寒冬。如果将技术比做一棵树,每学会一门语言,就点亮树上一个果实,你会得越多,技术树的果实就越多,价值就越大。如果你能够认清自己以及自己所处的阶段,有针对性的去思考、充电,坚持做正确的事,付出比别人更多的努力,你就会比别人更加优秀,拥有更多的机会,这就是我们常说的马太效应:越努力,越幸运。

xuezhangmen的博客 573

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

阿里 45K Java架构师,必备技能清单

金九银十的跳槽面试季已经到来,最近跟朋友在一起聚会的时候,提了一个问题,说1-5年的Java程序员,薪资区间普遍是在15-25K左右,那有没有可能提前达到30K的薪资呢?...

a934079371的博客 416

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java性能优化实战:大厂程序员必备技能与误区

Java性能优化是每个开发者都需要掌握的核心技能,尤其在分布式系统和高并发场景下更为关键。从JVM内存模型到GC算法,理解底层原理是优化的基础。通过工具链(如Arthas、JVisualVM)进行诊断,结合代码层优化(如对象复用、并发控制)和JVM参数调优(如GC策略选择),可以显著提升系统吞吐量和稳定性。典型应用场景包括电商秒杀、实时风控等高性能要求系统,而容器化环境(如K8s)也带来了新的适配挑战。值得注意的是,OOM问题诊断和全链路压测已成为大厂高频技术需求,合理规避过早优化陷阱和指标误读是关键。掌握

weixin_29306317的博客 168

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

阿里45K高级Java岗,必备技能清单来了

相信你可能经历过这些:已经工作两三年了,每个项目都会加班加点全力以赴去完成,薪资增长幅度却不如人意。听说年后离职的老同事,金三刚拿下高薪offer,年薪直奔50万了。由于现在的公司接触不到新技术,对自己的市场竞争力无比焦虑,未来职业道路怎么走?这个凛冽寒冬,你终于明白,现在的工作机会很少,薪资很难有较大涨幅,Java工程师的年薪是技能决定的,是时候去提高技能,提前规划未来职业发展路径了。作为Java工程师的你,平时工作已经很忙了,到底该如何进阶,才能快速提高薪资到45万甚至100万呢?分享一些过来人的经验,

xuezhangmen的博客 303

Java最新《Java面试通关手册》已经很全面很详细了,程序员必备。,java面试两年工作经验的

做任何事情都要用心,要非常关注细节。看起来不起眼的、繁琐的工作做透了会有意想不到的价值。当然要想成为一个技术大牛也需要一定的思想格局,思想决定未来你要往哪个方向去走, 建议多看一些人生规划方面的书籍,多学习名人的思想格局,未来你的路会走的更远。更多的技术点思维导图我已经做了一个整理,涵盖了当下互联网最流行99%的技术点,在这里我将这份导图分享出来,以及为金九银十准备的一整套面试体系,上到集合,下到分布式微服务本文已被。

jiameih的博客 513

阿里40K+高级Java岗,必备技能清单

相信你可能经历过这些: 已经工作两三年了,每个项目都会加班加点全力以赴去完成,薪资增长幅度却不如人意。 听说年后离职的老同事,金三刚拿下高薪offer,年薪直奔50万了。 由于现在的公司接触不到新技术,对自己的市场竞争力无比焦虑,未来职业道路怎么走? 这个凛冽寒冬,你终于明白,现在的工作机会很少,薪资很难有较大涨幅,Java工程师的年薪是技能决定的,是时候去提高技能,提前规划未来职业发展路...

yonggeit的博客 3446

阿里架构师汇总了45个牛逼的Java技术点

作为一个程序员想要在技术深耕,一定要在技术上不断的下功夫。 Java程序员一定要学好重点的技术,如下面这些: 1.架构师基础专题 2.微服务框架技术 3.开源源码分析 4.高性能框架分享 5.团队协作开发 6.B2C商城项目实战 7.搜索引擎 8.容器化技术专题 Java程序员一定要学好重点的技术,如下面这些 并发包:理解 ConcurrentHashMap原理,线程池,异步并发,锁。 集合类,线程类。 http请求。 json,xml读写。 常用api。 前端模块java、css,熟悉一个前端框架。 常

m0_67621429的博客 285

java架构师_阿里架构师汇总了45个牛逼的Java技术点

作为一个程序员想要在技术深耕,一定要在技术上不断的下功夫。Java程序员一定要学好重点的技术,如下面这些:Java程序员一定要学好重点的技术,如下面这些并发包:理解 ConcurrentHashMap原理,线程池,异步并发,锁。集合类,线程类。http请求。json,xml读写。常用api。前端模块javascript、css,熟悉一个前端框架。常用框架、常见的设计模式、面向对象。加薪...

weixin_39805195的博客 262
上一篇: Java性能优化:35 个小细节,让你提升Java代码的运行效率
下一篇: Java面试题:如何解决几百万消息持续积压几小时?
Java_No01
博客等级 码龄7年 17粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值