![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
文章平均质量分 94
知识记录者-vincent
这个作者很懒,什么都没留下…
展开
-
Java 垃圾回收器G1介绍
概述G1垃圾回收器是在Java7 update 4之后引入的一个新的垃圾回收器。G1是一个分代的,增量的,并行与并发的标记-复制垃圾回收器。它的设计目标是为了适应现在不断扩大的内存和不断增加的处理器数量,进一步降低暂停时间(pause time),同时兼顾良好的吞吐量。G1回收器和CMS比起来,有以下不同G1垃圾回收器是compacting(压实)的,因此其回收得到的空间是连续的。这避免了CMS回收器因为不连续空间所造成的问题。如需要更大的堆空间,更多的floating garbage。连续空间意原创 2021-03-04 21:46:58 · 912 阅读 · 1 评论 -
生产环境如何排除和优化 JVM?
生产环境如何排除和优化 JVM?如果是在生产环境中直接排查 JVM 的话,最简单的做法就是使用 JDK 自带的 6 个非常实用的命令行工具来排查。它们分别是:jps、jstat、jinfo、jmap、jhat 和 jstack,它们都位于 JDK 的 bin 目录下,可以使用命令行工具直接运行,其目录如下图所示1、jps(虚拟机进程状况工具)jps(JVM Process Status tool,虚拟机进程状况工具)它的功能和Linux中的 ps 命令比较类似,用于列出正在运行的 JVM..原创 2021-01-26 09:21:20 · 243 阅读 · 0 评论 -
你用过哪些垃圾回收器?它们有什么区别?
用过哪些垃圾回收器?它们有什么区别?《Java 虚拟机规范》并没有对垃圾收集器的具体实现做任何的规定,因此每家垃圾收集器的实现方式都不同,但比较常用的垃圾回收器是OracleJDK中自带的HotSpot虚拟机。HotSpot 中使用的垃圾收集器主要包括 7 个:Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS 和 G1(Garbage First)收集器Serial收集器Serial收集器属于最早期的垃圾收集器,也是...原创 2021-01-25 16:02:27 · 179 阅读 · 0 评论 -
JVM 垃圾回收算法有哪些?
如何判断一个对象是否“死亡”?垃圾回收的算法有哪些?垃圾回收器(GC,Garbage Collection)首先要做的就是,判断一个对象是存活状态还是死亡状态,死亡的对象将会被标识为垃圾数据并等待收集器进行清除判断一个对象是否为死亡状态的常用算法有两个:引用计数器算法和可达性分析算法引用计数算法(Reference Counting) 属于垃圾收集器最早的实现算法了,它是指在创建对象时关联一个与之相对应的计数器,当此对象被使用时加 1,相反销毁时 -1。当此计数器为 0 时,则表示此对象未使用,原创 2021-01-25 15:42:03 · 364 阅读 · 0 评论 -
JVM 的内存布局和运行原理?
JVM 的内存布局和运行原理?JVM 的种类有很多,比如HotSpot虚拟机,它是Sun/OracleJDK和OpenJDK中的默认 JVM,也是目前使用范围最广的 JVM。我们常说的 JVM 其实泛指的是 HotSpot 虚拟机,还有曾经与 HotSpot 齐名为“三大商业 JVM”的 JRockit 和 IBM J9 虚拟机。但无论是什么类型的虚拟机都必须遵守 Oracle 官方发布的《Java虚拟机规范》,它是 Java 领域最权威最重要的著作之一,用于规范 JVM 的一些具体“行为”...原创 2021-01-25 15:35:05 · 121 阅读 · 0 评论 -
JVM 调优参数介绍
jvm参数-Xms堆最小值-Xmx堆最大堆值。-Xms与-Xmx 的单位默认字节都是以k、m做单位的。通常这两个配置参数相等,避免每次空间不足,动态扩容带来的影响-Xmn新生代大小-Xss每个线程池的堆栈大小。在jdk5以上的版本,每个线程堆栈大小为1m,jdk5以前的版本是每个线程池大小为256k。一般在相同物理内存下,如果减少-Xss值会产生更大的线程数,但不同的操作系统对进程内线程数是有限制的,是不能无限生成-XX:NewRatio设置新生代与老年代比值,-XX:NewR原创 2020-09-07 14:06:40 · 684 阅读 · 0 评论 -
JVM 垃圾收集机制
程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收判断一个对象是否可被回收引用计数算法给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收两个对象出现循环引用的情况下,此时引用计数器永远不为 0,导致无法对它们进行回收正因为循环引用的存在,因此 Java 虚拟机不使用引用计数算法public class ReferenceCo.原创 2020-09-07 12:18:48 · 85 阅读 · 0 评论 -
JVM 内存模型
JMM引入从堆栈说起JVM内部使用的Java内存模型在线程栈和堆之间划分内存堆栈里面放了什么?线程堆栈还包含正在执行的每个方法的所有局部变量(调用堆栈上的所有方法)。 线程只能访问它自己的线程堆栈。 由线程创建的局部变量对于创建它的线程以外的所有其他线程是不可见的。 即使两个线程正在执行完全相同的代码,两个线程仍将在每个自己的线程堆栈中创建该代码的局部变量。 因此,每个线程都有自己的每个局部变量的版本基本类型的所有局部变量(boolean,byte,short,char,int,原创 2020-09-07 10:09:18 · 99 阅读 · 0 评论 -
JVM 对象创建过程
对象创建的流程步骤包括哪些虚拟机遇到一条new指令时,首先检查这个对应的类能否在常量池中定位到一个类的符号引用 判断这个类是否已被加载、解析和初始化 为这个新生对象在Java堆中分配内存空间Java堆分配内存空间的方式主要有以下两种指针碰撞分配内存空间包括开辟一块内存和移动指针两个步骤 非原子步骤可能出现并发问题,Java虚拟机采用CAS配上失败重试的方式保证更新操作的原子性空闲列表分配内存空间包括开辟一块内存和修改空闲列表两个步骤 非原子步骤可能出现并发问题,Java虚拟原创 2020-09-04 14:21:31 · 268 阅读 · 0 评论 -
JVM 内存结构
概述程序计数器记录正在执行的虚拟机字节码指令的地址(如果正在执行的是本地方法则为空)Java 虚拟机栈每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息,从调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程可以通过 -Xss 这个虚拟机参数来指定每个线程的 Java 虚拟机栈内存大小java -Xss1024M HackTheJava该区域可能抛出以下异常当线程请求的栈深度超过最大值,会抛出原创 2020-09-04 12:20:32 · 78 阅读 · 0 评论 -
JVM 类加载机制
类的生命周期类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定)。另外注意这里的几个阶段是按顺序开始,而不是按顺序进行或完成,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段类的加载: 查找并加载类的二进制数据加载是类加载过程的第一个阶段,在加载阶段,原创 2020-09-04 11:45:00 · 159 阅读 · 0 评论 -
JVM 类字节码介绍
为什么jvm不能直接运行java代码呢?在cpu层面看来计算机中所有的操作都是一个个指令的运行汇集而成的,java是高级语言,只有人类才能理解其逻辑,计算机是无法识别的,所以java代码必须要先编译成字节码文件,jvm才能正确识别代码转换后的指令并将其运行Java代码间接翻译成字节码,储存字节码的文件再交由运行于不同平台上的JVM虚拟机去读取执行,从而实现一次编写,到处运行的目的 JVM也不再只支持Java,由此衍生出了许多基于JVM的编程语言,如Groovy, Scala, Koltin等原创 2020-09-04 10:49:49 · 234 阅读 · 0 评论