Java后端八股----JVM篇







上图中线程1,2如果资源被抢占了,则程序计数器记录一下执行的行号,等到资源就绪后会从记录的行号继续向后执行。

Java8把静态变量以及常量放到了线程的本地内存原空间中(避免放在堆中不可控)。




👆图中第二种情况不太容易出现。



方法区存放在永久代的信息,jdk8之后存在了线程的元空间里。元空间的默认大小是没有上限的。




👆 IO速度远小于NIO

IO是用的IOStream NIO用的是FileChannel。

Java是没有权限之间读到系统内存的,是需要CPU进行状态切换然后读到Java堆内存再进行数据处理。

而直接内存就能解决上面的情况,在系统内存和堆内存中创建一块区域给双倍都有权限,这样进行拷贝的时候速度就能快上不少。




一般我们自己写的类都是用第三种应用类加载器加载的。

加载前都进行上一任的委托,从下往上委托,像Student类最后会从最上面下到AppClassLoader进行加载。当Student类需要使用String类型的时候也会向上委托,发现最高层的BootStrap里lib下有这个类,就可以返回给AppClassLoader直接使用。



加载的时候,使用Person的class对象作为一个访问Person类的接口,Heap堆访问对象方法的时候还是要调用方法区的方法进行使用。

图中的Object类会在初始化阶段赋值。

解析阶段所做的就是把符号引用(图中的数字指向),变换为直接引用,使用指针直接指向执行方法。

第三条:如果子类调用了父类的静态属性,那么只会初始化父类的静态代码。👇



回收垃圾一般是回收堆里的没有引用的数据。

👆进行第二条指令之后 New String("123")的引用就成了0。

即使a,b都为null了之后

堆中的对象一样引用无法归零,引用计数法就失效了。

图中的第二段代码可以理解为 b.instance = new Demo();






分代回收算法也是垃圾回收算法的一种。




一般不常用fullGC,只在新生代和老年代内存实在长期不足的时候才调用使用。




重新标记好像等于对于标记的再确认。


复制到s后会释放E,然后再重新分配Eden。



上这时的垃圾回收就包括了新生代垃圾回收和老年代垃圾回收。


当内存不够时会使用一次FullGC。

相关推荐
Ulyanov21 小时前
《现代 Python 桌面应用架构实战:PySide6 + QML 从入门到工程化》:实时时钟与数据驱动 UI —— 从“事件回调”到“状态绑定”的范式跃迁
开发语言·python·qt·ui·架构·交互
AI进化营-智能译站21 小时前
ROS2 C++开发系列06:变量、数据类型与IO实战
java·开发语言·c++·ai
薪火铺子1 天前
OAuth2 + JWT 微服务认证方案深度解析
java·运维·微服务
szccyw01 天前
PHP源码能否用二手服务器部署_老旧服务器性价比分析【方法】
jvm·数据库·python
diangedan1 天前
Android冻屏
android·java
阿里嘎多学长1 天前
2026-04-30 GitHub 热点项目精选
开发语言·程序员·github·代码托管
m0_613856291 天前
mysql如何利用事务隔离级别解决特定业务冲突_mysql隔离方案选型
jvm·数据库·python
abcnull1 天前
用javaparser做精准测试
java·ast·静态代码分析·精准测试·javaparser
叶小鸡1 天前
Java 篇-项目实战-苍穹外卖-笔记汇总
java·开发语言·笔记
AI人工智能+电脑小能手1 天前
【大白话说Java面试题】【Java基础篇】第22题:HashMap 和 HashSet 有哪些区别
java·开发语言·哈希算法·散列表·hash