深入理解JVM
JVM
RRRRRGT
纸上得来终觉浅,绝知此事要躬行
展开
-
一篇文章搞懂类加载子系统的加载过程
JVM整体架构JVM被分为三个主要的子系统:(1)类加载子系统(2)运行时数据区(3)执行引擎如果我们想自己写一个Java虚拟机的话,主要考虑的就是类加载器和执行引擎。类加载子系统的过程字节码文件存在于本地硬盘上,可以理解为设计师画在纸上的模板,在执行的时候要先把字节码文件加载到 JVM 当中,再根据这个模板实例化出 n 个一模一样的实例。字节码文件加载到 JVM 中,被称为 DNA元数据模板,存放在方法区当中在字节码文件到JVM中,最后称为元数据模板,此过程需要一个运输工具原创 2020-08-05 17:39:41 · 1108 阅读 · 3 评论 -
一篇文章带你搞懂JVM的内存结构(运行时数据区)
简介当字节码通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会用到执行引擎对类进行使用,同时执行引擎将会使用到我们运行时数据区内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行 JVM 内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了 JVM 的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。结合JVM虚拟机规范,来探讨一下经典的JVM内原创 2020-08-07 21:50:34 · 496 阅读 · 0 评论 -
带你走进 JVM 中堆的世界
文章目录堆的概述堆内存细分堆的概述堆针对一个JVM进程来说是唯一的,也就是一个进程就对应着一个JVM实例,一个JVM实例当中就有一个运行时数据区(对应着java类中的Runtime),另外,一个进程包含多个线程,他们共享同一堆空间和方法区,每个线程又有一套自己的程序计数器、本地方法栈、虚拟机栈(独享)。共享也就意味着要考虑线程安全问题一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候即被创建,其空间大小也就确定了,是JVM管理的最大一块内存空间原创 2020-08-09 16:20:29 · 590 阅读 · 2 评论 -
不会吧不会吧,不会还有人不知道JVM 方法区吧
前言方法区也是运行时数据区的一部分。方法区是线程共享的ThreadLocal:如何保证多个线程在并发环境下的安全性;典型应用就是数据库连接管理,以及线程会话管理栈、堆、方法区的交互关系最简单的一个例子:实例化一个对象。Person:存放在元空间,也可以说方法区person:存放在Java栈的局部变量表中new Person():存放在Java堆中方法区的理解《Java虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或原创 2020-08-10 17:32:08 · 440 阅读 · 0 评论 -
通过对象的实例化、内存布局、访问定位加深JVM内存的理解
对象的实例化创建对象的方式new:最常见的方式、单例类中调用getInstance的静态类方法,XXXFactory的静态方法Class的newInstance方法:在JDK9里面被标记为过时的方法,因为只能调用空参构造器Constructor的newInstance(XXX):反射的方式,可以调用空参的,或者带参的构造器使用clone():不调用任何的构造器,要求当前的类需要实现Cloneable接口中的clone接口使用序列化:从文件、网络中获取一个对象的二进制流(序列化一般用于Sock原创 2020-08-10 22:10:40 · 325 阅读 · 0 评论 -
What is 直接内存 ?
概述因为JDK8之后,方法区的落地实现(元空间)使用的是本地的直接内存,因此对直接内存要有所了解。直接内存不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。直接内存是在Java堆外的、直接向系统申请的内存区间。来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存通常,访问直接内存的速度会优于Java堆。即读写性能高。因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。Java的NIO库允许Java程序使用直接内存,用于数据缓冲区原创 2020-08-10 22:46:19 · 355 阅读 · 0 评论 -
详解Java虚拟机之执行引擎
概述执行引擎属于JVM的下层,里面包括 解释器、及时编译器、垃圾回收器执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价原创 2020-08-11 19:14:52 · 853 阅读 · 0 评论 -
从JVM的角度来深入剖析一下String类
String的基本特性String的基本特性String:字符串,使用一对 ”” 引起来表示String s1 = "hello" ; // 字面量的定义方式String s2 = new String("hello");String 是声明为final的,不可被继承String 实现了Serializable接口:表示字符串是支持序列化的。String 实现了Comparable接口:表示String可以比较大小String 在 JDK8 及以前内部定义了final char[]原创 2020-08-12 18:58:35 · 226 阅读 · 0 评论 -
这么多人问的JVM的垃圾回收到底是个啥?
概述这次我们主要关注的是黄色部分,内存的分配与回收众所周知,Java 和 C++语言的区别,就在于垃圾收集技术和内存动态分配上,C语言没有垃圾收集技术,需要我们手动的收集。垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。 关于垃圾收集有三个经典问题:哪些内存需要回收?什么时候回收?如何回收?垃圾收集机制是 Java 的招牌能力,极大地提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展原创 2020-08-14 10:24:17 · 851 阅读 · 0 评论 -
详解JVM中的经典7种垃圾回收器(Garbage Collector)
@TOC垃圾收集器分类与性能指标概述垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。从不同角度分析垃圾收集器,可以将GC分为不同的类型。小技巧学Java不同版本新特性语法层面:Lambda表达式、switch、自动拆箱装箱、enum、泛型等API层面:Stream API、新的日期时间、Optional、String、集合框架底层优化:JVM优化、GC的变化、元空间、静态域原创 2020-08-14 22:38:42 · 3338 阅读 · 1 评论