ArrayList 插入1000万条数据之后,我怀疑了JVM...
芋道源码 文章源自JAVA秀-https://www.javaxiu.com/41629.html
以下文章来源于占小狼的博客,作者占小狼文章源自JAVA秀-https://www.javaxiu.com/41629.html
文章源自JAVA秀-https://www.javaxiu.com/41629.html 文章源自JAVA秀-https://www.javaxiu.com/41629.html 占小狼的博客文章源自JAVA秀-https://www.javaxiu.com/41629.html Java进阶技术干货、实践分享,跟着狼哥一起学习JVM、性能调优,欢迎关注。文章源自JAVA秀-https://www.javaxiu.com/41629.html
点击上方“芋道源码”,选择“设为星标”文章源自JAVA秀-https://www.javaxiu.com/41629.html
管她前浪,还是后浪?文章源自JAVA秀-https://www.javaxiu.com/41629.html
能浪的浪,才是好浪!文章源自JAVA秀-https://www.javaxiu.com/41629.html
每天 10:33 更新文章,每天掉亿点点头发...文章源自JAVA秀-https://www.javaxiu.com/41629.html
文章源自JAVA秀-https://www.javaxiu.com/41629.html 源码精品专栏文章源自JAVA秀-https://www.javaxiu.com/41629.html
原创 | Java 2021 超神之路,很肝~文章源自JAVA秀-https://www.javaxiu.com/41629.html
中文详细注释的开源项目文章源自JAVA秀-https://www.javaxiu.com/41629.html
RPC 框架 Dubbo 源码解析文章源自JAVA秀-https://www.javaxiu.com/41629.html
网络应用框架 Netty 源码解析文章源自JAVA秀-https://www.javaxiu.com/41629.html
消息中间件 RocketMQ 源码解析文章源自JAVA秀-https://www.javaxiu.com/41629.html
数据库中间件 Sharding-JDBC 和 MyCAT 源码解析文章源自JAVA秀-https://www.javaxiu.com/41629.html
作业调度中间件 Elastic-Job 源码解析文章源自JAVA秀-https://www.javaxiu.com/41629.html
分布式事务中间件 TCC-Transaction 源码解析文章源自JAVA秀-https://www.javaxiu.com/41629.html
Eureka 和 Hystrix 源码解析文章源自JAVA秀-https://www.javaxiu.com/41629.html
Java 并发源码文章源自JAVA秀-https://www.javaxiu.com/41629.html
文章源自JAVA秀-https://www.javaxiu.com/41629.html
文章源自JAVA秀-https://www.javaxiu.com/41629.html
文章源自JAVA秀-https://www.javaxiu.com/41629.html
"狼哥,我发现新大陆了,等会发你代码" 文章源自JAVA秀-https://www.javaxiu.com/41629.html
"咋了,这么激动" 文章源自JAVA秀-https://www.javaxiu.com/41629.html
"等会..."文章源自JAVA秀-https://www.javaxiu.com/41629.html
厮大说:狼哥是条狗。文章源自JAVA秀-https://www.javaxiu.com/41629.html
List<Integer> list0 = new ArrayList<Integer>();long start0 = System.currentTimeMillis();for (int i = 0; i < 10000000; i++) { list0.add(i);}System.out.println(System.currentTimeMillis() - start0);long start1 = System.currentTimeMillis();List<Integer> list1 = new ArrayList<Integer>();for (int i = 10000000; i < 20000000; i++) { list1.add(i);}System.out.println(System.currentTimeMillis() - start1);
"我在一个ArrayList中连续插入1千万条数据,结果耗时不一样,分别是 2346 797 没搞明白 "文章源自JAVA秀-https://www.javaxiu.com/41629.html
我看了一眼,就知道这小伙底盘不稳。文章源自JAVA秀-https://www.javaxiu.com/41629.html
"你加个 -XX:+PrintGCDetails -XX:+PrintGCDateStamps,看下第一次是不是有Full GC"文章源自JAVA秀-https://www.javaxiu.com/41629.html
"明白,我再试试看"文章源自JAVA秀-https://www.javaxiu.com/41629.html
几分钟后...文章源自JAVA秀-https://www.javaxiu.com/41629.html
2019-09-28T09:49:07.519-0800: [GC (Allocation Failure) [PSYoungGen: 54888K->10738K(76288K)] 54888K->36180K(251392K), 0.0520111 secs] [Times: user=0.24 sys=0.03, real=0.06 secs] 2019-09-28T09:49:07.590-0800: [GC (Allocation Failure) [PSYoungGen: 74092K->10736K(141824K)] 99534K->80803K(316928K), 0.0693607 secs] [Times: user=0.39 sys=0.03, real=0.06 secs] 2019-09-28T09:49:07.751-0800: [GC (Allocation Failure) [PSYoungGen: 141808K->10736K(141824K)] 211875K->188026K(320512K), 0.1829926 secs] [Times: user=1.02 sys=0.10, real=0.18 secs] 2019-09-28T09:49:07.934-0800: [Full GC (Ergonomics) [PSYoungGen: 10736K->0K(141824K)] [ParOldGen: 177290K->171620K(402432K)] 188026K->171620K(544256K), [Metaspace: 3062K->3062K(1056768K)], 1.8672996 secs] [Times: user=5.96 sys=0.03, real=1.87 secs] 23652019-09-28T09:49:09.832-0800: [GC (Allocation Failure) [PSYoungGen: 129254K->10738K(196608K)] 300875K->282609K(599040K), 0.1039307 secs] [Times: user=0.74 sys=0.07, real=0.10 secs] 2019-09-28T09:49:09.936-0800: [Full GC (Ergonomics) [PSYoungGen: 10738K->0K(196608K)] [ParOldGen: 271871K->36047K(372736K)] 282609K->36047K(569344K), [Metaspace: 3067K->3067K(1056768K)], 0.4510440 secs] [Times: user=1.82 sys=0.01, real=0.45 secs] 2019-09-28T09:49:10.440-0800: [GC (Allocation Failure) [PSYoungGen: 185856K->10752K(264704K)] 221903K->171359K(637440K), 0.1292143 secs] [Times: user=0.97 sys=0.01, real=0.12 secs] 772
"狼哥,第一次Full GC果然耗时了1.87s,那我把堆调大看看,避免Full GC"文章源自JAVA秀-https://www.javaxiu.com/41629.html
几分钟后...文章源自JAVA秀-https://www.javaxiu.com/41629.html
"这次没有GC了,但是每次运行,前一个都比后一个耗时多点,这是怎么回事?"文章源自JAVA秀-https://www.javaxiu.com/41629.html
"你试试放在不同线程中运行?"文章源自JAVA秀-https://www.javaxiu.com/41629.html
"好"文章源自JAVA秀-https://www.javaxiu.com/41629.html
又几分钟后...文章源自JAVA秀-https://www.javaxiu.com/41629.html
"在不同线程中执行,两者耗时几乎一致,这是为什么?"文章源自JAVA秀-https://www.javaxiu.com/41629.html
"你知道OSR吗?"文章源自JAVA秀-https://www.javaxiu.com/41629.html
"不知道."文章源自JAVA秀-https://www.javaxiu.com/41629.html
"那我跟你大概讲讲."文章源自JAVA秀-https://www.javaxiu.com/41629.html
OSR(On-Stack Replacement ),是一种在运行时替换正在运行的函数/方法的栈帧的技术。文章源自JAVA秀-https://www.javaxiu.com/41629.html
在现代的主流JVM中,都具备了多层编译的能力,一开始以解释的方式进行执行,这种性能相对来说(和c++比)会慢一点,但是一旦发现某一个函数执行很频繁的时候,就会采用JIT编译,提高函数执行性能(大部分比c++还快)。文章源自JAVA秀-https://www.javaxiu.com/41629.html
但是,如果以函数为单位进行JIT编译,那么就无法应对main函数中包含循环体的情况,这个时候,OSR就派上了用场。文章源自JAVA秀-https://www.javaxiu.com/41629.html
与其编译整个方法,我们可以在发现某个方法里有循环很热的时候,选择只编译方法里的某个循环,当循环体执行到 i = 5000 的时候,循环计数器达到了触发OSR编译的阈值,等编译完成之后,就可以执行编译后生成的代码。所以在上面例子中,当我们第二次执行循环体的时候,已经在执行OSR编译后的代码,那么在性能上会比前一次会快那么一点点。文章源自JAVA秀-https://www.javaxiu.com/41629.html
OSR更具体的实现原理,本文就不多加深究了,有兴趣的同学可以阅读下R大的知乎。https://tinyurl.com/y3yxu8fc文章源自JAVA秀-https://www.javaxiu.com/41629.html
- END -文章源自JAVA秀-https://www.javaxiu.com/41629.html
欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:文章源自JAVA秀-https://www.javaxiu.com/41629.html
文章源自JAVA秀-https://www.javaxiu.com/41629.html
已在知识星球更新源码解析如下:文章源自JAVA秀-https://www.javaxiu.com/41629.html
文章源自JAVA秀-https://www.javaxiu.com/41629.html
文章源自JAVA秀-https://www.javaxiu.com/41629.html
文章源自JAVA秀-https://www.javaxiu.com/41629.html
文章源自JAVA秀-https://www.javaxiu.com/41629.html
最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。文章源自JAVA秀-https://www.javaxiu.com/41629.html
提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。文章源自JAVA秀-https://www.javaxiu.com/41629.html
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。文章源自JAVA秀-https://www.javaxiu.com/41629.html
文章源自JAVA秀-https://www.javaxiu.com/41629.html
文章有帮助的话,在看,转发吧。谢谢支持哟 (*^__^*)文章源自JAVA秀-https://www.javaxiu.com/41629.html
阅读原文文章源自JAVA秀-https://www.javaxiu.com/41629.html

评论