月球程序猿
无比自信之人生,永不言弃之魄力。
展开
-
11-GraalVM元原生时代的Java虚拟机
大部分脚本语言或者有动态特效的语言都需要一个语言虚拟机运行,比如CPython,Lua,Erlang,Java,Ruby,R,JS,PHP,Perl,APL等等,但是这些语言的虚拟机水平很烂,比如CPython的VM就不忍直视,而HotSpotVM是虚拟机的大神级别,如果能用上HotSpot,能用上顶级的即时编译器(JIT)、性能优化、垃圾回收等技术,岂不爽歪歪!实际上,在充分预热的情况下,Java 程序中的热点代码早已经通过即时编译转换为二进制码,在执行速度上并不亚于静态编译的 C++ 程序。原创 2023-12-25 22:31:41 · 1128 阅读 · 0 评论 -
10-让Java性能提升的JIT深度剖析
在 HotSpot 虚拟机中的热点探测是 JIT 优化的条件,热点探测是基于计数器的热点探测,采用这种方法的虚拟机会为每个方法建立计数器统计方法的执行次数,如果执行次数超过一定的阈值就认为它是“热点方法”C1 编译器是一个简单快速的编译器,主要的关注点在于局部性的优化,适用于执行时间较短或对启动性能有要求的程序,例如,GUI 应用对界面启动速度就有一定要求,C1也被称为 Client Compiler。热点代码,就是那些被频繁调用的代码,比如调用次数很高或者在 for 循环里的那些代码。原创 2023-12-25 21:25:16 · 1159 阅读 · 0 评论 -
09-为Java开疆拓土的ZGC深度剖析
停顿时间不超过10ms(JDK16已经达到不超过1ms);停顿时间不会随着堆的大小,或者活跃对象的大小而增加;支持8MB~4TB级别的堆,JDK15后已经可以支持16TB。这么去想,如果使用ZGC来做Java项目,像对STW敏感的证券系统,游戏的系统都可以去用Java来做(以前都是C或者C++的市场),所以ZGC的出现就是为了抢占其他语言的市场(卷!原创 2023-12-25 19:36:52 · 891 阅读 · 0 评论 -
08-JVM调优实战及常量池详解
s0还是常量池 中"zhuge”的引用,s1因为无法在编译期确定,所以是运行时创建的新对象”zhuge”的引用,s2因为有后半部分 new String(”ge”)所以也无法在编译期确定,所以也是一个新创建对象”zhuge”的引用;在编译期其字符串常量的值就确定下来,故上面程序最终的结果都为true。分析:JVM对于字符串引用,由于在字符串的"+“连接中,有字符串引用存在,而引用的值在程序编译期是无法确定的,即"a” + bb无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给b。原创 2023-12-23 16:27:18 · 867 阅读 · 0 评论 -
07-JVM调优工具详解及调优实战
这个因为之前已经大概知道Young GC的频率,假设是每5分钟一次,那么可以执行命令 jstat -gc pid 300000 10 ,观察每次结果eden,survivor和老年代使用的变化情况,在每次gc后eden区使用一般会大幅减少,survivor和老年代都有可能增长,这些增长的对象就是每次Young GC后存活的对象,同时还可以看出每次Young GC后进去老年代大概多少对象,从而可以推算出。使用命令top -p ,显示你的java进程的内存情况,pid是你的java进程号,比如19663。原创 2023-12-23 15:57:04 · 951 阅读 · 0 评论 -
06-垃圾收集器G1&ZGC详解
默认年轻代对堆内存的占比是5%,如果堆大小为4096M,那么年轻代占据200MB左右的内存,对应大概是100个Region,可以通过“-XX:G1NewSizePercent”设置新生代初始占比,在系统运行中,JVM会不停的给年轻代增加更多的Region,但是最多新生代的占比不会超过60%,可以通过“-XX:G1MaxNewSizePercent”调整。如果这时候对象在GC时被移动了,接下来JVM就会加上一个读屏障,这个屏障会把读出的指针更新到对象的新地址上,并且把堆里的这个指针“修正”到原本的字段里。原创 2023-12-22 13:25:56 · 987 阅读 · 0 评论 -
05-垃圾收集器ParNew&CMS与底层三色标记算法详解
对于对象年龄应该为多少才移动到老年代比较合适,本例中一次minor gc要间隔二三十秒,大多数对象一般在几秒内就会变为垃圾,完全可以将默认的15岁改小一点,比如改为5,那么意味着对象要经过5次minor gc才会进入老年代,整个时间也有一两分钟了,如果对象这么长时间都没被回收,完全可以认为这些对象是会存活的比较长的对象,可以移动到老年代,而不是继续一直占用survivor区空间。当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几块。原创 2023-12-22 12:14:18 · 1235 阅读 · 0 评论 -
04-JVM字节码文件结构深度剖析
接下来49个字节: 63 6F 6D 2F 74 75 6C 69 6E 67 2F 6A 76 6D 2F 54 75 6C 69 6E 67 42 79 74 65 43 6F 64 65 表示字符串com/tuling/jvm/TulingByteCode。#21为常量池类型的nameAndType类型,分别指向我们的常量池第#5(utf-8类型的常量)的位置表示我们的字段的名称userName,#6指向的是常量池第六个位置,类型是utf-8类型的值为:Ljava/lang/String;原创 2023-12-22 03:15:37 · 1216 阅读 · 0 评论 -
03-JVM对象创建与内存分配机制深度剖析
jdk1.6 update14开始,在64bit操作系统中,JVM支持指针压缩jvm配置参数:UseCompressedOops,compressed–压缩、oop(ordinary object pointer)–对象指针启用指针压缩:-XX:+UseCompressedOops(默认开启),禁止指针压缩:-XX:-UseCompressedOops。原创 2023-12-22 00:44:04 · 1331 阅读 · 0 评论 -
02-JVM内存模型深度剖析与优化
如果释放了很少的空间, 那么在不超过-XX:MaxMetaspaceSize(如果设置了的话) 的情况下, 适当提高该值。对象在堆内部挪动的过程其实是复制,原有区域对象还在,一般不直接清理,JVM内部清理过程只是将对象分配指针移动到区域的头位置即可,比如扫描s0区域,扫到gcroot引用的非垃圾对象是将这些对象复制到s1或老年代,最后扫描完了将s0区域的对象分配指针移动到区域的起始位置即可,s0区域之前对象并不直接清理,当有新对象分配了,原有区域里的对象也就被清除了。原创 2023-12-20 16:19:07 · 801 阅读 · 0 评论 -
01-从JDK源码级别彻底剖析JVM类加载机制
自定义类加载器只需要继承 java.lang.ClassLoader 类,该类有两个核心方法,一个是loadClass(String, boolean),实现了双亲委派机制,还有一个方法是findClass,默认实现是空方法,所以我们自定义类加载器主要是重写findClass方法。try {//defineClass将一个字节数组转为Class对象,这个字节数组是class文件读取后最终的字节数组。原创 2023-12-18 17:46:07 · 1389 阅读 · 0 评论 -
JVM性能调优辅助手册之JVM指令
【代码】JVM性能调优辅助手册之JVM指令。原创 2023-12-19 18:18:55 · 527 阅读 · 0 评论 -
JVM性能调优准备之Visual GC插件
代表虚拟机内存分布情况。从图中可以看出,虚拟机被分为Metaspace、Old、Eden、S0、S1注意:如果对每个区域基本概念不是很熟悉的可以先了解下java虚拟机运行时数据区概念。1.1)perm:英文叫做Permanent Generation,我们称之为永久代。(根据深入java虚拟机作者说明,这里说法不是很正确,因为hotspot虚拟机的设计团队选择把GC分代收集扩展至此而已,正确的应该叫做方法区或者非堆)。原创 2023-12-19 17:56:10 · 1147 阅读 · 0 评论