
JVM
文章平均质量分 81
jvmjvmjvm
保暖大裤衩LeoLee
芜湖~~~
展开
-
JVM——常用GC日志参数及分析
常用垃圾回收相关的参数列表:-XX:+PrintGC 输出GC日志 -XX:+PrintGCDetails 输出GC的详细日志 -XX:+PrintGCTimeStamps 在打印PrintGC的时候同时输出GC的时间戳(基准时间形式,上次GC到本次GC的间隔时间) -XX:+PrintGCDateStamps 在打印PrintGC的时候同时输出GC的时间戳(年月日) -XX:+PrintHeapAtGC 在进行GC操作的前后打印出堆信息 -Xloggc原创 2021-01-19 15:04:30 · 209 阅读 · 1 评论 -
JVM——垃圾回收相关基础概念(gc、四种对象引用)总结
System.gc()默认情况下,通过调用System.gc()和Runtime.getRuntime().gc(),会显式的触发Full GC,同时对新生代和老年代进行垃圾回收,尝试释放死亡的对象占用的内存,以及方法区的回收(方法区垃圾回收条件比较严格而已)。 System.gc()并不能保证对垃圾收集器的调用。即这个垃圾回收行为不一定能马上执行,仅仅是告诉JVM希望进行一次垃圾回收操作,具体实施与否不一定。一般情况下不回去手动调用该方法进行垃圾回收,垃圾回收是JVM自动进行的。public c原创 2021-01-14 13:49:41 · 505 阅读 · 0 评论 -
JVM——主流垃圾回收器全面总结
垃圾回收器概述垃圾收集器没有在JVM规范中进行过多的规定,可以由各个厂商的不同版本来实现。由于JDK版本处于高速迭代中,因此Java发展至今已经衍生了众多的GC版本。按照线程数可以分为串行垃圾回收器(一条垃圾回收线程)和并行垃圾回收器(多条垃圾回收线程):在诸如单核CPU处理或者较小的应用内存等硬件平台配置较低的场合,串行回收器的性能表现可以超过并行回收器和并发回收器。所以串行回收器默认被应用在客户端的Client模式下的JVM中。 在并发能力比较强的CPU上,并行回收器产生的STW时间要远远原创 2021-01-18 23:57:18 · 530 阅读 · 1 评论 -
JVM——垃圾回收算法保姆式详解
什么垃圾?垃圾就是指在程序运行过程中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。在程序的执行过程中,栈帧中的局部变量表中的引用指向具体的对象,当栈帧随着方法的执行结束弹出栈之后,这些对象就处于没有任何指针指向的状态(原文是不可达的对象),此时就变成了需要被回收的垃圾。如果不及时堆内存中的垃圾进行清理,那么这下垃圾对象所占用的内存空间会一直保存到程序的执行结束,被保留的空间无法再次被分配,可能导致内存溢出。为什么要进行GC?好像是个憨憨问题一样QaQ对于一门高级语言来说,当然原创 2021-01-12 15:23:05 · 269 阅读 · 0 评论 -
Java 字符串操作的底层原理解析
开门见山常量与常量的拼接结果在常量池,原理就是编译器优化 常量池中不会存在相同内容的常量 只要拼接的元素中,有一个是变量,结果就是在堆中,变量拼接的原理是StringBuilder 如果拼接的结果调用了intern()方法,则主动将常量池中还没有的字符串对象放入池中,并返回此对象地址常量拼接String s1 = "a" + "b" + "c";String s2 = "abc";//abc一定是放在字符串常量池中的,此地址赋给s2System.out.println(s1 == s原创 2021-01-07 22:23:47 · 546 阅读 · 0 评论 -
JVM——执行引擎详解,接地气总结
JVM主要负责的任务就是装载字节码,但是字节码不能直接在操作系统之上运行,字节码并非是本地指令,它包含的指令仅可以被JVM所解析。所以执行引擎的任务就是将字节码指令解释/编译为对应平台上的本地机器指令后再做执行,充当了高级语言到机器指令的翻译角色。Hotspot VM包括解释器和JIT即时编译器(两者共用,互相弥补)。解释器:当JVM启动时会根据定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容翻译为对应平台的本地机器指令 JIT(Just In Time Compiler)即..原创 2021-01-07 01:14:04 · 290 阅读 · 0 评论 -
对象的实例化、内存布局以及访问定位
对象的实例化创建对象的方式new 包括单例、xxxBuilder、xxxFactory等变形方式 反射 Class对象的newInstance()方法,JDK9开始标识为废弃(只能使用无参构造方法,访问权限为public) Constructor的newInstance()方法(可以使用带参构造方法,访问权限没有限制) clone:不使用构造方法,需要类实现Cloneable接口的clone()方法 反序列化:从文件或者网络中获取一个对象的二进制流创建对象的步骤判断对象对原创 2021-01-05 01:34:56 · 228 阅读 · 0 评论 -
JVM——方法区(永久代、元空间)
概述方法区是一块独立于堆的内存空间,逻辑上属于堆的一部分。于堆空间一样,是各个线程共享的一个区域 启动时由JVM创建,实际内存空间与堆一样,可以是不连续的物理内存空间 方法区主要就是用来储存类信息,方法区的大小决定了可以保存多少个类。过多的类定义将会导致OOM(JDK之前是OOM:PermGen space,JDK之后是OOM:Metaspace,JDK7之前叫永久代,JDK8开始叫元空间) JDK8之前的永久代使用的是运行时数据区的内存,所以容易OOM,JDK8开始使用本地内存,称之为元原创 2021-01-04 11:36:52 · 560 阅读 · 0 评论 -
JVM——对象堆外分配(栈上分配)、变量逃逸
概述堆空间是GC的重点区域,作为对象分配的主要区域,所以和程序性能有着十分密切的关系。由于GC的频率对JVM调优至关重要,特别是老年代的Major GC对STW的影响,新生代的Minor GC速度很快。所以能够想到的就是对象如果不在堆上分配,那么GC的频率就会降低,STW的时间就会减少。随着JVM技术的发展,栈上分配、标量化替换技术等,使得之前所说的所有对象都在堆上分配变得不是那么绝对了。变量逃逸经过逃逸分析(Escape Analysis),如果一个对象并没有逃出方法的话,那么就有可能被优原创 2020-12-28 14:37:14 · 373 阅读 · 0 评论 -
JVM——堆空间(新生代老年代)、对象堆空间分配详解
概述一个JVM进程只存在一个堆空间 在JVM启动的时候就被创建,空间大小也已经确定(可设置大小),是JVM管理的最大的内存空间,是JVM调优中最需要关注的地方。 堆可以处于物理上不连续的内存空间中,但是逻辑上它是被视为连续的(虚拟内存可以映射不连续的物理内存) 所有线程共享堆空间(其中例外的情况是线程私有缓冲区,Thread Local Allocation Buffer,TLAB,为了解决多线程访问的并发性问题) 所有对象的实例以及数组都应当在运行时分配到堆中(JVM规范中描述) 创建对象实原创 2020-12-25 15:53:46 · 1740 阅读 · 3 评论 -
JVM——虚拟机栈结构以及原理超详细解释
虚拟机栈(JVM Stacks)名词解释当前栈帧:一条线程在执行过程中,一个时间点上,只会有一个活动的栈帧(栈顶的栈帧,当前正在执行的方法对应的栈帧)当前方法:当前栈帧对应的方法定义这个方法的类:当前类栈的存储结构上面已经提到,栈中的基本单位是栈帧(Stack Frame) 在该栈对应的线程上,其每一个方法都对应一个栈帧 栈帧占用的内存中,维系着对应方法的各种数据信息 每个线程在创建的时候会随之创建一个虚拟机栈,每一个虚拟机栈中保存了一个一个栈帧(Stack frame),对原创 2020-12-24 15:39:07 · 978 阅读 · 2 评论 -
JVM——从虚拟机的角度看方法重写的本质
找到操作数栈的栈顶元素所执行的对象的实际类型,记作C(这句话有点抽象哈,栈顶栈帧对应的执行方法,如果是虚方法,那字节码指令是invokevirtual,根据invokevirtual找到执行的实际方法,记作C) 通过C在常量池中匹配符合要求的的方法(通过简单名称比较) 如果找到了简单名称相同的方法,则在匹配结果中校验访问权限,检测是否有调用的权限,如果权限通过,则返回这个方法的直接引用,如果不通过则返回java.lang.IllegalAccessError 如果没有找到简单名称相同的方法,则会按照原创 2020-12-24 15:39:39 · 184 阅读 · 0 评论 -
JVM——栈顶缓存技术基本了解
目前主流的JVM,基本都是基于栈式架构的虚拟机:基于栈的指令集架构设计和实现更简单,适用于资源受限的系统 避开了寄存器的分配难题:使用零地址指令方式分配 指令流中的指令大部分都是零地址的指令,其执行过程依赖于操作栈。指令集更小,编译器容易实现。 不需要硬件的特殊支持,可移植性好,能够更好的实现跨平台由于是基于栈的架构,零地址指令方式,所以也有相应的缺点:完成同一个操作需要的更多的出栈和入栈指令,这就意味着将需要更多次的指令分派(instruction dispatch)次数以及内存读写次数。原创 2020-12-24 15:40:00 · 1394 阅读 · 5 评论 -
JVM——PC寄存器(Program Counter Register,程序计数器)
JVM模型简图运行时数据区上图中绿色部分详细图程序计数寄存器(Program Counter Register)作用PC寄存器用来存储指向下一条指令的地址,即将要执行的指令代码,由执行引擎读取下一条指令。它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖PC寄存器来完成 字节码解释器工作时就是通过改变这个PC寄存器的值来选取下一条需要执行的指令 PC寄存器与本地方法栈、方法区、堆区、线程JVM栈不同,其没有OutOtMemoryError(内原创 2020-12-24 14:38:15 · 298 阅读 · 0 评论 -
JVM——类加载器详解
类加载器的分类上图中箭头并不代表继承关系,是上下层关系JVM支持两种类型的类加载器 引导类加载器(Bootstrap Classloader):C和C++编写的, 自定义类加载器(User-defined Classloader):Java语言编写的 严格定义上,拓展类加载器(Extension Classloader)和系统类加载器(System Classloader)都是抽象类ClassLoader的派生类加载器(两者都间接继承了ClassLoader),归为自定义类加载器原创 2020-12-22 16:15:24 · 301 阅读 · 0 评论 -
JVM——字节码文件的加载过程(类的加载过程)以及双亲委派机制
JVM运行加载字节码文件简图如下类加载器子系统类加载器:负责从文件系统(简单说就是硬盘)或者网络上加载class文件,class文件在文件开头有特点的标识。 ClassLoader只负责class文件的加载,只要是符合JVM对字节码文件规范的要求就可以,至于它是否可以运行,由执行引擎决定。 加载的类信息存放在方法区(一块内存空间),除了类信息之外,方法区中还会存放运行时常量池信息,可能还会包括字符串字面量和数字常量(这部分常量信息是class文件中常量池部分的内存映射)例如一个磁盘原创 2020-12-22 13:18:27 · 1419 阅读 · 0 评论