![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
文章平均质量分 78
进一步扎实java基础
苍鹰蛟龙
这个作者很懒,什么都没留下…
展开
-
1.2 类的加载器
文章目录1. 双亲委派机制原理2 双亲委派的优势与弊端3 违反双亲委派机制的行为3.1 第一种违反双亲委派机制行为3.2 第二种违反双亲委派机制行为4. 沙箱机制5. 自定义类加载器在上篇文章中介绍了类的加载器以及加载过程,下面继续进一步理解类的加载器。1. 双亲委派机制原理双亲委派机制原理:如果一个类加载器收到了类加载的请求,该类加载器并不会立即去加载,而是把加载任务先委托给父加载器加载;如果父加载器还有父加载器,则会继续向上委托,一直委托到启动类加载器;如果父加载器可以完成加载Class字节码的任原创 2022-03-02 23:58:58 · 442 阅读 · 0 评论 -
8.7 JVM命令行监控之——jcmd
文章目录1. 描述2. 用法2.1 查看java进程2.2 查看jcmd有哪些command命令2.3 查看虚拟机启动了多长时间2.4 打印栈信息2.5 查看类的统计信息2.6 导出堆dump文件2.7 获取系统的properties属性2.8 获取JVM的启动参数1. 描述jcmd即jvm command,该命令行工具的功能几乎涵盖了前面几节介绍的所有命令行工具的功能,它可以用来导出堆、查看堆栈使用情况、查看java进程、导出线程信息、查看GC运行情况。2. 用法命令:jcmd pid help原创 2021-11-13 00:37:10 · 846 阅读 · 0 评论 -
8.6 JVM监控之——jstack
文章目录1. 描述1. 描述jstack全名为jvm stack trace,java堆栈跟踪工具,该工具用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂起等,都是导致线程长时间停顿的常见原因。线程出现停顿时通过jstack来查看各个线程的调用堆栈,就可以获知没有相应的线程到底在后台做些什么事情,或者等待什么资源。public class JstackDe原创 2021-11-10 14:11:08 · 763 阅读 · 0 评论 -
8.5 JVM命令行监控——jmap
文章目录1. jmap描述2. jmap用法2.1 导出dump文件2.2 输出堆内存信息2.2.1 输出堆空间使用信息2.2.2 输出对象统计信息1. jmap描述jmap全称jvm memory map,该命令有两个作用:第一个是可以获取堆dump文件,dump文件是堆转储快照的二进制文件文件;第二还可以获取堆的使用情况、堆中对象统计信息以及类加载信息等。2. jmap用法2.1 导出dump文件命令:jmap -dump:format=b, file=文件名 pid 或者 jmap -dum原创 2021-11-09 00:29:29 · 953 阅读 · 0 评论 -
8.4 查看JVM所有系统参数
文章目录1. 查看所有JVM参数启动的初始值2. 查看所有被用户或者JVM修改过的参数的值3. 查看所有JVM参数的最终值1. 查看所有JVM参数启动的初始值命令:java -XX:+PrintFlagsInitial此地应有截图。。。2. 查看所有被用户或者JVM修改过的参数的值命令:java -XX:+PrintCommandLineFlags此地应有截图。。。3. 查看所有JVM参数的最终值如果JVM的参数的初始值被修改过就显示修改过的值,如果没被修改过就显示初始的值,命令:java原创 2021-11-08 15:54:29 · 523 阅读 · 0 评论 -
8.3 JVM命令行监控——jinfo
文章目录1. jinfo描述1. jinfo描述jinfo(Configuration Info for Java) 的作用是实时查看和调整虚拟机各项参数。jinfo与jps -v的区别:使用jps命令的-v参数可以查看虚拟机启动时显式指定的参数列表, 但如果想知道未被显式指定的参数的系统默认值,则需要通过jinfo命令。...原创 2021-11-08 01:45:27 · 476 阅读 · 0 评论 -
8.2 JVM命令行监控——jstat
文章目录1. jstat介绍2. jstat用法2.1 案例一2.2 案例二2.3 案例三2.4 案例四1. jstat介绍jstat全名JVM statistics monitoring tool,用于监视虚拟机各种运行状态信息的命令工具,它可以显示本地或者远程虚拟机进程中类的装载、内存、垃圾收集、JIT编译运行等运行时数据。2. jstat用法命令:jstat -<option> [-t] [-h<lines>] <vmid> [<interval>原创 2021-11-05 00:47:07 · 440 阅读 · 0 评论 -
8.1 JVM命令行监控——jps
文章目录1. jps介绍2. jps用法2.1 jps -q2.2 jps -l2.3 jps -m2.4 jps -v1. jps介绍jps全称java process status,用于查看Hotspot虚拟机中正在执行的进程。2. jps用法jps [-q][-mlvV] [hostid]2.1 jps -qjps -q之显示进程id。2.2 jps -ljps -l输出执行进程程序的全类名或者如果执行的是jar包,输出jar的完成路径。2.3 jps -mjps -m输出虚拟机原创 2021-10-27 00:30:26 · 862 阅读 · 0 评论 -
7. 字节码指令详解
文章目录1 加载与存储指令1.1 加载1.2 存储字节码指令一般包括两种形式:一种是只有一个操作符1 加载与存储指令加载指的是从栈帧中的局部变量表中加载数据到栈帧中的操作数栈中,存储与加载正好反过来,指的是把操作数栈中的数据存储到局部变量表中。关于局部变量表和操作数栈的理解可以参考JVM的运行时数据区。1.1 加载加载又包括两种加载,第一:从局部变量表中加载数据到操作数栈中;第二种:直接把常量加载到操作数栈中。1. 从局部变量表中加载数据到操作数栈中从局部变量表中加载数据到操作数栈中主要包括原创 2021-10-15 10:12:59 · 1769 阅读 · 0 评论 -
5. JVM垃圾回收
文章目录1. 什么是垃圾对象2. 引用计数算法3. 可达性分析算法1. 什么是垃圾对象垃圾对象(Garbage Object)指程序运行中没有任何指针指向的对象,这种对象就是要被回收的对象。如果不及时对这些垃圾对象回收,这些对象占据内存空间,容易导致内存溢出。对于内存中的对象,首先在标记阶段被标记为了垃圾对象,在清除阶段才会被清除。区分内存中哪些是存活对象,哪些是垃圾对象的阶段即为垃圾标记阶段。垃圾标记阶段判断兑现是否存活有两种方式:引用计数算法和可达性分析算法。2. 引用计数算法引用计数算法(R原创 2021-09-22 23:54:43 · 494 阅读 · 1 评论 -
java中对象引用
文章目录1. 强引用2. 软引用(SoftReference)3. 弱引用(WeakReference)4. 虚引用(PhantomReference)5. 总结java中对象引用分为强、软、若、虚4中引用,其中强引用就是普通的new一个对象,软引用、弱引用、虚引用都是继承自抽象类Reference。1. 强引用程序代码中最常见的引用,比如Persion persion = new Persion(),无论任何情况下,只要强引用关系还在,强引用的对象是可触及的,垃圾回收器就不会回收掉被引用的对象。如原创 2021-09-06 01:52:31 · 883 阅读 · 0 评论 -
垃圾回收中的安全点与安全区域
文章目录1. 垃圾回收中的安全点2. 垃圾回收中的安全区域1. 垃圾回收中的安全点安全点:程序执行过程中需要进行垃圾回收时,只有在特定的位置停顿下来开始进行GC,这些特定位置称之为安全点(Safepoint)。Safepoint的选择很重要,如果太少可能导致GC等待用户线程执行的时间太长;如果太多,就是太频繁的执行GC,影响性能。大部分指令执行时间都非常短,通常会根据是否具有让程序长时间执行的特征为标准,比如选择一些执行时间较长的指令作为saftpoint,如方法调用、循环跳转和异常跳转等。当多个原创 2021-09-02 00:38:16 · 1654 阅读 · 2 评论 -
并发与并行
文章目录1. 操作系统中的并发与并行2. 垃圾回收的并发与并行并发还是并行在不同的场景下是不同的,下面分别就操作系统中和JVM垃圾回收器中的差别介绍如下1. 操作系统中的并发与并行并发:操作系统中并发并行与应用程序中的并发并行是一个意思。并发指在一个时间段内,一个处理器中有多个程序同时在运行。并发并不是真正意义上的同时进行,只是CPU把一个时间段划分成几个时间片段,然后CPU在这几个时间片段之间来回切换,由于CPU处理时间非常快,只要时间间隔处理得当,可以让用户感觉多个应用程序同时在运行。这里CP原创 2021-09-01 00:54:12 · 189 阅读 · 0 评论 -
JVM之内存溢出与内存泄漏
文章目录1 内存溢出2 内存泄漏(Memory Leak)1 内存溢出内存溢出(OutOfMemoryError)就是JVM中没有空闲内存,垃圾回收器回收垃圾之后也无法提供足够的内存,导致内存溢出。内存溢出一般由两方面导致:虚拟机的堆内存设置太小;内存中创建了很多大对象,垃圾回收器之后也不能回收足够的内存空间。在发生OOM之前一般都会进行垃圾回收,如果能回收足够的内存空间就不会出现OOM异常;如果垃圾回收之后也不能回收足够空间,此时就会发生OOM。但是不是任何情况下,OOM之前都会触发垃圾回收,比如原创 2021-08-31 00:35:22 · 1400 阅读 · 0 评论 -
System.gc()
文章目录System.gc()等同于Runtime.getRuntime().gc(),因为System.gc()底层就是调用Runtime.getRuntime().gc()实现的。通过显示的调用System.gc(),表示显示的触发FULL GC,同时对新生代和老年代进行垃圾回收,但是调用System.gc()无法保证JVM立即进行垃圾回收。JVM的垃圾回收是自动进行的,无须手动触发。System.gc()与System.runFinalization()区别:前面已经介绍,System.gc原创 2021-08-30 00:38:34 · 2191 阅读 · 0 评论 -
java之finalization
文章目录finalization原理java提供的对象终止(finalization)机制主要用来处理对象被回收前的处理逻辑,主要是通过调用对象的finalize()方法来处理对象终止逻辑。finalize()方法允许被重写,一般在该方法中进行一些资源释放和清理的工作,比如关闭文件、套接字和数据库连接等。不要主动调用finalize()方法,交给垃圾回收器回收垃圾时进行调用。原因如下:finalize()方法会导致对象复活;fizalize()执行时间是无法保障的,它完全由GC线程决定,极端情原创 2021-08-25 01:08:14 · 1207 阅读 · 1 评论 -
StringPool详解
文章目录1. String的不可变性2. StringPool结构3. 字符串拼接操作4. 拼接操作与append操作效率对比5. intern详解5.1 intern基本知识5.2 new String创建了几个对象5.3 案例1. String的不可变性在JDK7之后,String的内容是存放在堆中的字符串常量池(StringPool,也可叫StringTable)中的,字符串常量池中相同的字符串只会创建一份,所以定义相同的字符串变量时,多个字符串变量都是指向了同一份地址中的字符串。示例一pub原创 2021-08-15 20:02:55 · 2380 阅读 · 0 评论 -
4、执行引擎
文章目录1. 执行引擎介绍2. 指令理解3. Hotspot虚拟机中解释器为什么与JIT编译器并存4. JIT热点代码探测方式5. HotSpot中解释器、编译器设置方式6. AOT编译器1. 执行引擎介绍执行引擎是java虚拟机和核心组件之一。JVM的主要任务是负责装载字节码到内部,但字节码不能直接运行在操作系统上,因为字节码不等同于机器指令,它内部包含的仅仅只是一些能被JVM识别的字节码指令、符号集,以及其他辅助信息。执行引擎(Execution Engine)的任务就是将字节码指令解释/编译原创 2021-08-05 01:22:57 · 368 阅读 · 0 评论 -
3、直接内存
文章目录直接内存(Direct Memory)并不是虚拟机运行时数据一部分,也不是《Java 虚拟机规范》中定义的内存区域。如果这部分内存被频繁使用,也会导致OOM。在JDK4中新引入的NIO(New Input/Output)类,其引入了一种基于通道(Channel)与缓冲区(Buffer)的方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。这在一些场景中可以显著提高性能,避免了java堆和Nativ原创 2021-07-28 00:47:15 · 337 阅读 · 0 评论 -
java对象实例化内存布局与访问定位
文章目录1. 对象实例化方式2. 对象创建的步骤3. 对象的内存布局4. 对象的访问定位1. 对象实例化方式通过new的方式,例如Persion p = new Persion()通过Class的newInstance()该方式已经被标记过时,这种创建对象的方式有一定局限性:只能创建构造函数为无参的对象;只能创建构造函数为pulic类型的。通过Constructor的newInstance这种方式正好弥补了Class.instance的两种局限性,可以实例化非public、带有参构原创 2021-07-25 15:06:22 · 672 阅读 · 0 评论 -
2、JVM运行时数据区
文章目录运行时数据区介绍1、程序计数器2、虚拟机栈2.1、虚拟机栈介绍2.2、虚拟机栈异常运行时数据区介绍上节讲解了JVM的类加载机制,class字节码文件经类加载子系统加载后存放到运行时数据区的方法区中。而运行时数据区就是Java虚拟机在执行Java程序的过程中会把它管理的内存分为若干个不同的数据区域。这些区域有着各自的用途,一级创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范》中规定,jvm所管理的内存大致包括以下几个运行原创 2021-07-05 01:22:44 · 721 阅读 · 1 评论 -
JVM方法介绍
文章目录1、静态引用与动态引用2、虚方法与非虚方法1、静态引用与动态引用在JVM中,将符号的引用转换为调用方法的直接引用与方法的绑定机制有关静态引用(静态链接)当字节码文件被装入JVM内部时,如果被调用的方法在编译期确定,且运行期保持不变,这种情况下将调用方法的符号引用转换为直接引用的过程称为静态引用,或静态链接;动态引用(动态链接)如果被调用的方法在编译期不确定,在运行期将调用方法的符号引用转换为直接引用的工程称为动态引用,或动态链接。如下代码所示,有一个基类Persion,子类原创 2021-06-13 11:49:25 · 387 阅读 · 0 评论 -
1、JVM类的加载
文章目录1、加载2、链接2.1 验证2.2 准备2.3 解析3、初始化如下图所示,JVM类的加载系统负责从文件系统、网络中或者压缩包中加载Class字节码文件。整个类加载子系统主要由三大步骤完成:加载 -> 链接 -> 初始化。经过类加载系统加载后,Class文件被加载到内存中并对类进行初始化(注意只是初始化了类的静态变量或者静态代码块,并不是执行对象的初始化方法,可以参考后续介绍)。1、加载类加载子系统的加载阶段主要由三类加载器进行加载Class文件:引导类加载器、扩展类加载器、系统类原创 2021-05-08 22:49:02 · 280 阅读 · 1 评论