JVM
文章平均质量分 93
四五又十
这个作者很懒,什么都没留下…
展开
-
JVM(11)--JDK自带的命令行处理工具
前面讲解了一大堆JVM的内存结构和对象创建的事情,这些是JVM的基础,但是最终的目的还是为了能够进行调优,有时候应用无法响应了,报出了OOM,或者内存泄漏、死锁等等这些问题,而要解决这些问题,学习一下jdk自带的一些命令行工具是必不可少的,有了这些工具的基础不至于在遇到问题时只会重启解决问题,而能从根源上解决应用存在的问题,从而提高Java开发的内功总体上来说,常用的jdk工具有以下几个:jps:查看所有java进程jstat:监视虚拟机各种运行状态信息jinfo:实时的查看和调整虚拟机的各项参数原创 2021-03-25 15:46:52 · 691 阅读 · 1 评论 -
JVM(10)--Java对象创建过程与内存分配策略
一、Java对象创建过程第一步:类加载检查当虚拟机遇到一条new指令的时候,会去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个类是否被加载、连接、初始化过,如果这些都完成直接返回该对象即可,如果没有则进行下一步操作第二步:分配内存在类加载检查通过,接下来虚拟机将会新生对象分配对象,对象所需的内存大小在类加载完成后便可确定,为对象分配空间的任务等同与把一块确定大小的内存同堆中划分出来,分配方式有两种,指针碰撞和空闲列表,使用这两种方法的规则判定是当前的内存空间是否完整,而堆空间原创 2021-03-25 14:27:10 · 291 阅读 · 0 评论 -
JVM(9)--JVM常见参数设置与OOM异常
一、JVM参数类型JVM一共有3种参数类型:标准参数X参数XX参数1.1 标准参数标准参数,在各个版本的JVM里面中,基本保持不变。相对比较稳定,例如:-help-server -client-version -showversion-cp -classpath1.2 X参数Xint 解释执行-Xcomp:第一次使用就编译成本地代码-Xmixed:混合模式,JVM自己来决定是否编译成本地代码1.3 XX参数xx参数是主要我们调优需要设置的参数,XX参数分为两大类B原创 2021-03-25 08:41:14 · 481 阅读 · 0 评论 -
JVM(8)--垃圾回收算法与垃圾回收器
一、概述深入理解java虚拟机中写到”Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。”Java在动态内存分配与回收上已经是自动化的,但是当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。1.1 什么是垃圾垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应原创 2021-03-25 08:35:28 · 1114 阅读 · 0 评论 -
JVM(7)--深入理解String利用Java内存模型
参考:《深入理解Java虚拟机》 《宋红康JVM教程》之前学Java基础的时候写过一篇关于String类的思考(对String的一些思考),但是那个时候还不懂Java的内存模型,当时为了证明是否正确,使用了反编译,还查阅了字节码指令。但是String远远没有那么简单,在理解了Java的内存模型之后,尤其是听了宋红康老师的String的教程,对String有更加深刻的理解。一、引题开篇首先给出一些常见的面试题,如果下面这些面试题,各位心里都有非常肯定的答案,那么这篇文章并不适合你下面操作一共原创 2021-03-24 18:41:19 · 437 阅读 · 0 评论 -
JVM(2)--类加载机制--双亲委派原理
前面介绍了类的加载子系统,从一个.class文件变成Java虚拟机可用的类,要经过加载–>链接(验证–>准备–>解析)–>初始化–>使用–>卸载这五个过程,经过这五个过程.class文件变成了可用的类,但是具体到组件,到底是谁执行了上面这五个过程呢?是谁保证这个加载过程中的安全性和准确性?这里就不得不提到类加载器和双亲委派模型一、类加载器ClassLoader在虚拟机的角度,一共有两种类加载器,①启动类加载器,②其他的加载器,这样划分的依据是,启动类加载器是使用C/C原创 2021-03-23 19:57:18 · 149 阅读 · 2 评论 -
JVM(6)--运行时数据区---方法区
参考:《深入理解Java虚拟机》 《宋红康JVM教程》一、概述在介绍方法区之前,简单的回顾一下运行时数据区的各个部分组成:方法区是线程共享的一块区域,在《Java虚拟机规范》中对方法区的作用的描述是It stores per-class structures such as the run-time constant pool, field and method data, and the code for methods and constructors, including the原创 2020-09-05 16:47:04 · 164 阅读 · 0 评论 -
JVM(5)--运行时数据区--- 堆
参考:《深入理解Java虚拟机》 《宋红康JVM教程》一、概述在介绍堆之前,简单的回顾一下运行时数据区的各个部分组成:堆是Java虚拟机所管理的最大的内存区域,由上图也可见,堆是线程共享的一个区域,在虚拟机启动时创建,堆的唯一作用便是存放对象实例几乎所有的对象都在堆上分配内存=,这里的描述是“几乎”,因为随着栈上分配,标量替换这些优化技术,所有对象的分配在堆上不是那么“绝对”。堆,是垃圾收集器管理的主要区域,虚拟机栈上不存在垃圾回收。堆是运行时数据区的线程共享区域,但是在这里还可以划分原创 2020-08-02 22:23:11 · 222 阅读 · 0 评论 -
JVM(4)--运行时数据区--- Java虚拟机栈
参考:《深入理解Java虚拟机第三版》 《宋红康JVM教程》目录一、概述二、对Java虚拟机栈的理解1.虚拟机栈的特点2.通过程序来理解3.栈中可能出现的异常4.设置栈的内存大小5.Java虚拟机栈的内部结构三、Java虚拟机栈的内部结构1.局部变量表1.1 局部变量表的大小确定1.2 局部变量表的存储结构1.3 Solt的重复利用1.4 局部变量表在使用前注意1.5局部变量表小结2.操作数栈2.1.概述2.2 通过程序来理解2.3 栈顶缓存技术3. 动态链接3.1 概述3.2 方法的调用3.3原创 2020-07-18 17:16:26 · 269 阅读 · 0 评论 -
JVM(3)--运行时数据区--- PC寄存器(程序计数器)
参考:《深入理解Java虚拟机第三版》 《宋红康JVM教程》一、概述上两篇介绍了类加载的过程中,Java虚拟机应该要做什么工作,当类加载进Java虚拟机的内存中的时候,Java虚拟机将这些内存空间划分了几个不同的区域,这个区域总体上称为运行时数据区,运行时数据区有五个不同的区域。这些区域有各自不同的功能,有不同的创建和销毁的时间,有的区域随着虚拟机进程的存在而存在,有的是依赖用户的线程的启动和结束而建立和销毁。下图则说明了Java虚拟机管理的内存分配情况:[外链图片转存失败,源站可能有防盗链机原创 2020-07-14 22:15:03 · 204 阅读 · 0 评论 -
JVM(1)--类加载机制--类的加载子系统
参考:《深入理解Java虚拟机第三版》 《宋红康JVM教程》前言:JVM虚拟机运行的是字节码文件,一个.java文件通过编译变成一个.class字节码文件,.class字节码文件才是JVM虚拟机需要的文件,但是.class文件中的类是什么时候被加载,如何被加载的呢?本文便详细介绍这几个问题。一、类的生命周期类被加载的到虚拟机内存中开始,到卸载出内存结束,一共经过下列过程:二、类的加载过程1.加载在加载阶段,虚拟机需要完成以下三件事情:通过一个类的全限定明获取定义此类的二进制字节流;原创 2020-07-04 17:29:44 · 159 阅读 · 0 评论