
JVM
个人对JVM的学习手记
至学者
有道无术,术尚可求,有术无道,止于术!
展开
-
回顾堆内存大小设置
设置堆大小的配置参数:-Xms设置堆的最小空间大小-Xmx设置堆的最大空间大小-XX:NewSize设置新生代的最小空间大小-XX:MaxNewSize设置新生代的最大空间大小-XX:PermSize设置永久代最小空间大小-XX:MaxPermSize设置永久代最大空间大小-Xss设置每个线程的堆内存大小没有直接设置老年代堆内存的参数:老年代空间大小 = 对空间大小 - 新生代空间大小...原创 2022-02-07 10:47:39 · 394 阅读 · 0 评论 -
jvisualvm安装插件出现网络问题
一 详细信息二 修改插件设置 先去查看本地JDK版本然后去插件中心查看对应版本的插件: VisualVM: Plugins Centershttps://visualvm.github.io/pluginscenters.html 复制插件地址链接 安装成功: 展示...原创 2022-01-18 04:25:51 · 2185 阅读 · 0 评论 -
回顾jvisualvm安装插件简单操作
一 概述jvisualvm可以查看堆内存的消耗,但是一些更加详细的信息我们需要选装一些插件。二 插件安装步骤选择: 个人选择Visual GC 安装完成即可,个人可以根据需要选择插件进行安装。...原创 2022-01-18 04:16:03 · 432 阅读 · 0 评论 -
‘jvisualvm‘ 不是内部或外部命令
一 详细提示C:\Users\windows>jvisualvm'jvisualvm' 不是内部或外部命令,也不是可运行的程序或批处理文件。二 JDK的环境变量配置JAVA_HOME为个人的JDK安装目录%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;三 展示结果启动成功...原创 2022-01-18 04:10:08 · 4868 阅读 · 0 评论 -
Springboot项目启动查看GC信息
一 参数-XX:+PrintGCDetails -XX:+PrintGCDateStamps二 参数使用三 使用效果 具体详细分析,后续补上...原创 2021-12-03 16:37:31 · 1127 阅读 · 0 评论 -
回顾JVM调优之jstat -gcutil pid
一 概述 jstat -gcutil pid jstat -gccause pid 参考:jvm系列(四):jvm调优-命令篇_纯洁的微笑-CSDN博客https://blog.csdn.net/ityouknow/article/details/78209205使用jstat分析系统的垃圾回收情况_达叔-CSDN博客https://blog.csdn.net/exceptional_derek/article/detai...原创 2021-11-02 17:27:04 · 452 阅读 · 1 评论 -
记一次线上服务导致cpu飙升问题排查
一 概述 突然收到线上服务器的CPU占用过高,接近80%。二 排查过程 先通过TOP命令查看占有CPU的进程信息。 top命令参考资料:TOP命令输出完全解释_欣宇专栏-CSDN博客https://blog.csdn.net/lv_xinmy/article/details/8574226linux下top命令详细介绍 - DiYong - 博客园 (cnblogs.com)https://www.cnbl...原创 2021-11-02 14:17:54 · 282 阅读 · 0 评论 -
回顾JPS命令
一 概述 jps是jdk提供的一个查看当前java进程的小工具, 可以看做是Java Virtual Machine Process Status Tool的缩写。非常简单实用。 命令格式:jps [options ] [ hostid ] [options]选项:-q:仅输出VM标识符,不包括classname,jar name,arguments in main method-m:输出main method的参数-l:输出完全...原创 2021-10-21 10:36:08 · 118 阅读 · 0 评论 -
回顾GC的特点
一概述 GC即Garbage Collection,简言之就是垃圾回收,使得系统更好的使用。二 回顾特点垃圾回收机制只是负责回收堆内存资源,不会对任务物理资源进行回收。 垃圾回收的具体时间是无法实现精确控制的。 在垃圾回收之前,总会先调用它的finalize方法进行最有一次垃圾回收确认。...原创 2021-07-27 20:44:36 · 335 阅读 · 0 评论 -
线上OOM问题
2021-05-24 23:43:43.771 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#1-2] ERROR o.s.a.r.listener.SimpleMessageListenerContainer.run - Consumer thread error, thread abort.java.lang.OutOfMemoryError: Java heap space at java.awt.image.D.原创 2021-05-31 20:20:31 · 354 阅读 · 0 评论 -
Java1.8开始为什么用元空间替换永久代
一 概述Java1.8开始,JDK中的永久代被元空间替换了。二 回顾JMM中的方法区如图所示,方法区同堆空间一样,属于所有线程共享的数据区域,它用于存储已经被虚拟机加载的类信息,常量,静态变量,即时编译后的代码等数据。三 回顾永久代与方法区的关系如果在HotSpot虚拟机上开发,部署,方法区是规范,永久代是Hotspot针对该规范进行的实现。在Java7及以前的版本中,方法区都是永久代实现的。四 元空间与方法区的关系对于Java8而言,HotSpots取消了永久代,取而代之的原创 2021-03-01 20:12:44 · 2264 阅读 · 1 评论 -
回顾GC是如何判断哪个对象应该被回收问题
一 概述Java程序中,当一个对象没有被其它对象引用时,则该对象对于虚拟机而言就应该被回收的对象,其占用的内存空间需要被释放,同时对象也会被销毁。二 判断对象应该被回收的具体算法1. 引用计数算法该算法通过判断对象的引用数量来决定对象是否可以被回收,在此机制下,堆中每个对象都存在一个引用计数器,当一个对象创建后被分配一个引用之后则对应的引用计数器加1,当引用完成后则引用计数器相应的减1,当某个对象的引用计数器为0的时候后,则会被虚拟机作为垃圾进行回收,并释放其所占用的内存空间。优点:引用原创 2021-01-25 10:54:52 · 312 阅读 · 0 评论 -
栈实现浏览器的前进和后退功能
一 概述当你一次访问完一串页面a-b-c之后,点击浏览器的后退按钮,就可以查看之前浏览过的页面b和a。当你后退到页面a,点击前进按钮,就可以重新查看页面b和c。但是,如果你后退到页面b后,点击了新的页面d,那就无法再前继,后退功能查看页面c了。二 栈关于栈操作可以比作看书,一般都是一张纸一张纸的往后阅读,如同进栈操作从前往后进栈,出栈如同一张纸一张纸的往前合上书籍,如同出栈操作从后往前出栈。出栈结束表示整本书都关闭了。所有后进先出,先进后出,就是典型的"栈"结构。 ...原创 2020-10-02 10:48:46 · 1008 阅读 · 0 评论 -
锁优化
一 概述高效并发是JDK升级到JDK6后一项重要的改进项,锁优化则是重要的改进项,目的是为了在线程之间更高效地共享数据及解决竞争问题,从而提高程序的执行效率。各种锁优化技术:适应性自旋(Adaptive Spinning) 锁消除(Lock Elimination) 锁粗化(Lock Coarseing) 轻量级锁(LinghtWeight Locking) 偏向锁(Biased Locking)二 自旋锁与自适应自旋对于互斥同步来说,互斥同步对性能最大的影响是阻塞的实现,挂起线.原创 2020-09-30 10:41:29 · 311 阅读 · 0 评论 -
Java中的不同锁
一 概述在Java5之前,在协调对共享对象的访问可以使用的内置锁机制是借助关键字synchronized和volatile实现,Java5之后增加了Lock接口,并提供了相应是实现类,如ReentrantLock类等。它是弥补内置加锁机制不适合时的一种高级功能。二 Lock接口Lock接口定义了一组抽象的加锁操作。与内置加锁机制不同的时,Lock提供了一种无条件,可轮询,定时的以及可中断的锁获取操作,所有加锁和解锁的方法都是显示的,故可以称这些锁位显式锁。在Lock的实现中必须提供与内部锁相同.原创 2020-09-27 13:24:13 · 359 阅读 · 0 评论 -
Garbage First收集器
一 概述Garbage First(简称G1)收集器时基于Region的内存分布形式,在JDK8 Update 40的时候,G1提供了并发的类卸载的支持,补全了其计划的功能。这个版本以后的G1收集器被Oracle官方称为"全功能的垃圾收集器"(Fully-Featured Garbage Collector)。G1是一款主要面向服务端应用的垃圾收集器,在以后的发展中会替换掉JDK5中发布的CMS收集器。在JDK9中,G1取代了Parallel Scavenge+Parallel Old组合,称为服务原创 2020-09-23 16:45:20 · 316 阅读 · 0 评论 -
CMS收集器
一 概述CMS(Concurrent Mark Sweep)收集器十一种以获取最短回收停顿时间为目标的收集器。所以它非常适用于系统要求比较快的相应速度且系统停顿时间尽可能短的应用。CMS收集器——并发标记清除收集器,它是基于标记—清除算法实现的。二 CMS收集器处理的步骤初始标记(CMS initial mark) 并发标记(CMS concurrent mark) 重新标记(CMS remark) 并发清除(CMS concurrent sweep)上述步骤中的初始标记,重新标记这两个原创 2020-09-23 14:28:37 · 338 阅读 · 0 评论 -
Java虚拟机栈(Java Virtual Machine Stack)
Java虚拟机栈(Java Virtual Machine Stack)是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型;每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧(Stack Frame)用于存储局部变量表,操作数栈,动态连接和方法返回地址等信息,每个方法被调用直至执行完毕的过程,会对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。局部变量表存放了编译期可知的各种Java虚拟机基本数据类型(boolean(only ture or false),[byte原创 2020-09-19 12:19:53 · 225 阅读 · 0 评论 -
破坏双亲委派模型
一 概述双亲委派模型并不是一个具有强制性约束的模型,而是Java设计者推荐给开发者的类加载方式。Java中的大部分类的加载器都遵循这个模型。例外的是,直到Java模块化出现为止,双亲委派模型主要出现过3次比较大规模的"被破坏"的情况。二 双亲委派机制的第一次破坏双亲委派模型的第一次"被破坏"其实发生在双亲委派模型出现之前,即JDK1.2之前。由于双亲委派模型在JDK1.2之后才被引入,但是类加载器的概念和抽象类java.lang.ClassLoader则在Java的第一版本中已经存在,面对已经存原创 2020-09-17 23:01:25 · 348 阅读 · 0 评论 -
Java中多种引用
一 概述在JDK1.2版之前,Java里面的引用是很传统的定义,即如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称该reference数据是代表某块内存,某个对象的引用。这种定义并没有什么不对,只是现在看来有些过于狭隘,一个对象在这种定义下只有“被引用”或者“未被引用”两种状态,对于描述一些“食之无味,弃之可惜”的对象就显得无能为力。如我们所需要描述的一类对象为:当内存空间还足够时,能保留在内存之中,如果内存空间在进行垃圾收集后仍然非常紧张,那就可以抛弃这些对象——很原创 2020-09-16 10:12:36 · 154 阅读 · 0 评论 -
Java内存模型中原子性,可见性和有序性处理
一 概述Java的内存模型是围绕着在并发过程中如何处理原子性,可见性和有序性这三个特征来建立的。二 原子性(Atomicity)由Java内存模型来直接保证的原子性操作包括read,load,assign,use,store和write这六个,大致认为基本数据类型的访问,读写都是具有原子性的(long和double的非原子性协定除外)。Java为了满足更大范围的原子性保证,Java内存模型还提供了lock和unlock操作来满足这种需求,尽管虚拟机没有将lock和unlock的操作直接开放给原创 2020-09-15 23:47:40 · 304 阅读 · 0 评论 -
递归方法是如何引起java.lang.StackOverflowError异常的的?
一 概述Java8源码中有以下一句话,意思为由于应用程序递归太深而导致堆栈溢出。/** * Thrown when a stack overflow occurs because an application * recurses too deeply. * 由于应用程序递归太深而在堆栈溢出时抛出 * @author unascribed * @since JDK1.0 */二 递归造成堆栈溢出的原因当一个线程执行一个方法时,就会随之创建一个栈帧,并将该栈帧压入虚拟机栈原创 2020-09-02 18:35:00 · 1290 阅读 · 0 评论 -
Java自定义加载CustomClassLoader
一 概述在类加载的阶段,Java虚拟机需要完成以下三件事情:通过一个类的全限定名来获取定义此类的二进制字节流。 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。《Java虚拟机规范》对于上述三点其实并没有特别具体的要求,留给虚拟机实现与Java应用的灵活度都是相当大的。如“通过一个类的全限定名获取定义此类的二进制字节流”这一规则,它并没有指明二进制字节流必须从某个Class文件原创 2020-08-22 21:40:10 · 1040 阅读 · 0 评论 -
Java中的类加载ClassLoader
一 概述编译器会将java源文件编译成以字节码形式保存的class文件,而ClassLoader将字节码转换JVM中的Class<T>对象,我们Byte数组的形式将获取的字节码传递过来,使得JVM利用Class<?>对象实例化?(泛型)具体所表示类的对象。类的生命周期:二 类加载的种类1.Bootstrap ClassLoader:这个类加载器使用C++语言实现,是虚拟机的一部分,该加载器负责将JAVA_HOME/lib中的类库加载到内存够中(如rt.jar)。该原创 2020-08-22 17:18:04 · 399 阅读 · 0 评论 -
初识JVM与字节码之间的秘密
一 概述JVM(Java Virtual Machine)是,它是一种抽象的计算机,通过在不同计算机上仿真模拟计算机的功能,拥有自己完善的硬件架构,如处理器,堆栈,寄存器等。此外,它还有相应的指令系统,JVM屏蔽了与具体操作系统相关的信息,使得编程语言只需编译生成能够被JVM解析的字节码,就可以在任何装有JVM的机器上被解释执行。 JVM是一个内存中的虚拟机,则JVM的存储就是内存。主流的JVM是基于C++语言实现的。二 JVM与字节码各种平台上的Java虚拟机以及所有平台...原创 2020-08-22 10:14:59 · 305 阅读 · 1 评论 -
Java8 默认垃圾回收器(GC)
一 概述GC(Garbage Collection),在程序运行过程中内存空间是有限的,为了更好的的使用有限的内存空间,GC会将不再使用的对象清除然后将其所占用的内存释放出来。触发GC的条件:1. 程序调用System.gc的时候触发GC。 /** * Runs the garbage collector. * <p> * Calling the <code>gc</code> method suggests that原创 2020-06-08 18:43:08 · 26538 阅读 · 3 评论