随笔分类 - jvm相关
摘要:## 1. 概述 类加载器是 JVM 执行类加载机制的前提 ClassLoader 的作用: ClassLoader 是 Java 的核心组件,所有的 Class 都是由 ClassLoader 进行加载的,ClassLoader 负责通过各种方式将 Class 信息的二进制数据流读入 JVM 内
        阅读全文
                
摘要:## 1. 概述 在 Java 中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚 拟机预先定义,引用数据类型则需要进行类的加载 按照 Java 虚拟机规范,从 Class 文件到加载到内存中的类,到类卸载出内 存位置,它的整个生命周期包括如下七个阶段: 其中,验证、准备、解析 3 个部分
        阅读全文
                
摘要:## 1. 概述 官方文档:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html Java 字节码对于虚拟机,就好像汇编语言对于计算机,属于基本执行命令 Java 虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字 (
        阅读全文
                
摘要: 1. 相关概念 1.1字节码文件的跨平台性 Java 语言是跨平台的(write once, run anywhere) 当 Java 源代码成功编译成字节码后,如果想在不同的平台上面运行, 则无须再次编译 但是 这个优势不再那么吸引人了。Python、PHP、Perl、Ruby、Lisp 等有
        阅读全文
                
摘要:JVM指令手册 一、栈和局部变量操作 将常量压入栈的指令 aconst_null 将null对象引用压入栈 iconst_m1 将int类型常量-1压入栈 iconst_0 将int类型常量0压入栈 iconst_1 将int类型常量1压入栈 iconst_2 将int类型常量2压入栈 iconst
        阅读全文
                
摘要:1. 垃圾回收器的分类 和 GC性能指标 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。 由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。 从不同角度分析垃圾收集器,可以将GC分为不同的类型。 1.1 分类 按线程数分(垃圾回收线程
        阅读全文
                
摘要:1. System.gc() 的理解 在默认情况下,通过System.gc()者Runtime.getRuntime().gc()(前者的底层就是后者)的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。 然而System.gc()调用附带一个免责声明,无法
        阅读全文
                
摘要:1. 标记阶段算法 简单来说,垃圾回收 分成两步, 第一步找出垃圾,第二步进行回收,而标记阶段使用的算法,就是 为了找出谁是垃圾 在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。 只有被标记为己经死亡的对象,GC才会在执行垃圾
        阅读全文
                
摘要:1. 垃圾回收概述 背景 Java 和 C++语言的区别,就在于垃圾收集技术和内存动态分配上,C语言没有垃圾收集技术,需要我们手动的收集。 垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。 关于垃圾收集有三个经典问题: 哪些内存需要回
        阅读全文
                
摘要:1. String的基本特性 String:字符串,使用一对 “” 引起来表示 String s1 = "mogublog" ; // 字面量的定义方式 String s2 = new String("moxi"); // new 对象的方式 String声明为final的,不可被继承 String
        阅读全文
                
摘要:1. 执行引擎概述和基本执行过程 1.1 概述 在前面的博文中, 已经对 类的加载,和加载后类的运行时数据区进行说明,但是 我们的java程序是运行在jvm中的,而我们的字节码指令并不能直接被操作系统所识别, 这个时候就需要 执行引擎登场了. 执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是
        阅读全文
                
摘要:我们知道 在jdk8 之后,Hotspot 将 方法区的实现改为元空间,直接使用本地内存,下面就来详细了解一下 1. 直接内存的概述 不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。 直接内存是在Java堆外的、直接向系统申请的内存区间。 起源于NIO,通过存在堆中的D
        阅读全文
                
摘要:1. 对象的实例化 1.1 对象的实例化方式 new:最常见的方式,直接new 或者 单例模式的 getInstance 方法等 Class的newInstance方法:反射方式, 在JDK9里面被标记为过时的方法,因为只能调用空参构造器,并且权限必须为 public Constructor的new
        阅读全文
                
摘要:1. 栈 堆 方法区的交互关系 前面的文章中已经了解了 栈 ,堆, java 运行时区中另一个非常重要的区域就是 方法区 那么这三者又有什么关系呢? 与线程共享与否的角度 从Person person = new Person(); 看 Person 类的 .class 信息存放在方法区中 pers
        阅读全文
                
摘要:1. 堆的核心概述 1.1 概述 堆针对一个JVM进程来说是唯一的,也就是一个进程只有一个JVM ,但是进程包含多个线程,他们是共享同一堆空间的, 前面所学习到的 程序计数器 本地方法栈, 虚拟机栈, 是每个线程独立占有的一份, 而 堆空间 和后面所说的 方法区, 则是 所有线程共享的, 如下图 ,
        阅读全文
                
摘要:1 本地方法 简单地讲,一个Native Method是一个Java调用非Java代码的接囗 一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C。 这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C中,你可以用extern 告知C编译器去
        阅读全文
                
摘要:1.概述 说到jvm 其中让人印象最深的就是栈和堆,也是 jvm中占用内存最大的两个地方. 从宏观上来看栈是运行时的单位,而堆是存储的单位 ,栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放,放哪里. 那么对于 jvm来说 , 运行时数据的结构为什么要
        阅读全文
                
摘要:1. 概述 JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。这也是有人称他为 程序寄存器的原因 这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器
        阅读全文
                
摘要:1. 运行时数据区概述 前面的章节中已经将类的加载过程大致过程说清楚了,此时类已经加载到内存中,,后面就是运行时数据区的各个组件的工作了 由上图可以看出来, jvm将class字节码加载完成后,后面运行的大部分工作都是在运行时数据区中完成,也就是电脑内存中,也更加复杂, jvm中的垃圾回收 针对的也
        阅读全文
                
摘要:1. jvm内存结构概述 jvm运行,有哪些重要的 组件,如下图 共可分成三个大类 将class 文件 加载到内存的 加载系统 class 存储区域,程序运行时内存 jvm读取class字节码,执行解释class命令的 执行引擎 下面挨个说明 2. 类加载子系统 当我们把 代码写完,编译成字节码 c
        阅读全文
                

 浙公网安备 33010602011771号
浙公网安备 33010602011771号