![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
jvm
文章平均质量分 92
morris131
这个作者很懒,什么都没留下…
展开
-
G1垃圾收集器
垃圾收集器的考量指标垃圾收集器也有类似CAP理论的矛盾,具体如下面三个考量指标:吞吐量(Throughput)响应能力、延迟(Latency)占用的内存(Capacity)上面三个考量指标无法同时全部满足最优,只能满足其中的两个,而牺牲其中一个的部分效率。吞吐量吞吐量关注的是,在一个指定的时间范围内,最大化一个应用的工作量。如下方式来衡量一个系统吞吐量的好坏:在一个小时内,同一个事务(任务或请求)完成的次数。数据库一小时内完成多少次查询。对于关注吞吐量的系统原创 2021-02-16 10:54:50 · 762 阅读 · 0 评论 -
CMS垃圾收集器及日志详解
CMS垃圾收集器CMS(Concurrent Mark Sweep)收集器是以获取最短GC停顿时间为目标的收集器,它在垃圾收集时使得用户线程和GC线程能够并发执行,因此在垃圾收集过程中用户也不会感到明显的卡顿,多数应用于互联网网站或者B/S系统的服务端上。CMS收集器是一个里程碑式的收集器,之前的收集器都是并行收集器,从CMS收集器开始后的都是并发收集器,但是CMS的缺点非常多,以至于所有的JDK版本没有一个将CMS收集器设置为默认的收集器。长期来看,CMS收集器是要被G1等垃圾收集器替换掉的。在JD原创 2021-02-06 17:47:32 · 1453 阅读 · 1 评论 -
CentOS7下编译OpenJDK12
OpenJDK的编译安装环境:CentOS7。下载OpenJDK下载地址:https://hg.openjdk.java.net/jdk/jdk12/,点击左边的zip。下载后的包名为jdk12-06222165c35f.zip,上传至linux的/usr/local目录下,并解压。# yum install -y unzip 没装的unzip的先安装# unzip jdk12-06222165c35f解压后,打开doc/building.xml或doc/building.md学习如何编原创 2020-08-26 13:53:02 · 15864 阅读 · 1 评论 -
JIT动态编译技术
JIT动态编译技术一个Java程序执行的过程,就是执行字节码指令的过程,一般这些指令会按照顺序一条一条指令解释执行,这种就是解释执行,解释执行的效率是非常低下的,因为需要先将字节码翻译成机器码,才能执行。而那些被频繁调用的代码,比如调用次数很高或者for循环次数很多的那些代码,称为热点代码,如果按照解释执行,效率是非常低下的。为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器,就称为即时编译器(Just In Time C原创 2020-08-25 16:11:47 · 25100 阅读 · 0 评论 -
堆外内存泄漏排查
堆外内存泄漏排查直接内存:指的是Java应用程序通过直接方式从操作系统中申请的内存,也叫堆外内存,因为这些对象分配在Java虚拟机的堆(严格来说,应该是JVM的内存外,但是堆是这块内存中最大的)以外。直接内存有哪些?元空间。BIO中ByteBuffer分配的直接内存。使用Java的Unsafe类做一些分配本地内存的操作。JNI或者JNA程序,直接操纵了本地内存,比如一些加密库、压缩解压等。JNI(Java Native Interface):通过使用Java本地接口(C或者C++)书写程序原创 2020-08-21 14:42:39 · 34078 阅读 · 1 评论 -
JVM中的动态追踪技术
动态追踪技术动态追踪技术是一个可以不用重启线上java项目来进行问题排查的技术,也叫Java Agent技术,可以利用它来构建一个附加的代理程序,用来协助检测性能,还可以替换一些现有功能,甚至JDK的一些类我们也能修改,有点像JVM级别的AOP功能。既然作为JVM的AOP,就必须要有AOP的功能,所以Java Agent提供了两个类似于AOP的方法:premain():在main()方法运行之前的进行一些操作。agentmain():可以控制类运行时的行为。但在一个JVM中,只会调用一个。已原创 2020-08-11 17:55:53 · 12364 阅读 · 0 评论 -
JVM命令行调优工具介绍
JVM命令行工具jps虚拟机进程状况工具jps(JVM Process Status Tool):列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)。虽然功能比较单一,但它是使用频率最高的JDK命令行工具,因为其他的JDK工具大多需要输入它查询到的LVMID来确定要监控的是哪一个虚拟机进程。对于本地虚拟机进程来说,LVMID与操作系统的进程原创 2020-08-08 18:10:19 · 24377 阅读 · 0 评论 -
JVM中方法调用的底层实现
方法调用的底层实现我们编写的Java代码,经过编译后编程class文件,最后经过类加载器加载后进入了JVM的运行时数据区。但作为程序员真正关心是代码的执行,代码的执行其实本质上是方法的执行,站在JVM 的角度归根到底还是字节码的执行。main()方法是JVM指令执行的起点,JVM会创建一个main线程来执行main()方法,以触发JVM 一系列指令的执行,真正地把JVM跑起来。接着,在我们的代码中,就是方法调用方法的过程,所以了解方法在JVM 中的调用是非常必要的。关于方法的调用,JVM中一共提供了原创 2020-08-06 21:02:15 · 45515 阅读 · 0 评论 -
字节码指令详解
字节码指令详解指令简介在计算机中,CPU指令就是指挥机器工作的指令,程序就是一系列按一定顺序排列的指令,执行程序的过程就是执行指令的过程,也就是计算机的工作过程。通常一条CPU指令包括两方面的内容:操作码和操作数,操作码表示要完成的操作,操作数表示参与运算的数据及其所在的单元地址(这个单元地址可以是寄存器、内存等)。Java虚拟机中的字节码指令与CPU中指令类似,Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的操作码(opcode)以及跟随其后的零至多个代表此操作所需参数的操作数(op原创 2020-08-05 16:49:04 · 19848 阅读 · 2 评论 -
Class文件结构
Class文件结构Java技术能够一直保持非常好的向后兼容性,这点Class文件结构的稳定性功不可没。Java目前已经发展到JDK14,但是class文件结构的内容,绝大部分在JDK1.2时代就已经定义好了。虽然JDK1.2的内容比较古老,但是java发展经历了十余个大版本,但是每次基本上只是在原有结构基础上新增内容、扩充功能,并未对定义的内容做修改。Class文件是一组以8位字节为基础单位的二进制流(实际上任何文件都是以二进制流形式存在的)。工欲善其事,必先利其器。下面先介绍几个实用的工具。工具介原创 2020-08-04 14:06:53 · 12401 阅读 · 0 评论 -
G1垃圾收集器详解
G1垃圾收集器GC收集器的三个考量指标:占用的内存(Capacity)延迟(Latency)吞吐量(Throughput)随着硬件的成本越来越低,机器的内存也越来越大,GC收集器占用的内存基本上可以容忍。而吞吐量可以通过集群(增加机器)来解决。随着JVM中内存的增大,STW的时间成为JVM急迫解决的问题,如果还是按照传统的分代模型,使用传统的垃圾收集器,那么STW的时间将会越来越长。在传统的垃圾收集器中,STW的时间是无法预测的,有没有一种办法,能够首先定义一个停顿时间,然后反向推算收集内原创 2020-07-30 16:17:54 · 34256 阅读 · 2 评论 -
jvm内存分配与回收策略
内存分配与回收策略在jvm中,垃圾回收的主要区域为堆,一般情况下,对象是分配在堆中,那么对象在堆上是怎样分配的呢,对象又是怎样被回收的?分代模型现在的垃圾回收器都会在物理上或者逻辑上把对象进行划分为两个区域,一类死的快的对象所占的区域,叫作年轻代(Young generation)。把其他活的长的对象所占的区域,叫作老年代(Old generation)。年轻代由于对象的生命周期比较短,所以采用复制算法,这里的复制算法不像之前的复制算法,直接将内存对半分为两个区域,而是分为:一个伊甸园空间(Ede原创 2020-07-24 14:47:47 · 11523 阅读 · 0 评论 -
jvm OOM异常的模拟
OutOfMemoryError异常在JVM内存区域中,除了程序计数器外,其他内存区域都有可能发生OOM异常,下面我们来一一模拟每个内存区域OOM异常的场景。先介绍几个JVM参数:-Xms:设置JVM初始堆内存的大小。-Xmx:设置JVM最大堆内存的大小。-Xmn: 设置年轻代的大小、-Xss:设置每个线程对应的栈的大小。-XX:+HeapDumpOnOutOfMemoryError:发生OOM异常时生成heap dump文件-XX:HeapDumpPath=path:heap dump文原创 2020-07-23 15:02:33 · 12968 阅读 · 0 评论 -
从栈帧看字节码是如何在JVM中进行流转的
从栈帧看字节码是如何在JVM中进行流转的我们都知道java文件需要编译成class文件,然后jvm负责加载并运行class文件,那么字节码文件长什么样子?字节码又是怎么执行的?工具介绍javapjavap是JDK自带的查看字节码的工具。javap的使用方法如下:$ javac Demo.java$ javap -p -v Demojavap命令打印的文件内容有时候过多,可以使用javap -p -v Demo >> Demo.javap将内容追加至文本文件中,再用文本工具打开分原创 2020-07-17 16:43:58 · 27623 阅读 · 1 评论 -
jvm之强软弱虚引用
强软弱虚引用在java中,除了基本数据类型的变量外,其他所有的变量都是引用类型,指向堆上各种不同的对象。在jvm中,除了我们常用的强引用外,还有软引用、弱引用、虚引用,这四种引用类型的生命周期与jvm的垃圾回收过程息息相关。那么这四种引用类型有什么区别?具体使用场景是什么?所有引用类型,都是抽象类java.lang.ref.Reference的子类,这个类的主要方法为get()方法: public T get() { return this.referent; }原创 2020-07-16 19:58:56 · 13440 阅读 · 0 评论 -
jvm之垃圾收集器
垃圾收集器先看下图中HotSpot虚拟机所包含的收集器:图中展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,则说明它们可以搭配使用。虚拟机所处的区域则表示它是属于新生代还是老年代收集器。新生代收集器:Serial、ParNew、Parallel Scavenge老年代收集器:CMS、Serial Old、Parallel Old整堆收集器:G1几个重要的概念:并行(Parallel)收集:指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态;如ParNew、Para原创 2020-07-15 14:59:49 · 11155 阅读 · 0 评论 -
jvm之垃圾回收算法
垃圾回收算法哪些内存需要回收jvm的内存模型中将内存划分为程序计数器、虚拟机栈、本地方法栈、堆、方法区。其中程序计数器、虚拟机栈、本地方法栈属于线程私有的内存空间,与线程的生命周期保持一致,不需要手动回收内存。方法区中存放的是类的结构信息,对方法区的回收其实就是对类进行卸载,类的卸载必须满足以下三个条件:类的实例及其子类实例已经全部被回收加载类的类加载器已经被回收,通常加载类的加载器是用来加载应用中所有的类的,所以一般不会被回收。类的Class对象没有被其他对象所引用基于以上三点,方法区原创 2020-07-13 11:19:18 · 14028 阅读 · 0 评论 -
jvm之线程上下文加载器与SPI
线程上下文加载器线程上下文类加载器(Thread Context Class Loader,简称TCCL)是从JDK1.2开始引入的。类java.lang.Thread中的方法getContextClassLoader()和setContextClassLoader(ClassLoader cl)用来获取和设置线程的上下文类加载器。如果没有通过setContextClassLoader(ClassLoader cl)方法进行设置的话,线程将继承其父线程的上下文类加载器,默认为系统类加载器,这点可以从下面原创 2020-07-11 19:05:57 · 15850 阅读 · 0 评论 -
jvm如何打破双亲委托机制
打破双亲委托机制重写父类ClassLoader的loadClass方法package com.morris.jvm.classloader;public class BreakDelegateClassLoader extends MyClassLoader { @Override protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {原创 2020-07-09 20:03:51 · 11700 阅读 · 0 评论 -
jvm之类加载器
类加载器注意图中的类加载器之间并不是继承关系,而是包含关系。根类加载器根类加载器(BootstrapClassLoader):负责加载存放在JDK/jre/lib下的指定的jar,也可以使用-Xbootclasspath参数指定哪些jar要使用根类加载器加载。下面的代码将会打印BootstrapClassLoader以及根类加载器负责加载哪些jar:System.out.println("BootstrapClassLoader:" + String.class.getClassLoader()原创 2020-07-08 14:48:40 · 11603 阅读 · 0 评论 -
类的加载过程
类的加载过程类的加载指的是将类的.class文件中的二进制数据读入到内存中,然后在堆区创建一个这个类的java.lang.Class对象。类的加载的最终产品是位于堆区中的Class对象。Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。一个java文件从被加载到被卸载这个生命过程,总共要经历7个阶段,JVM将类的生命周期过程分为:加载加载阶段是类加载过程的第一个阶段。在这个阶段,JVM 的主要目的是将字节码从各个位置(网络、磁盘等)转化为二进制字原创 2020-07-07 16:32:15 · 13708 阅读 · 0 评论 -
JVM内存模型
JVM内存模型JVM的内存模型也就是JVM中的内存布局,不要与java的内存模型(与多线程相关)混淆。下图是jdk8 jvm内存模型图:程序计数器程序计数器是当前线程所执行的字节码的行号指示器。JVM支持多个线程同时运行,每个线程都会根据CPU时间片来回切换,那么如果当前线程获得时间片了,怎么知道它目前要执行哪条指令呢,所以需要一个地方记录当前线程所执行的指令行号,这个地方就是程序计数器,每一个线程都有自己私有的程序计数器。倘若当前执行的是JVM的方法,则该寄存器中保存当前执行指令的行号;倘若原创 2020-07-06 15:54:20 · 13706 阅读 · 0 评论