
JVM
文章平均质量分 88
Chancezhou
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【JVM】总结篇之GC性能优化案例
这种系统我们一般至少要三四台机器去支撑,假设我们部署了三台机器,也就是每台每秒钟大概处理完成100单左右,也就是每秒大概有100个订单对象在堆空间的新生代内生成,一个订单对象的大小跟里面的字段多少及类型有关,比如int类型的订单id和用户id等字段,double类型的订单金额等,int类型占用4字节,double类型占用8字节,初略估计下一个订单对象大概1KB左右,也就是说每秒会有100KB的订单对象分配在新生代内。可以看到,Point这个聚合量经过逃逸分析后,发现他并没有逃逸,就被替换成两个标量了。原创 2025-01-16 22:12:42 · 1654 阅读 · 0 评论 -
【JVM】总结篇之GC日志分析 和 案例
OutOfMemoryError: GC overhead limit exceeded 是 Java 虚拟机(JVM)抛出的一个错误,表明虽然堆内存没有完全被耗尽,但是垃圾收集器(GC)花费了太多时间来回收很少量的内存空间,效率低下。通过查看GC日志可以发现,系统在频繁性的做FULL GC,但是却没有回收掉多少空间,那么引起的原因可能是因为内存不足,也可能是存在内存泄漏的情况,接下来我们要根据堆dump文件来具体分析。第1步:定位问题代码块 (jvisualvm分析 MAT分析)(拼多多、字节跳动)原创 2025-01-06 21:38:21 · 1150 阅读 · 0 评论 -
【JVM】总结篇之各垃圾回收器适用场景
Shenandoah GC Red Hat研发Shenandoah团队对外宣称,Shenandoah垃圾回收器的暂停时间与堆大小无关,这意味着无论将堆设置为200 MB还是200GB,99.9%的目标都可以把垃圾收集的停顿时间限制在十毫秒以内。不过实际使用性能将取决于实际工作堆的大小和工作负载。Epsilon GC (http://openjdk.java.net/jeps/318),只做内存分配,不做垃圾回收的GC,对于运行完就退出的程序非常适合。称为无操作的垃圾收集器。原创 2025-01-05 21:19:08 · 400 阅读 · 0 评论 -
【JVM】总结篇之垃圾回收★
内存溢出OOM内存泄漏(Memory Leak)严格来说,只有对象不会再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄漏。但实际情况很多时候一些不太好的实践(或疏忽)会导致对象的生命周期变得很长甚至导致OOM,也可以叫做宽泛意义上的“内存泄漏”。内存泄露的情况:1.静态集合2.单例模式3.非静态内部类持有外部类4.各种连接,如数据库连接、网络连接和IO连接等5.变量不合理的作用域一般而言,一个变量的定义的作用范围大于其使用范围,很有可能会造成内存泄漏。原创 2025-01-05 20:16:47 · 1233 阅读 · 0 评论 -
【JVM】总结篇之对象内存布局 执行引擎
TLAB 把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存,称为本地线程分配缓冲区,(TLAB ,Thread Local Allocation Buffer)虚拟机是否使用TLAB,可以通过-XX:+/-UseTLAB参数来设定。将对象的所属类(即类的元数据信息)、对象的HashCode和对象的GC信息、锁信息等数据存储在对象的对象头中。初始化成员变量,执行实例化代码块,调用类的构造方法,并把堆内对象的首地址赋值给引用变量。对象创建方法,对象的内存分配。原创 2025-01-05 13:52:14 · 751 阅读 · 0 评论 -
【JVM】总结篇-运行时内存篇
而很多对象都是朝生夕死的,如果分代的话,把新创建的对象放到某一地方,当GC 的时候先把这块存储“朝生夕死”对象的区域进行回收,这样就会腾出很大的空间出来。比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用。如果Java虚拟机栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那Java虚拟机将会抛出—个。不会随着程序的运行需要更大的空间。原创 2025-01-04 21:47:23 · 904 阅读 · 0 评论 -
【JVM】总结篇-类的加载篇之 类的加载器 和ClassLoader分析
*** 编写findClass方法的逻辑*/@Override// 获取类的class文件字节数组} else {//直接生成class对象/*** 编写获取class文件并转换为字节码流的逻辑 * @param className * @return*/// 读取类文件的字节try {// 读取类文件的字节码= -1) {/*** 类文件的完全路径*/try {//创建自定义的类的加载器1//创建自定义的类的加载器2。原创 2025-01-04 14:59:39 · 1282 阅读 · 0 评论 -
【JVM】监控诊断工具命令行
jdk5以上可以通过Thread.getAllStackTraces()方法获取StackTraceElement,来代替jstack方法。监视虚拟机各种运行状态信息的命令行工具,显示类加载、内存、垃圾回收、即时编译等运行时数据。生成堆转储快照(headdump 或dump文件),查询finalize执行队列、Java堆和方法区详细信息。更详细参数参考别人博客 https://zhuanlan.zhihu.com/p/476375396。传递虚拟机进程启动时传给主类main()函数的参数。原创 2023-08-15 16:26:05 · 120 阅读 · 0 评论 -
【JVM】总结篇-类的加载篇之 类的加载过程
Java 类加载机制Java 类加载过程 生命周期。原创 2025-01-01 21:23:07 · 1126 阅读 · 0 评论 -
【JVM】总结篇-字节码篇
自动拆箱的过程是通过 Integer 的 intValue() 方法完成的,因此 x.intValue() 会将 Integer 对象 x 中的值提取为 int 类型,然后与 y 进行比较。在 x == y 的比较中,x 是一个对象,y 是一个基本类型(int)。Java 会进行 自动拆箱,将 Integer 对象 x 拆箱成 int 类型,然后进行基本类型的比较。x 是一个 Integer 类型对象,而 y 是一个原始的 int 类型。假设这段代码已经被编译成字节码,我们可以查看相应的字节码操作。原创 2025-01-01 10:46:16 · 1263 阅读 · 0 评论