
JVM
文章平均质量分 70
小杰011
这个作者很懒,什么都没留下…
展开
-
几种OOM(OutOfMemoryError)
Java heap space堆内存溢出,创建对象超过堆的容量即可报错GC overhead limit exceeded程序在垃圾回收上花费了98%的时间,却收集不回2%的空间汇报这种错误Metaspace元空间耗尽unable to create new native thread线程创建太多,超过负荷,比如运行如下代码9万多次后就报错了package com.xiaojie;public class MyTest { public static void m原创 2021-04-24 14:47:57 · 172 阅读 · 0 评论 -
JVM类加载与字节码技术_运行期优化
运行期优化分层编译JVM 将执行状态分成了 5 个层次:0层:解释执行,用解释器将字节码翻译为机器码1层:使用 C1 即时编译器编译执行(不带 profiling)2层:使用 C1 即时编译器编译执行(带基本的profiling)3层:使用 C1 即时编译器编译执行(带完全的profiling)4层:使用 C2 即时编译器编译执行profiling 是指在运行过程中收集一些程序执行状态的数据,例如【方法的调用次数】,【循环的 回边次数】等即时编译器(JIT)与解释器的区别解释器将字原创 2021-03-24 11:49:32 · 222 阅读 · 1 评论 -
JVM类加载与字节码技术_类加载器
类加载器Java虚拟机设计团队有意把类加载阶段中的**“通过一个类的全限定名来获取描述该类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动作的代码被称为“类加载器”**(ClassLoader)类与类加载器类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远超类加载阶段对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。这句话可以表达得更通原创 2021-03-24 11:47:29 · 265 阅读 · 0 评论 -
JVM类加载与字节码技术_类加载阶段
类加载阶段加载将类的字节码载入方法区(1.8后为元空间,在本地内存中)中,内部采用 C++ 的 instanceKlass 描述 java 类,它的重要 field 有:_java_mirror 即 java 的类镜像,例如对 String 来说,它的镜像类就是 String.class,作用是把 klass 暴露给 java 使用_super 即父类_fields 即成员变量_methods 即方法_constants 即常量池_class_loader 即类加载器_vtable原创 2021-03-24 11:45:31 · 255 阅读 · 0 评论 -
JVM类加载与字节码技术_编译期处理
编译期处理所谓的 语法糖 ,其实就是指 java 编译器把 *.java 源码编译为 *.class 字节码的过程中,自动生成和转换的一些代码,主要是为了减轻程序员的负担,算是 java 编译器给我们的一个额外福利注意,以下代码的分析,借助了 javap 工具,idea 的反编译功能,idea 插件 jclasslib 等工具。另外, 编译器转换的结果直接就是 class 字节码,只是为了便于阅读,给出了 几乎等价 的 java 源码方式,并不是编译器还会转换出中间的 java 源码,切记。默认构造函原创 2021-03-24 11:42:33 · 211 阅读 · 0 评论 -
JVM类加载与字节码技术_字节码指令
字节码指令可参考https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5javap工具Oracle 提供了 javap 工具来反编译 class 文件javap -v F:\Thread_study\src\com\nyima\JVM\day01\Main.classCopyF:\Thread_study>javap -v F:\Thread_study\src\com\nyima\JVM\day5\De原创 2021-03-24 11:38:19 · 260 阅读 · 0 评论 -
JVM垃圾回收_5.GC调优
GC 调优查看虚拟机参数命令"C:\Program Files\Java\jdk1.8.0_181\bin\java" -XX:+PrintFlagsFinal -version | findstr "GC"可以根据参数去查询具体的信息调优领域内存锁竞争CPU占用IOGC确定目标低延迟/高吞吐量? 选择合适的GC科学运算追求高吞吐量(ParallelGC)互联网项目需要追求低延迟((CMS G1 ZGC))确定目标选择合适垃圾回收器最快的GC是不发生GC首先排原创 2021-02-04 09:59:44 · 155 阅读 · 0 评论 -
JVM垃圾回收_4.垃圾回收器
垃圾回收器相关概念并行收集:指多条垃圾收集线程并行工作,但此时用户线程仍处于等待状态。并发收集:指用户线程与垃圾收集线程同时工作(不一定是并行的可能会交替执行)。用户程序在继续运行,而垃圾收集程序运行在另一个CPU上吞吐量:即CPU用于运行用户代码的时间与CPU总消耗时间的比值(吞吐量 = 运行用户代码时间 / ( 运行用户代码时间 + 垃圾收集时间 )),也就是。例如:虚拟机共运行100分钟,垃圾收集器花掉1分钟,那么吞吐量就是99%串行单线程内存较小,个人电脑(CPU核数较少)安全原创 2021-02-03 09:50:41 · 217 阅读 · 0 评论 -
JVM垃圾回收_3.分代回收
分代回收回收流程新创建的对象都被放在了新生代的伊甸园中当伊甸园中的内存不足时,就会进行一次垃圾回收,这时的回收叫做 Minor GCMinor GC 会将伊甸园和幸存区FROM存活的对象先复制到 幸存区 TO中, 并让其寿命加1,再交换两个幸存区再次创建对象,若新生代的伊甸园又满了,则会再次触发 Minor GC(会触发 stop the world, 暂停其他用户线程,只让垃圾回收线程工作),这时不仅会回收伊甸园中的垃圾,还会回收幸存区中的垃圾,再将活跃对象复制到幸存区TO中。回收以后原创 2021-01-31 19:47:04 · 172 阅读 · 1 评论 -
JVM垃圾回收_2.三种垃圾回收算法
三种垃圾回收算法1 . 标记-清除 算法定义:标记清除算法顾名思义,是指在虚拟机执行垃圾回收的过程中,先采用标记算法确定可回收对象,然后垃圾收集器根据标识清除相应的内容,给堆内存腾出相应的空间这里的腾出内存空间并不是将内存空间的字节清0,而是记录下这段内存的起始结束地址,下次分配内存的时候,会直接覆盖这段内存缺点:容易产生大量的内存碎片,可能无法满足大对象的内存分配,一旦导致无法分配对象,那就会导致jvm启动gc,一旦启动gc,我们的应用程序就会暂停,这就导致应用的响应速度变慢2 . 标记-原创 2021-01-31 19:28:30 · 165 阅读 · 0 评论 -
JVM垃圾回收_1 . 如何判断对象可以回收(五种引用)
如何判断对象可以回收引用计数法弊端:循环引用时,两个对象的计数都为1,导致两个对象都无法被释放可达性分析算法JVM中的垃圾回收器通过可达性分析来探索所有存活的对象扫描堆中的对象,看能否沿着GC Root对象为起点的引用链找到该对象,如果找不到,则表示可以回收可以作为GC Root的对象虚拟机栈(栈帧中的本地变量表)中引用的对象。方法区中类静态属性引用的对象方法区中常量引用的对象本地方法栈中JNI(即一般说的Native方法)引用的对象五种引用强引用只有GC Root都原创 2021-01-25 09:58:02 · 567 阅读 · 0 评论 -
直接内存
直接内存属于操作系统,常见于NIO操作时,用于数据缓冲区分配回收成本较高,但读写性能高不受JVM内存回收管理文件读写流程[使用了DirectBuffer直接内存是操作系统和Java代码都可以访问的一块区域,无需将代码从系统内存复制到Java堆内存,从而提高了效率释放原理直接内存的回收不是通过JVM的垃圾回收来释放的,而是通过unsafe.freeMemory来手动释放通过//通过ByteBuffer申请1M的直接内存ByteBuffer byteBuffer = ByteBuf原创 2021-01-25 09:08:32 · 124 阅读 · 0 评论 -
堆和方法区
堆的定义通过new关键字,创建对象都会使用堆内存他是线程共享的,堆中对象都需要考虑线程安全的问题有垃圾回收机制堆内存的溢出(OutOfMemoryError)无限创建有效对象则可使堆内存溢出排查堆内存溢出时可把堆内存设置小一点用来即时排查堆内存的诊断1 . jps工具查看当前系统中有哪些java进程2 . jmap工具查看堆内存占用情况3 . jconsole工具图形界面的,多功能的监测工具,可连续监测方法区结构内存溢出1.8以前会导致永久代内存溢出原创 2021-01-24 11:26:44 · 787 阅读 · 2 评论 -
Java虚拟机栈
Java虚拟机栈栈定义每个线程运行时需要的内存,称为虚拟机栈每个栈由多个栈帧组成,对应着每次方法调用时所占用的内存每个线程只能由一个活动栈帧.对应着当前正在执行的方法问题辨析1 . 垃圾回收是否涉及栈内存?不会,栈中会自己出栈,栈中没有垃圾回收2 . 栈内存越大越好吗?栈内存划分越大反而会使你的线程数越少,因为物理内存的大小是一定的,每个线程的栈内存多,会使得线程数目变少,不建议过大3 . 方法内的局部变量是否线程安全?如果没有逃离线程的作用范围(没有返回变量,也不和外面变原创 2021-01-24 10:06:32 · 259 阅读 · 1 评论 -
程序计数器
程序计数器程序计数器的位置程序计数器的作用寄存器(程序计数器)的作用是记住下一条jvm指令的地址,图中可以看到,当我们只想0指令时,会把3的执行地址放入到我们寄存器,然后解释器从寄存器拿到3的地址执行,同时寄存器存入4,以此类推程序计数器的定义每个寄存器都是私有的,不会存在内存溢出,如图在多线程的状态下,线程一的时间片用完时,寄存器会存下一条指令的地址,同时线程2执行,回来时只需读取寄存器变可知执行到哪里,所以每一个线程都会有他的一个私有的寄存器...原创 2021-01-24 08:39:10 · 661 阅读 · 1 评论 -
JVM的体系架构
JVM的体系架构虚拟机的介绍虚拟机的概念所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。大名鼎鼎的Virtual Box,VMware就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称为Java字节码指令。无论是系统虚拟机还是程序虚拟机,原创 2021-01-24 08:32:45 · 237 阅读 · 1 评论