
JVM
文章平均质量分 94
JVM总结
Jesslili
java小小白
展开
-
JVM--垃圾回收机制--04垃圾回收器详解
文章目录一、GC分类与性能指标二、不同的垃圾回收器概述三、Serial回收器:串行回收四、ParNew回收器:并行回收五、Parallel回收器:吞吐量优先六、CMS回收器:低延迟七、G1回收器:区域化分代式八、垃圾回收器总结九、GC日志分析十、垃圾回收器的新发展 一、GC分类与性能指标 按线程数分,GC可以分为串行垃圾回收器和并行垃圾回收器。 串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。 在诸如单CPU处理器或者较小的应用内存等硬件原创 2020-10-27 17:34:16 · 397 阅读 · 0 评论 -
JVM--垃圾回收机制--03相关概念
文章目录一、System.gc()的理解二、内存溢出与内存泄漏三、Stop The World四、垃圾回收的并行与并发并发五、安全点与安全区域六、再谈引用1. 强引用-- 不回收2. 软引用--内存不足即回收3. 弱引用--发现即回收4. 虚引用--对象回收跟踪5. 终结器 一、System.gc()的理解 在默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。 Syste原创 2020-10-13 20:51:27 · 278 阅读 · 0 评论 -
JVM--垃圾回收机制--02相关算法
一、垃圾回收相关算法 垃圾标记阶段:对象存活判断 在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。 简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡。 判断对象存活一般有两种方式:引用计数算法和可达性分析算法。 1. 标记阶段:引用计数算法(java没有采用) 引用计数算法比较简单,对每个对原创 2020-10-07 16:32:18 · 256 阅读 · 0 评论 -
JVM--垃圾回收机制--01概述
垃圾回收概述 1. 什么是垃圾 垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空 间会一直保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出。 关于垃圾收集有三个经典问题: ➢哪些内存需要回收? ➢什么时候回收? ➢如何回收? 2. 为什么需要GC 对于高级语言来说,一个基本认知是如果不进行垃圾回收,内存迟早都会被消耗完,因为不断地分配内存空间而不进行回收,就好像不停地生产生活垃圾而从来不打扫一原创 2020-10-06 15:30:46 · 293 阅读 · 0 评论 -
JVM--字符串常量池--StringTable(重要)
一、String是基本特性 String声明为final的, 不可被继承。 String实现了Serializable接口:表示字符串是支持序列化的。 实现了Comparable接口:表示String可以比较大小。 String在jdk8及以前内部定义了final char[],value用于存储字符串数据。jdk9时改为byte[]。String不用char[] 来存储,改成了byte[] 加上编码标记,节约了一些空间。StringBuffer和StringBuilder也做了一些修改。原创 2020-10-05 18:07:24 · 334 阅读 · 0 评论 -
JVM--执行引擎总结
一、执行引擎概述 执行引擎是Java虚拟机的核心组成部分之一 虚拟机是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。 JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM锁识别的原创 2020-09-28 20:29:47 · 307 阅读 · 0 评论 -
JVM--运行时数据区--06方法区
一、堆、栈、方法区的交互关系 二、方法区的理解 方法区与Java堆一样,是各个线程共享的内存区域。 方法区在JVM启动时就会被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的。 方法区的大小,跟堆空间一样,可以选择固定大小或者可拓展。 方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误:java.lang,OutOfMemoryError:Metaspace,比如: 加载大量的第三方jar包 Tomcat部署的工程过多原创 2020-09-24 21:08:31 · 374 阅读 · 0 评论 -
JVM--运行时数据区--05堆--堆是分配对象的唯一选择吗?
堆是分配对象的唯一选择吗? 在《深入理解Java虚拟机》中关于Java堆内存有这样一段描述:随着JIT编译期的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐变得不那么“绝对”了。 在Java虚拟机中,对象是在Java堆中分配内存的,这是一个普遍的常识。但是,有一种特殊情况,那就是如果经过逃逸分析后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。这样就无需在堆上分配内存,也无须进行垃圾回收了。这也是最常见的堆外存储技术。 此外,原创 2020-09-23 19:01:59 · 391 阅读 · 0 评论 -
JVM--运行时数据区--05堆
文章目录一、堆的核心概述二、设置堆空间的大小三、年轻代与老年代四、对象分配的一般过程五、Minor GC、Major GC、Full GC六、堆空间分代思想七、内存分配策略总结八、TLAB(堆当中的线程私有缓存区域) 一个进程对应一个jvm实例,一个jvm实例对应一个运行时数据区。一个进程又包含了多个线程,这些线程共享运行时数据区中的方法区和堆,每个线程又各自拥有程序计数器、本地方法栈和虚拟机栈。 一、堆的核心概述 一个jvm实例只存在一个堆内存,堆也是java内存管理的核心区域。 Java堆区在原创 2020-09-18 10:46:31 · 333 阅读 · 0 评论 -
JVM--运行时数据区--04本地方法栈
Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法(一般非Java实现的方法)的调用。 本地方法栈,也是线程私有的。 允许被实现成固定或者是可动态拓展的内存大小。(和Java虚拟机栈在内存溢出方面情况是相同的) 如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个StackOverFlowError异常。 如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的本地方法栈,那..原创 2020-09-13 15:15:05 · 218 阅读 · 0 评论 -
JVM--本地方法接口
简单来讲,一个本地方法就是一个java调用非java代码的接口,一个本地方法是这样一个java方法:该方法的底层实现由非Java语言实现,比如C。这个特征并非java特有,很多其他的编程语言都有这一机制,比如在C++ 中,你可以用extern “C” 告知C++ 编译器去调用一个C的函数。 在定义一个本地方法时,并不提供实现体(有些像定义一个Java interface),因为其实现体是由非java语言在外面实现的。 本地接口的作用是融合不同的编程语言为java所用,它的初衷是融合C/C++程序。 标识符.原创 2020-09-13 15:02:39 · 480 阅读 · 0 评论 -
JVM--运行时数据区--03虚拟机栈
文章目录一、虚拟机栈的概述二、Java虚拟机栈的特点三、栈中可能出现的异常四、设置栈的内存大小五、Java虚拟机栈的存储单位六、Java虚拟机栈的运行原理七、栈帧的内部结构1. 局部变量表2. 操作数栈八、、虚拟机栈的相关面试题 一、虚拟机栈的概述 虚拟机栈出现的背景:由于跨平台性的设计,java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。 根据栈设计的优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。 栈是运行时的单位,而堆是存储的单位原创 2020-09-13 14:39:18 · 320 阅读 · 0 评论 -
JVM---方法的调用
方法的调用 在JVM中,将符号引用转换为调用方法的直接引用与方法的绑定机制相关。 静态链接 当一个字节码文件被装载进JVM内部时,如果被调用的目标方法在编译期可知,且运行期保持不变时。这种情况下将调用方法的符号引用转换为直接引用的过程称之为静态链接。 动态链接 如果被调用的方法在编译期无法被确定下来,也就是说,只能够在程序运行期将调用方法的符号引用转换为直接引用,由于这种引用转换过程具备动态性,因此也就被称之为动态链接。 对应的方法的绑定机制为:早期绑定(Early Binding)和晚期绑定(Late原创 2020-09-13 11:15:17 · 423 阅读 · 0 评论 -
JVM--运行时数据区--02PC寄存器
程序计数寄存器(Program Counter Register)也称作PC寄存器。 一、PC寄存器介绍 JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。 作用:PC寄存器用来存储指向下一条指令的地址,也就是即将要执行的指令代码。由执行引擎读取下一条指令。 它是一块很小的内存空间,几乎可以忽略不计。也是运行速原创 2020-09-12 16:14:40 · 363 阅读 · 0 评论 -
JVM--运行时数据区--01结构及线程
一、Java内存空间 内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了JAVA在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的jvm对于内存的划分方式和管理机制存在着部分差异 java虚拟机定了了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁。 灰色的区域为单独线程私有的,红色的.原创 2020-09-12 10:45:04 · 163 阅读 · 0 评论 -
JVM--类加载子系统--01
内存图: 一、类加载器ClassLoader 从字节码开始,后续的工作都由JVM负责。 类加载子系统负责从文件系统或者网络中加载Class文件,放在方法区------DNA元数据模板。Class文件在文件开头有特定的文件标识。 类加载子系统只负责class文件的加载,至于它是否可以运行,则由执行引擎发挥决定。 加载的类信息存放在一块称为方法区的内存空间。除了类信息外,方法区中还会存放运行时的常量信息。 通过调用构造方法创建的对象存放在堆空间中。 二、类的加载过程 step1. 加载 通过一个类的原创 2020-09-11 11:22:09 · 264 阅读 · 0 评论