JVM
文章平均质量分 81
JVM底层原理解析
一口一个炒鸡
这个作者很懒,什么都没留下…
展开
-
JVM——Java应用问题总结
表现为us、sy的值过高Linux在操作文件时,会将数据放进文件缓冲区,因此查看Linux内存状况时经常发现物理内存用的不多,cached用了很多,这是Linux提升文件IO的一种做法。在Linux中,要跟踪线程的文件IO的消耗,主要方法是通过pidstat来查找,输入如pidstat -d -t -p [oud] 1 100(其中-d 、-t、-p为pidstat的参数) ,即可查看线程IO消耗状况,其中KB_rd/s表示每秒读取的KB数,KB_ wr/s表示每秒写入的KB数。原创 2023-03-16 10:15:02 · 131 阅读 · 0 评论 -
JVM——深入理解类执行机制
在把class文件加载到JVM中且产生了Class对象后,就可以执行Class对象的静态方法和实例化调用了,源码编译阶段源码被编译成JVM字节码,JVM字节码是作为一种中间码的方式,在运行期需要对它进行解释并执行,这种方式称作字节码解释执行方式。原创 2023-03-15 16:02:49 · 75 阅读 · 0 评论 -
JVM——深入理解线程安全与锁优化
有一个比较恰当的线程安全的定义:当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对 象的行为都可以获得正确的结果,那就称这个对象是线程安全的。原创 2023-03-15 15:56:32 · 156 阅读 · 0 评论 -
JVM——深入理解JMM(Java内存模型)与线程
让计算机并发执行若干个运算任务,其中一个比较重要的复杂性就在于,许多运算不是只依靠处理器就能实现的,另外还有如读取运算数据、存储运算结果,这种IO操作也都是运算的重要步骤。但是,由于处理器的运算速度和存储设备的IO速度有几个数量级的差距,所以现代计算机不得不在其之间加入一层或多层读写速度尽量接近处理器运算速度的高速缓存。将运算需要用到的数据和运算产生的结果同步到缓存中,这样处理器就无需等待缓慢的内存读写了。原创 2023-03-15 15:51:59 · 281 阅读 · 0 评论 -
JVM——深入理解类加载器
类加载器虽然只应用于类的加载阶段,但它起到的作用远超于此,类加载器可以帮助类确定类的唯一性,相同的两个类(这里指两个类的equals等方法相同)被同一个虚拟机加载,只要他们的类加载器不同即使用的是同一个字节码文件,都会被虚拟机视为不同的两个类。原创 2023-03-15 15:47:01 · 86 阅读 · 0 评论 -
JVM——深入理解虚拟机类加载机制
一个类从进入虚拟机到卸载主要分为加载、验证、准备、解析、初始化、使用、卸载几个阶段,其中验证、准备、解析统称为连接。原创 2023-03-15 15:47:35 · 69 阅读 · 0 评论 -
JVM——深入理解类文件结构
class文件的前4个字节(class文件的显示一般是用的十六进制,一个十六进制数表示半个字节)被称为魔数,它唯一的作用是确定这个文件是不是被java虚拟机可以接受的class文件,其中第5、6个字节标明了次版本号,7、8个字节标明了主版本号。紧接着的两个字节便是标明了常量池中常量的数量这个计数是从1开始的,例如这个002f(47)就是常量池的数量,正确的常量数为47-1也就是46个(通过javap -v *.class访问class的可读性文件 )字面量主要包含一些文本信息和被final修饰的常量等,原创 2023-03-15 15:39:51 · 46 阅读 · 0 评论 -
JVM——虚拟机性能监控、故障处理工具
jstat [ option vmid [ interval[s|ms] [count] ] ],其中interval和count分别代表查询间隔和次数,如果省略这两个参数说明只查询一次。option表示用户想要查询的虚拟机信息,主要分为三类:类加载、垃圾收集、运行期编译状况。可以列出正在运行的虚拟机进程,并显示虚拟机在执行主类(main() 函数所在的类)命令格式 jstack [ option ] vmid。jstat是用来监视虚拟机各种运行状态信息的工具,jstat的命令格式。原创 2023-03-15 15:34:28 · 57 阅读 · 0 评论 -
JVM——深入理解垃圾收集器与内存分配
顾名思义标记清除算法分为两个阶段,标记和清除,首先标记出所有需要收集的对象,接着在垃圾收集阶段统一进行回收,这个算法的缺点是体现在”大部分对象都是朝生夕死的“这句话中,大部分对象,其实在标记后都是要回收的,导致该算法的效率其实并不高,并且在清除时会产生空间碎片,如果没有大对象分配空间的话还可以接受,但是如果需要给大对象分配空间,很难找到连续的大空间,必须在存放对象之前进行一次垃圾收集。CMS收集器是一种关注低延迟的垃圾收集器,因此在B/S之类需要和用户交互,需要低延迟的应用中使用。原创 2023-03-15 15:29:01 · 74 阅读 · 0 评论 -
JVM——深入理解对象的创建、内存分配以及访问定位
类加载检查后就要位新生对象分配内存,对象所需要的内存空间在类加载完成后就可以确定,在Java堆为对象分配空间,其实就是把一个确定大小的内存划分出来存放对象,如果java堆中的内存是非常规整的,所有使用过的内存放在一边,空闲的内存放在另一边,中间放这一个指针作为空间分界点的指示器,那么在给新生对象分配空间时,只需要指针向空闲内存移动一个对象大小的区域即可,而Java堆需要维护一个记录可用和已经使用的内存区域,并在分配对象空间时更新列表,这种方法就叫做指针碰撞。对象的访问定位的实现主流的有两种方式,一种是。原创 2023-03-15 15:19:00 · 119 阅读 · 0 评论 -
JVM——深入理解Java内存区域
方法区和java堆一样是线程共享的区域,主要存放虚拟器加载的类型信息,常量、静态变量等数据,例如类的版本号、字段、方法的描述信息,java8以前,对方法区的设计是与java堆类似的,并且也打算把收集器的分代设计应用在方法区,所以也一直把方法区叫做永久代,不过经过实践发现,这样的设计更容易导致java应用的内存溢出的问题,于是在java9以后选择了完全放弃永久代,转而用本机内存实现的元空间代替。运行时常量池是方法区的一部分,Class文件中存放编译器生成的各种字面量和符号引用的内容就存放在常量池表中,原创 2023-03-15 15:18:12 · 76 阅读 · 1 评论