![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
文章平均质量分 89
高山流水遇知音_
这个作者很懒,什么都没留下…
展开
-
深入理解JAVA虚拟机系列——JVM的类装载子系统
在JAVA虚拟机中,负责查找并装载类型的那部分被称为类装载子系统。 JAVA虚拟机有两种类装载器:启动类装载器和用户自定义类装载器。前者是JAVA虚拟机实现的一部分,后者则是Java程序的一部分。由不同的类装载器装载的类将被放在虚拟机内部的不同命名空间中。 类装载器子系统涉及Java虚拟机的其他几个组成部分,以及几个来自java.lang库的类。比如,用户自定义的类装载器是普通的Jav...原创 2018-06-04 09:54:27 · 199 阅读 · 0 评论 -
深入了解Java虚拟机系列——JVM的启动流程
JVM工作原理和特点主要是指操作系统装入JVM,是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境.1.创建JVM装载环境和配置2.装载JVM.dll3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例4.调用JNIEnv实例装载并处理class类。一.JVM装入环境,JVM提供的方式是操作系统的动态连接文件.既然是文件那就一个装入路径的问题,Java是怎么找这个路径...原创 2018-06-01 11:55:21 · 2303 阅读 · 3 评论 -
深入理解Java虚拟机——JVM的生命周期
package test; public class JVMTestLife { public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { ...原创 2018-06-01 14:07:46 · 264 阅读 · 0 评论 -
深入理解Java虚拟机系列——JVM的基本结构
首先,当一个程序启动之前,它的class会被类装载器装入方法区,执行引擎读取方法区的字节码自适应解析,边解析就边运行(其中一种方式),然后pc寄存器指向了main函数所在位置,虚拟机开始为main函数在java栈中预留一个栈帧(每个方法都对应一个栈帧),然后开始跑main函数,main函数里的代码被执行引擎映射成本地操作系统里相应的实现,然后调用本地方法接口,本地方法运行的时候,操纵系统会...原创 2018-06-01 14:39:01 · 189 阅读 · 0 评论 -
深入理解Java虚拟机系列——JVM的栈内存
每当启动一个新线程时,Java虚拟机都会为它分配一个Java栈。Java栈以帧为单位保存线程的运行状态。虚拟机只会直接对Java栈执行两种操作:以帧为单位的压栈和出栈。 某个线程正在执行的方法被称为该线程的当前方法,当前方法使用的栈帧称为当前帧,当前方法所属的类称为当前类,当前类的常量池称为当前常量池。在线程执行一个方法时,它会跟踪当前类和当前常量池。此外,当虚拟机遇到栈内操作指令时,它...原创 2018-06-01 15:00:15 · 889 阅读 · 1 评论 -
深入理解Java虚拟机系列——JVM的GC理论详解
GC的概念 GC:Garbage Collection 垃圾收集。这里所谓的垃圾指的是在系统运行过程当中所产生的一些无用的对象,这些对象占据着一定的内存空间,如果长期不被释放,可能导致OOM(堆溢出)。内存区域中的程序计数器、虚拟机栈、本地方法栈这3个区域随着线程而生,线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈的操作,每个栈帧中分配多少内存基本是在类结构确定下来时就...原创 2018-06-01 15:25:51 · 1252 阅读 · 0 评论 -
深入理解Java虚拟机——JVM的GC实现详解
新生代中的98%对象都是“朝生夕死”的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块比较大的Eden空间和两块较小的Survivor空间,每次使用Eden和其中一块Survivor。当回收时,将Eden和Survivor中还存活着的对象一次性地复制到另外一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间。HotSpot虚拟机默认Eden和Sur...原创 2018-06-01 15:39:14 · 781 阅读 · 0 评论 -
深入理解Java虚拟机——JVM的类加载机制
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 类加载的规则:全盘负责,当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入父类委托,先让父类加载器试图加载该类,只有在父类加载器无法加载该类时才尝试从自...原创 2018-06-01 16:04:29 · 295 阅读 · 0 评论 -
深入理解Java虚拟机系列——JVM常用参数配置
Trace跟踪参数-verbose:gc -XX:+printGC 打印GC的简要信息-XX:+PrintGCDetails 打印GC详细信息-XX:+PrintGCTimeStamps 打印CG发生的时间戳-Xloggc:log/gc.log 指定GC log的位置,以文件输出XX:+TraceClassLoading 监控类的加载-XX:+PrintClassHistogram ...原创 2018-06-01 16:10:45 · 169 阅读 · 0 评论 -
深入理解Java虚拟机系列(1)——什么叫做JVM与JVM规范
引言 (1)内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑。不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓狂的内存溢出和泄露的问题。 (2)可怕的事情还不只如此,有些使用其它语言开发的程序员,给JAVA程序员扣上了一个“不懂内存”的帽子,这着实有点让人难以接受。毕竟JAVA当中没有m...原创 2018-06-01 11:26:01 · 1713 阅读 · 4 评论 -
Java虚拟机常见的问题解决(一)
错误:Error: Could not create the Java Virtual Machine.Error: A fatal exception has occurred. Program will exit.Conflicting collector combinations in option list; please refer to the release notes for th...原创 2018-06-07 15:56:08 · 2317 阅读 · 0 评论 -
深入理解Java虚拟机系列——Java虚拟机OOM之方法区溢出
方法区用于存放 Class 的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等。 对于这个区域的测试,基本的思路是运行时产生大量的类去填满方法区,直到溢出。虽然直接使用 JavaSE API 也可以动态产生类(如反射时的GeneratedConstructorAccessor 和动态代理等),但在本次实验中操作起来比较麻烦。在代码清单 2-5 中,笔者借助 CGLib①直接操作字节码运行...转载 2018-06-05 11:07:58 · 641 阅读 · 0 评论 -
深入理解Java虚拟机系列——JVM的类装载子系统
在JAVA虚拟机中,负责查找并装载类型的那部分被称为类装载子系统。 JAVA虚拟机有两种类装载器:启动类装载器和用户自定义类装载器。前者是JAVA虚拟机实现的一部分,后者则是Java程序的一部分。由不同的类装载器装载的类将被放在虚拟机内部的不同命名空间中。 类装载器子系统涉及Java虚拟机的其他几个组成部分,以及几个来自java.lang库的类。比如,用户自定义的类装载器是普通的Java...原创 2018-06-04 09:57:37 · 262 阅读 · 0 评论 -
深入理解Java虚拟机系列——JVM的堆分配
为了展示虚拟机如何使用方法区中的信息,下面来举例说明:class Lava { private int speed = 5; void flow(){ }} public class Volcano { public static void main(String[] args){ Lava lava = new L...原创 2018-06-04 10:08:01 · 207 阅读 · 0 评论 -
深入理解JAVA虚拟机——JVM的本地方法栈
对于一个运行中的Java程序而言,它还可能会用到一些跟本地方法相关的数据区。当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。本地方法可以通过本地方法接口来访问虚拟机的运行时数据区,但不止如此,它还可以做任何它想做的事情。 本地方法本质上时依赖于实现的,虚拟机实现的设计者们可以自由地决定使用怎样的机制来让Java程序调用本地方法。 任何本地方法接口都会使用某...原创 2018-06-04 10:11:10 · 1099 阅读 · 0 评论 -
深入理解JAVA虚拟机——JVM的类加载时机
类加载过程中每个步骤的顺序我们已经知道,类加载的过程包括:加载、连接、初始化,连接又分为:验证、准备、解析,所以说类加载一共分为5步:加载、验证、准备、解析、初始化。其中加载、验证、准备、初始化的开始顺序是依次进行的,这些步骤开始之后的过程可能会有重叠。 而解析过程会发生在初始化过程中。 类加载过程中“初始化”开始的时机JVM规范中只定义了类加载过程中初始化过程开始的时机,加载、连接过程都应该在初...原创 2018-06-04 10:17:02 · 162 阅读 · 0 评论 -
深入理解Java虚拟机系列——Class文件结构
今天来写一写.class文件的格式,学习Java虚拟机一段时间后,发现其实对class文件并不是很了解,但是这的确是虚拟机环节中重要的一部分,了解class文件的结构对了解java虚拟机有更深的体会。 简单介绍一下Class类文件结构(常量池主要存放的是那两大常量?Class文件的继承关系是如何确定的?字段表、方法表、属性表主要包含那些信息?)1 概述 计算机虽然只能识别0和...原创 2018-06-04 14:20:56 · 329 阅读 · 0 评论 -
深入理解Java虚拟机系列——内存溢出跟内存泄露的区别
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。memory leak会最终会导致out of memory! 以发生的方式来分类,内存泄漏可以分为4类: 1. ...原创 2018-06-05 10:36:37 · 905 阅读 · 0 评论 -
Java虚拟机OutOfMemoryError 异常详解及解决方法
上图是一张Java运行时的内存分布图,可知虚拟机内存都有发生OutOfMemoryError(下文称 OOM)异常的可能,作为一个合格的Java开发人员,我们应该做到的是:(1)第一,通过代码验证 Java 虚拟机规范中描述的各个运行时区域储存的内容; (2)第二,遇到内存溢出的时候,应该可以找打具体的位置,并进行合理的解决;下边就聊一下 OOM:一、Java 堆溢出我们知道Java 堆用于储存对...原创 2018-06-05 10:42:26 · 1362 阅读 · 0 评论 -
Java虚拟机OOM之虚拟机栈和本地方法栈溢出
一、在 Java 虚拟机规范中,对虚拟机栈这个区域规定了两种异常状况:(1)如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError 异常; (2)如果虚拟机栈可以动态扩展(当前大部分的 Java 虚拟机都可动态扩展,只不过 Java 虚拟机规范中也允许固定长度的虚拟机栈),当扩展时无法申请到足够的内存时会抛出 OutOfMemoryError 异常。 (3)与虚拟机...转载 2018-06-05 10:52:27 · 1493 阅读 · 0 评论 -
深入理解JAVA虚拟机——JVM的数据类型(以及按引用传递法则)
Java虚拟机是通过某些数据类型来执行计算的,数据类型可以分为两种:基本类型和引用类型,基本类型的变量持有原始值,而引用类型的变量持有引用值。 Java语言中的所有基本类型同样也都是Java虚拟机中的基本类型。但是boolean有点特别,虽然Java虚拟机也把boolean看做基本类型,但是指令集对boolean只有很有限的支持,当编译器把Java源代码编译为字节码时,它会用int或者byt...原创 2018-06-01 16:23:51 · 1589 阅读 · 1 评论