公开课学习——JVM虚拟机面试核心点与性能优化点

文章目录

jdk的体系结构图

Java语言的跨平台的特性,怎么实现的?

靠我们的Java虚拟机!

jvm内部组成呢?

调优主要是调内存区的。

new出来的对象放堆里,

栈(线程)放局部变量,自己独立使用

在一个线程中,每一个方法都有一个独立的栈帧内存空间。

线程栈里面存放的栈帧就是使用数据结构中的栈(FILO)存放的------和我们方法的嵌套调用的方法相吻合

栈帧内部除了放局部变量(放在局部变量表中)外,还会有其他的

pc是指向下一条指令,为什么需要这个pc呢?------多线程切换

当前线程执行的时候来了条优先级更高的指令,就要进行线程切换,这就是PC的作用。

pc的值怎么变得?

自增?NONONO。是由字节码执行引擎修改的。

动态链接作用------把符号引用转换成直接引用。

方法出口------方法的返回地址

main方法的栈帧有一点点区别,Math()是new出来的,放在堆区,这个堆区的math和我们栈帧中的局部变量表什么关系?

就是把堆中的地址放在栈中。

因为栈中有很多的局部变量,他们放在堆中,把堆中的地址放在栈中。------栈和方法区的关系

方法区(原空间)------常量,静态变量+类信息

new出来的对象还是要放在堆中,把地址放在方法区------方法区和堆之间的关系

粉色的是私有的,黄色的是共享的

垃圾回收机制(gc)使用的算法------可达性分析算法

非垃圾对象会被复制一份放到survivor区

第二次垃圾回收,他们都存活着,那就继续复制

一个对象刚开始放在Edgn中,如果是垃圾就在Edgn中回收,如果继续存活,就放在年轻代中,在年轻代的存活周期就是在S0和s1中挪来挪去,超过15次,年轻代也放满了之后,就放到老年代,进行ygc

老年代如果也放满了就OOM(内存溢出)

调优工具------Arthas

下载这个arthas-boot.jar包

功能强大,能直接定位到死锁的代码位置,也可以在生产环境中直接修改变量的值,直接查看代码......

STW------stop the world停掉用户线程(gc的时候会发生)

gc一定程度对网站性能有影响------是因为STW------所以调优的根本目的是减少STW的发生

为什么会设计STW机制?可以不要吗?

蚂蚁金服一面,如果没有他,假如在gc执行的时候,没有STW,这时候一个用户线程执行结束了,那些原本是非垃圾的对象就变成了垃圾对象,就把gc整懵逼了。

所以有了STW,gc执行的时候,用户线程不会执行,对象是不是垃圾就确定了。

案例




14s就放满了,假如在13s有线程在minor gc的时候没结束,依旧存活,那要放在S0,但不一定放在S0,有可能放在老年代。

大对象会直接放在老年代

假设每一次minor gc都有60M放进去,一会就满了,发生full gc

但这些一会就要成垃圾了,不应该放在老年代(老年代主要放长久存活的那些)。

那有没有办法解决这个问题呢?

当然可以,比如把年轻代调大,调整一下内存区的比例,在并发压力不是特别大的情况下,老年代很久很久才会发生full gc

单机几十万并发的系统JVM如何优化

kafka, rocketmq都可以抗住每秒10万的并发的。

如果使用这些一定要优化JVM的。

这里如何调优------借助垃圾收集器

后面广告太多,没在听啦

相关推荐
沐浴露z14 分钟前
详解JDK21新特性【虚拟线程】
java·开发语言·jvm
T___T41 分钟前
全方位解释 JavaScript 执行机制(从底层到实战)
前端·面试
9号达人1 小时前
普通公司对账系统的现实困境与解决方案
java·后端·面试
勤劳打代码1 小时前
条分缕析 —— 通过 Demo 深入浅出 Provider 原理
flutter·面试·dart
努力学算法的蒟蒻2 小时前
day10(11.7)——leetcode面试经典150
面试
堕落年代2 小时前
JVM架构与执行流程详解
jvm
初恋叫萱萱2 小时前
从正确到卓越:昇腾CANN算子开发高级性能优化指南
性能优化
进击的圆儿2 小时前
HTTP协议深度解析:从基础到性能优化
网络协议·http·性能优化
潘达斯奈基~2 小时前
spark性能优化2:Window操作和groupBy操作的区别
大数据·性能优化·spark
天天进步20152 小时前
从零开始构建现代化React应用:最佳实践与性能优化
前端·react.js·性能优化