JVM
文章平均质量分 84
是谁偷吃了奶酪
这个作者很懒,什么都没留下…
展开
-
【JVM】JMM 内存模型
Java中锁的实现每个对象都拥有一把锁,该锁存放在对象头中。锁中记录了当前对象被哪个线程所占用。对象的结构对象头:存放了一些对象本身的运行时信息,包括两部分:Mark Word: 存储了很多和当前对象运行时状态有关的数据。: 指向了堆中当前类class对象。实例数据: 属性 + 方法对齐填充字节: 为了满足对象的大小为8个字节的倍数,无实际意义。锁状态对象头的Mark Word中"锁标志位"分别对应四种锁状态:无锁01、偏向锁01、轻量级锁00、重量级锁10(重量级锁) 实现线程同步。原创 2024-05-02 21:07:30 · 2057 阅读 · 1 评论 -
【JVM】Java工具(Arthas,APM,Java Agent,JMX)
Arthas主要使用了Java Agent技术,这种技术可以让运行中的Java程序执行Agent中编写的代码。Arthas使用了Agent中的动态加载模式,可以选择让某个特定的Java进程加载Agent并执行其中的监控代码。监控方面主要使用的就是JMX提供的一些监控指标,同时使用字节码增强技术,对某些类和某些方法进行增强,从而监控方法的执行耗时、参数等内容。原创 2024-05-01 22:47:15 · 1170 阅读 · 1 评论 -
【JVM】GC调优(优化JVM参数)、性能调优
GC调优的主要目标是避免由垃圾回收引起程序性能下降。常见的GC模式。GC调优的手段。性能调优解决CPU占用率高,接口响应时间长,线程不可用、死锁,判断方法耗时原创 2024-04-29 13:24:43 · 3002 阅读 · 0 评论 -
【JVM】内存调优——内存泄漏、内存溢出
通过发送请求向Java应用获取数据,正常情况下数据返回后,即可释放数据。当并发量很大,同时处理数据的时间长,导致大量的数据存在于内存中,导致内存溢出。jps 查看java进程,打印main方法所在类名和进程id。jmap 生成堆内存快照;原创 2024-04-28 18:24:49 · 1243 阅读 · 1 评论 -
【JVM】垃圾回收——垃圾回收算法、垃圾回收器
当获取一个对象引用时,会触发读后的屏障指令,如果对象指向的不是转移后的对象,用户线程会将引用指向转移后的对象。如果用户线程在帮忙转移时,ShenandoahGC线程也发现这个对象需要复制,那么就会去尝试写入前向指针,使用了类似CAS的方式来实现,只有一个线程能成功修改,其他线程会放弃转移的操作。如果在清理过程中发现没有足够的空间存放需要转移的对象,可能会触发Full GC(标记-整理算法),这时候会停下应用的所有线程来做清理,所以要尽量避免这种情况,保证有足够的空间。适用于较大的堆,可控暂停时间。原创 2024-04-23 00:01:43 · 653 阅读 · 0 评论 -
【JVM】垃圾回收——引用
弱引用并没有完全解决掉对象回收的问题,Entry对象和value值无法被回收,所以合理的做法是手动调用remove方法进行回收,然后再将threadlocal对象的强引用解除。由于是弱引用,那么在垃圾回收之后,ThreadLocal对象就可以被回收。如果软引用对象里边包含的数据已经被回收了,那么软引用对象本身其实也可以被回收了(同弱引用)。当threadlocal对象不再使用时,使用弱引用可以让对象被回收;因为仅有弱引用没有强引用的情况下,对象是可以被回收的。原创 2024-04-22 23:10:16 · 479 阅读 · 0 评论 -
【JVM】TLAB——Java堆内存是线程共享的?你确定吗?
分配内存时会存在并发问题,可以通过(1)CAS (2)TLAB解决。TLAB是虚拟机在堆内存的Eden区划分出来的一块专用空间,是线程专属的。TLAB: Thread Local Allocation Buffer HotSpot虚拟机带的。当分配内存的时候,TLAB内存空间不是特别大,经常会有不够的问题。虽然这两种方法都可以,但都不理想。因此,虚拟机定义了一个。引子: Java堆内存是线程共享的?的值,翻译为“最大浪费空间”。原创 2024-04-23 00:03:12 · 441 阅读 · 2 评论 -
【JVM】字节码文件
启动类加载器(Bootstrap ClassLoader) 加载核心类。扩展类加载器(Extension ClassLoader)加载扩展类。应用程序类加载器(Application ClassLoader)加载classpath中的类。自定义类加载器,重写findClass方法。原创 2024-04-22 02:09:13 · 322 阅读 · 0 评论 -
【JVM】运行时数据区 StringTable练习
对于Java方法,程序计数器记录的是正在执行的虚拟机字节码指令的地址。如果是本地方法,则不记录,程序计数器的值为undefined。程序计数器的大小并不是固定的,也不直接等同于CPU的位数。它的大小足以支持记录当前执行的指令位置,这通常与具体的JVM实现有关,并不直接反映物理CPU的位数。内存溢出指的是内存中某一块区域的使用量超过了允许使用的最大值,从而使用内存时因空间不足而失败,虚拟机一般会抛出指定的错误。JDK6,字符串常量池在方法区中,intern时,会在字符串常量池新创建一个。原创 2024-04-22 00:55:24 · 1061 阅读 · 1 评论 -
【JVM】双亲委派机制
双亲委派机制指的是:当一个类加载器接收到加载类的任务时,会向上交给父类加载器查找是否加载过,再由顶向下进行加载。双亲委派机制的作用:保证类加载的安全性,避免重复加载。common类加载器主要加载tomcat自身使用以及应用使用的jar包,默认配置在catalina.properties文件中。catalina类加载器主要加载tomcat自身使用的jar包,不让应用使用,默认配置在catalina.properties文件中。原创 2024-04-22 00:51:53 · 441 阅读 · 0 评论