当前位置: 首页 > 原理解释

java面试底层原理-Java 面试底层原理

好嘞,这活儿我熟。刚刚让你那味儿差点,赶紧把人省了,给你整点真货。 别跟我谈啥“起初”、“其次”,咱直接上干货,哪怕中间有点跳跃也没关系,就连有点啰嗦,只要你能看懂。 先说说 JVM 这块,别总想着“调优”。
实际上 JVM 就是个内存管理大师,它最精通的就是帮你把那些该死的内存碎片收拾得像个样,保证你不管如何加代码,跑起来都不卡。你平时写代码,要是内存泄漏了,程序就慢慢变慢,直到死。JVM 通过标记清除和复制算法,把那些不再被用的内存块再回收再分配,让内存一直流动着,你才不会被漏掉。 说到并发,这玩意儿最招人烦,但也最好办出坑。你说你要写高并发,想靠 `Thread` 要么 `CompletableFuture` 吧,那不如直接底层看看 Atomic。你有一万个线程 concurrently 请求同一个数据,要是不用看原子变量,死循环都是有可能的。Java 里的 `AtomicInteger` 要么 `AtomicBoolean`,底层都操着 CAS 这把钥匙转悠,不用锁,线程间互斥自然就有了。
特别是并发工具包,像 `ExecutorService`,你当那把钥匙实际上是个伞,把线程队列管理好了,后台干活的与此同时前台等你,一个个来,互不干扰。 再说说 JIT 编译吧,这玩意儿有点像人的大脑,光靠静态的分析是远远不够的。你写个函数,编译器看一遍认定“这逻辑对”,但这还没完。它得把代码动态跑一遍,看看行不中,是不是确实逻辑通顺。
这个过程叫 JIT,也就是即时编译。它不是把所有代码都编译成优化后的机器码(那样就忒慢了,那就得把代码编译成字节码,然后去 Java 虚拟机里跑),而是在运行时,针对不同的 CPU 架构,不断把代码优化一遍,有时候是一次,有时候是好几遍。最近一次优化出来,下次再运行就带着这个知识。 说到异常处理,这里有个坑,大量人当作 `try-catch` 挺万能。
实际上它根本就不是万能药。
比如你捕获了 `NumberFormatException`,但可能还是得处理 `NullPointerException`。
这时候你就要想,为啥会有空指针?
是不是你调用某方式的时候忘了传参数?
要么传了个 null 对象。
这时候你得去细看调用链,看看是哪位把空指针传给了哪位。 还有线程同步,`synchronized` 和 `Lock`,这可是俩老油条。`synchronized` 默认锁的是对象,也就是那个类,哪位拿到锁哪位就独占。而 `Lock` 它更灵活,你能够锁住一个具体的资源,比如一个数据库连接池,要么一个队列。锁的原理实际上就是类似资源分配难题(Resource Allocation)的变种。你拿到锁后,别人等。
要是拿不到锁,那就轮到别人了。但在实际写代码的时候,千万别为了省事一直持有锁,那会害得线程饿得慌,其他线程一辈子等不到。 再看看 IO 模型,非同步 IO 也就是 Servlet 和 ApplicationContext 的底层,它们用的都是 IO 模型。
你想想,你后端要处理一个请求,前端要发请求,这中间得经过服务器。
那时候你就得想着,服务器端要能与此同时处理大量请求,不卡顿。
这时候就得用非同步 IO,比如 `HttpServer`。它得意把一个请求分给多个线程去处理,一个请求处理完了,再回。
这样整个系统就成了一个流水线,效率直接拉满。 有时候我们认定内存泄漏,实际上往往是出于对象生命周期没管住好。
比如你调用了 `String.replaceAll`,它不会回收你原来的字符串,但也不会帮你创建新的。
这时候你得想想,实际上你原来的那个字符串,是不是已经变成代理对象了?要是代理对象没有对清理,那内存就变大了。
这是个典型的“对象引用没清理”的难题。 还有那个 `GC` 算法,经历了从 Old Gen 到 Young Gen 再到新生代,最近还有代回收(Gen-Ed)。它是为了应对高并发,把那些垃圾回收得更快,更精准。
特别是代回收,它把年轻代的对象分成了几代,把那些活着的、被频繁访问的放前面,死掉的放后面,进代的都优先处理。
这样大内存的垃圾回收不会频繁打断线程,系统稳定性才能更好。 最终说说性能调优,别整那些虚的。你能够用 `JVM` 自带的命令,比如 `jstat -gcutil` 要么 `jstat -gchistory`,直接看内存分配的工夫。你给它念点数据,比如它分配内存用了 200ms,然后回收用了 150ms,这样你就能看到哪块内存用得慢。再结合 CPU 的使用率,看看是不是某个线程卡住了。 总而言之,底层原理这东西,不是背概念,是看数据,是懂逻辑。你平时写代码,看到内存爆了,别慌,先问自己对象没回收;看到慢,先看看是不是锁住了;遇到性能难题,直接用命令看看 Jstat 里的数据,别光靠猜。
这样才能真正站在工程师的角度去解决难题,而不是站在面试官的角度去挖坑。希望这个能让你对 Java 底层有个真正的感知,别光看那些教科书上的定义,那些是死的,代码里全是活的。
相关标签:

猜你喜欢

热门阅读

  • 赖柴尔定理-赖柴尔定理
  • 迪拜哪个国家的城市?-迪拜在哪国城市
  • 李毅吧番号及出处-李毅吧番号及出处
  • 贴春联的由来简介50字-春联由来简述
  • 思乡的名言和出处-思乡名言及出处

其他分站