
JVM
文章平均质量分 93
JVM是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。所以,JAVA虚拟机JVM是属
new一个对象_
天还没亮人们就开始赶路
展开
-
CAS概述
没有并发争用的时候或者是cells数组正在初始化的时候,会使用CAS来累加值到base,有并发争用,会初始化cells数组,数组有多少个cell,就允许有多少线程并行修改,最后将数组中每个cell累加,再加上base就是最终的值。如果在尝试加轻量级锁的过程中,CAS操作无法成功,这是一种情况就是有其他线程为此对象加上了轻量级锁(有竞争),这时需要进行锁膨胀,将轻量级锁升级为重量级锁。:对一个对象加锁后,需将原来旧的信息暂存到栈帧的锁记录结构中,将来解锁时,再将暂存的Mark Word旧的信息恢复回去。原创 2023-02-20 15:02:30 · 611 阅读 · 0 评论 -
JAVA内存模型(JMM)
假如i的赋值可能需要做一些计算,j的可能马上会运算完毕;它可以用来修饰成员变量和静态成员变量,他可以避免线程从自己的工作缓存中的高速缓存中查找变量的值,必须到主存中获取它的值,线程操做volatile变量都是直接操作主存===>因为t线程要频繁从内存中读取run的值,JIT编译器会将run的值缓存至自己工作内存中的高速缓存中(做进一步优化),减少对主存中run的访问,提高效率。1秒之后,main线程修改了run的值,并同步至主存,而t是从自己工作内存中的高速缓存中读取这个变量的值,结果永远是旧值。原创 2023-02-14 13:03:42 · 698 阅读 · 0 评论 -
JVM——运行期优化
对于大部分的不常用的代码,我们无需耗费时间将其编译成机器码,而是采取解释执行的方式运行;另一方面,对于仅占据小部分的热点代码,我们则可以将其编译成机器码,以达到理想的运行速度。● 将一些字节码编译为机器码,并存入 Code Cache,下次遇到相同的代码,直接执行,无需再编译。内联函数就是在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来直接进行替换。● 将字节码解释为机器码,下次即使遇到相同的字节码,仍会执行重复的解释。0层:解释执行,用解释器将字节码翻译为机器码。原创 2023-02-10 18:46:57 · 988 阅读 · 0 评论 -
JVM——类加载器
使用场景(什么时候需要自定义类加载器)◆ 想加载非 classpath 随意路径中的类文件◆ 通过接口来使用实现,希望解耦时,常用在框架设计◆ 这些类希望予以隔离,不同应用的同名类都可以加载,不冲突,常见于 tomcat 容器步骤① 继承ClassLoader父类② 要遵从双亲委派机制,重写 findClass 方法——不是重写loadClass方法,否则不会走双亲委派机制③ 读取类文件的字节码④ 调用父类的 defineClass 方法来加载类。原创 2023-02-09 15:50:39 · 371 阅读 · 0 评论 -
JVM——类加载与字节码技术(3)
● instanceKlass这样的【元数据】是存储在方法区 (1.8后的元空间内),但_java_mirror是存储在堆中(类在加载的同时会在堆内存中生成一个java_mirror的对象,如Person类会产生一个Person.class)而c不为基本类型(包装类型),底层会做自动的装箱操作将基本类型转换为包装类型,虽然前面为静态的但是也不会在准备阶段完成,只能推迟到初始化阶段完成。● 运行时可能会报错,是因为缺少一个.dll的文件,我们在JDK的安装目录中找到该文件,复制到缺失的文件下即可。原创 2023-01-29 20:31:47 · 499 阅读 · 0 评论 -
JVM——类加载与字节码技术(2)
其实就是指 java 编译器把* .java 源码编译为* .class 字节码的过程中,自动生成和转换的一些代码,主要是为了减轻程序员的负担,算是 java 编译器给我们的一个额外福利。注意,如果调用的是foo(),即未传递参数时,等价代码为foo(new String[]{}),创建了一个空数组,而不是直接传递的null。,只是为了便于阅读,给出了 几乎等价 的 java 源码方式,并不是编译器还会转换出中间的 java 源码,切记。泛型也是在 JDK 5 开始加入的特性,但 java 在。原创 2023-01-16 23:47:41 · 437 阅读 · 0 评论 -
GC调优
GC频繁说明空间紧张,若是新生代的空间紧张,当业务高峰期时大量对象被创建将新生代的空间很快占满,这时幸存区空间紧张使对象晋升预值降低,导致很多本来生存周期很短的对象也会被晋升到老年代,进一步触发老年代Full GC 的频繁发生。一次请求响应的过程以后其中大部分对象都会被回收,而只要一次请求+并发量占用的内存不超过新生代内存就不会触发或较少触发新生代的垃圾回收。调优参数在重新标记发生之前先对新生代的对象做一次垃圾清理,清理之后存活对象即可减少,此时重新标记时需要标记和查找的对象也随之减少。原创 2023-01-02 18:50:56 · 462 阅读 · 0 评论 -
G1垃圾回收
【E区幸存对象会被复制到Survive区中,另一些Survive区中不够年龄的也会复制其中,符合晋升条件的对象会放入老年代中】===>属于新生代垃圾回收(发生在混合收集阶段)● 超大堆内存(内存大的),会将堆内存划分为多个大小相等的区域(每个区域差不多为1248M,每个区域都可以独立的作为伊甸园、幸存区、老年代)● 之前C未被引用,这时A引用了C,就会给C加一个写屏障,写屏障的指令会被执行,将C放入一个队列当中,并将C变为 处理中 状态。因为指定了最大停顿时间,如果对所有老年代都进行回收,耗时可能过高。原创 2023-01-01 12:23:47 · 974 阅读 · 0 评论 -
JVM——垃圾回收
当某个对象不再被其他的对象所引用时,会先将终结器引用对象放入引用队列中,然后根据终结器引用对象找到它所引用的对象,然后调用该对象的finalize方法。●扫描堆中的对象,看能否沿着GC Root对象为起点的引用链找到该对象,如果找不到,则表示可以回收。当虚引用对象所引用的对象被回收以后,虚引用对象就会被放入引用队列中,调用虚引用的方法。所引用的对象被回收以后,会将这些引用放入引用队列中,方便一起回收这些软/弱引用对象。)时,在内存不足时,会回收软引用所引用的对象。)引用该对象时,在垃圾回收时,原创 2022-12-25 21:54:43 · 452 阅读 · 1 评论 -
JVM——常量池
常量池是.class文件中的,当该* 类被加载以后,它的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实地址 **,而创建ab的时候已经在串池中放入了“ab”,所以ab3直接从串池中获取值,所以进行的操作和 ab = “ab” 一致。常量池中的信息,都会被加载到运行时常量池中,但这是a b ab 仅是常量池中的符号,还没有成为java字符串。,只有当运行到那一行字符串且在串池中不存在的时候(如 ldc #2)时,该字符串才会被创建并放入串池中。的方法来创建新的字符串时,因为内容是变量,只能。原创 2022-12-19 22:33:55 · 317 阅读 · 0 评论