# 中国工商银行 Java 面试

大家好,我是小林。

还有一个月就春节啦,现在不少公司都开始发年终奖了 。说实话,能在春节前发年终奖的,那都是良心公司!毕竟过年要花的钱可不少,买年货、发红包、走亲戚,哪样不花钱?

反观有些公司,年终奖就真的是年中奖,要拖到 5、6 月份才发,那叫一个煎熬。

一直以来,好多人都好奇银行的年终奖到底怎么样?毕竟银行听着稳定,待遇也神秘。

刚好我在「脉脉」上刷到一堆中国工商银行的2025年终奖爆料,整理了一波给大家看看,仅作参考哈:

  • 同学 A:发放月数 5 月,总额 8.5 万,研发岗,五味杂陈
  • 同学 B:发放月数 2 月,总额 2 万,研发岗,五味杂陈
  • 同学 C:发放月数 6 月,总额 6 万,研发岗,重在参与
  • 同学 D:发放月数 3 月,总额 3 万,测试岗,五味杂陈
  • 同学 E:发放月数 2 月,总额 4 万,研发岗,远超预期
  • 同学 F:发放月数 1 月,总额 1 万,研发岗,五味杂陈
  • 同学 G:发放月数 3 月,总额没说,研发岗,重在参与

看下来,大家的感受基本都是 “五味杂陈”,很真实了。

从数据能看出来,中位数大概是 2-3 个月工资,也就是 14-15 薪的水平。绩效好的能拿到 5-6 个月,算是天花板了;绩效差的可能就 1 个月,聊胜于无。

我知道很多学历不错的同学,目标都是冲银行或者国企,觉得银行面试简单。

这话确实没毛病,银行面试比互联网公司简单不止一个档次,基本不怎么考深技术,更多是聊经历、看综合素质。

但我一直有个建议:准备面试的时候,尽量按互联网中大厂的难度来!

这样你去面银行就是降维打击,稳得一批;而且还能顺手投投互联网公司,多拿几个 offer 在手,最后再慢慢选是去银行安稳,还是去互联网拼一把。

要是你只按银行的难度准备,万一银行没面上,再转头去面互联网,大概率会凉 , 之前的学习强度太浅了,根本扛不住互联网公司的技术拷问。

就比如,有后端训练营 (opens new window)的同学学习强度就是按照大厂强度去准备了,最终他银行+大厂+国企 offer 都能拿到了,这是很多人理想的 offer 情况了,最高的还开了 48w 总包。

不过话说回来,论技术成长,银行肯定比不上互联网公司。

要是你想在技术上多学东西、未来有更大发展,刚毕业真的更建议去互联网公司闯一闯。

虽然互联网变化快、看着不稳定,但你在那儿积累个 1-2 年经验,再跳槽去国企或者银行,那时候选择权就在你手上了,既懂技术又有大厂背书,香得很。

当然,不是所有人都想走技术路线。要是你就想工作轻松点、稳定点,不用天天加班,那选银行也没毛病。

这事儿没有绝对的对错,核心就是看你更看重什么 , 是高薪和成长,还是安稳和平衡。

话说到这儿,中国工商银行的面试到底难不难?

这次就带大家瞧一瞧工行软开的一面面经。除了聊校园经历、项目情况,技术问题就问了 6 个,还都是比较基础的那种,基本没什么压力。

# 工商银行(软开一面)

# 1. Java和 C++有什么区别?

最核心的区别是运行机制不同。C++是直接编译成机器码,在操作系统上直接运行,而Java是先编译成字节码,然后在JVM上运行。这就带来了Java的"一次编写,到处运行"的特性,同一份字节码可以在不同平台的JVM上跑,而C++编译出来的程序是平台相关的,Windows上编译的在Linux上就跑不了。

然后是内存管理方面。C++需要程序员手动管理内存,new了之后必须delete,不然就会内存泄漏,这给开发带来很大压力,但好处是你可以精确控制内存的分配和释放,性能更高。Java有自动垃圾回收机制,程序员不用管内存释放,JVM会自动回收不用的对象,这降低了开发难度,但也带来了GC的性能开销,而且你无法精确控制内存何时释放。

指针也是个很大的区别。C++有指针,可以直接操作内存地址,这很灵活但也很危险,野指针、空指针、内存越界这些问题很容易出现。Java没有指针的概念,只有引用,而且JVM会做边界检查,相对更安全,但也牺牲了一些灵活性和性能。

性能上来说,C++一般会比Java快,因为它直接编译成机器码,没有JVM这一层,内存管理也更精细。但现代JVM有JIT即时编译,热点代码会被编译成本地代码,再加上各种优化,差距已经没那么大了。对于大部分业务场景,Java的性能是够用的。

应用场景上,C++更多用在对性能要求极高的领域,比如游戏引擎、操作系统、嵌入式系统、高频交易这些。Java更多用在企业级应用、Web开发、Android开发、大数据这些领域,它的生态更丰富,开发效率更高。

# 2. 进程和线程的区别?

  • 本质区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
  • 在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小
  • 稳定性方面:进程中某个线程如果崩溃了,可能会导致整个进程都崩溃。而进程中的子进程崩溃,并不会影响其他进程。
  • 内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源
  • 包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线

# 3. Linux系统如何看各进程所占内存?

最常用的是top命令,直接输入top就能实时动态地看到所有进程的运行状态。在top的输出里,RES这一列显示的就是进程实际占用的物理内存大小,%MEM这一列是内存占用的百分比。如果只想看某个特定进程,可以用top -p 进程ID,这样就只显示那一个进程的信息,很清晰。按q键可以退出top。

图片

如果不需要动态刷新,只是想快速查看一下,可以用ps命令。我一般用ps aux | grep 进程名来查找具体进程,或者用ps aux | sort -k4nr | head -n 10直接列出内存占用最高的前10个进程。这里的-k4nr是按第4列也就是内存占用率倒序排列,这个命令在排查内存问题时特别好用。ps输出里的VSZ是虚拟内存,RSS是实际占用的物理内存,%MEM是内存占用百分比。

图片

如果想看某个进程更详细的内存信息,可以直接查看/proc/进程ID/status文件,用cat /proc/进程ID/status命令。这个文件里有个VmRSS字段,显示的就是该进程占用的物理内存大小,单位是KB,信息比较全面。

图片

还有个free命令可以看系统整体的内存使用情况,虽然它不是看单个进程的,但排查问题时经常配合使用。free -h可以用人类可读的方式显示,会自动转换成GB、MB这种单位。主要关注available这一列,它表示还有多少内存可用。

图片

# 4. 怎么看占用内存前十的进程?

查看占用内存前十的进程,我最常用的就是ps命令配合sort和head。直接用ps aux | sort -k4nr | head -n 10这条命令就行了。

图片

简单解释一下,ps aux会列出所有进程的详细信息,然后通过管道传给sort命令。sort的-k4nr参数里,-k4表示按第4列排序,也就是%MEM这一列,n表示按数值大小排序,r表示倒序,这样内存占用最多的就排在最前面了。最后用head -n 10取前10行,就得到了内存占用最高的十个进程。

如果想用top命令来看,也可以。先输入top进入交互界面,然后按shift加M键,也就是大写的M,top就会按内存使用率自动排序,排在最上面的就是占用内存最多的进程。这个方法的好处是可以实时刷新,能动态观察内存变化情况,但如果只是想快速看一眼,还是ps那条命令更直接。

图片

# 5. 怎么看一个 Java 进程占用多少堆内存、栈内存?

看Java堆内存要用JVM自带的工具,比如jmap -heap 进程ID可以看到堆的详细配置和使用情况,包括新生代、老年代、元空间这些。

或者用jstat -gc 进程ID可以实时监控GC和堆内存的使用。Java的栈内存是在JVM堆外的,每个线程一个栈,可以通过jstack 进程ID看线程栈信息,配合JVM启动参数-Xss能知道单个线程栈的大小。

# 6. 讲几个jvm内存调优工具?

JVM内存调优工具我在实际工作中用得比较多的主要有这么几个。

首先是jstat,这是我用得最频繁的命令行工具。用jstat -gc 进程ID 1000可以每秒输出一次GC的统计信息,能看到新生代、老年代、元空间的使用情况,以及GC的次数和耗时。我一般用它来快速判断是不是有内存泄漏或者频繁GC的问题。如果看到老年代一直在涨,或者Full GC特别频繁,基本就能确定有问题了。这个工具轻量级,不会对应用造成什么影响,特别适合生产环境快速排查。

图片

然后是jmap,这个主要用来查看堆内存的详细信息和dump堆快照。jmap -heap 进程ID可以看到堆的配置参数和各个区域的使用情况,比如Eden区、Survivor区、老年代分别用了多少。如果怀疑有内存泄漏,我会用jmap -dump:format=b,file=heap.hprof 进程ID导出堆快照,然后拿去做深入分析。不过jmap会暂停应用,所以生产环境用的时候要谨慎,最好在业务低峰期操作。

图片

导出的堆快照文件要用MAT或者jvisualvm来分析。MAT就是Memory Analyzer Tool,它能自动分析出可能的内存泄漏点,显示哪些对象占用内存最多,还有对象之间的引用关系。我一般会看它的Leak Suspects报告,能快速定位到问题。jvisualvm是JDK自带的图形化工具,界面比较直观,可以实时监控CPU、内存、线程,还能做性能分析和堆dump分析,比较适合本地开发环境使用。

图片

如果是线上问题排查,我会用Arthas这个阿里开源的工具。它功能很强大,不需要重启应用就能attach到JVM进程上。用dashboard命令可以实时看到内存、GC、线程的概览,用memory命令能看各个区域的详细使用情况。最方便的是它的heapdump命令可以在线dump堆,而且支持只dump存活对象,文件会小很多,下载也快。Arthas还能动态修改日志级别、查看方法调用栈,功能非常全面。

图片

还有GC日志分析,这个虽然不算工具,但也很重要。在JVM启动参数里加上-Xloggc-XX:+PrintGCDetails这些参数,会把GC的详细信息输出到日志文件。然后可以用GCeasy或者GCViewer这些在线工具来可视化分析GC日志,能看到GC的频率、停顿时间、内存变化趋势,对调优很有帮助。我一般会结合GC日志和jstat的实时数据一起看,这样能更准确地判断问题。

实际调优的时候,我的习惯是先用jstat快速定位是哪个区域有问题,然后用jmap导出堆快照,用MAT深入分析具体是哪些对象在占内存。如果是生产环境不方便dump,就用Arthas在线排查。基本上这几个工具配合使用,大部分内存问题都能定位到。关键是要理解GC的原理和各个内存区域的作用,工具只是辅助,知道问题出在哪才能对症下药。


对了,最新的互联网大厂后端面经都会在公众号首发,别忘记关注哦!!如果你想加入百人技术交流群,扫码下方二维码回复「加群」。

上次更新: 1/30/2026