深入浅出JVM虚拟机
文章平均质量分 94
流烟默
这个作者很懒,什么都没留下…
展开
-
JVM运行时数据区之堆空间
所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)。堆针对一个JVM进程来说是唯一的,也就是一个进程只有一个JVM,但是进程包含多个线程,他们是共享同一堆空间的。Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。原创 2024-08-16 16:04:49 · 310 阅读 · 0 评论 -
JVM运行时数据区之本地方法接口和本地方法栈
简单地讲,。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "c"告知c++编译器去调用一个c的函数。“A native method is a Java method whose implementation is provided by non-java code.”(本地方法是一个非Java的方法,它的具体实现是非Java代码的实现)原创 2024-08-16 10:34:13 · 881 阅读 · 0 评论 -
JVM运行时数据区之虚拟机栈
如果采用固定大小的Java虚拟机栈,那每一个线程的Java虚拟机栈容量可以在线程创建的时候独立选定。如果Java虚拟机栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那Java虚拟机将会抛出一个 OutOfMemoryError 异常。主管Java程序的运行,它保存方法的局部变量(8种基本数据类型、对象的引用地址)、部分结果,并参与方法的调用和返回。栈是线程私有的,生命周期和线程一致,也就是线程结束了,该虚拟机栈也销毁了。原创 2024-08-13 09:18:43 · 658 阅读 · 0 评论 -
JVM运行时数据区之程序计数器(PC寄存器)
程序计数器,又名PC寄存器。JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。这里并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。原创 2024-08-05 15:47:30 · 261 阅读 · 0 评论 -
JVM类加载中的双亲委派机制
Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式,即把请求交由父类处理,它是一种任务委派模式。原创 2024-08-05 15:05:40 · 1137 阅读 · 0 评论 -
认真学习JVM几种类加载器
JVM支持两种类型的类加载器。分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader)(JVM规范这样定义的)。这里的四者之间是包含关系,不是上层和下层,也不是子系统的继承关系。其中System Class Loadder就是常见的AppClassLoader。从概念上来讲,自定义类加载器一般指的是程序中由开发人员自定义的一类类加载器,但是Java虚拟机规范却没有这么定义,而是将。都划分为自定义类加载器。原创 2024-08-05 10:29:44 · 410 阅读 · 0 评论 -
认真学习JVM中类加载过程
本文我们总结JVM中类加载器子系统关于类加载过程,这里默认是Oracle的Hotspot。原创 2024-08-02 16:31:52 · 675 阅读 · 0 评论 -
JVM结构、架构与生命周期总结
HotSpot VM是目前市面上高性能虚拟机的代表作之一。它采用解释器与即时编译器并存的架构。在今天,Java程序的运行性能早已脱胎换骨,已经达到了可以和C/C++程序一较高下的地步。执行引擎包含三部分:解释器,及时编译器,垃圾回收器。原创 2024-08-01 17:14:27 · 436 阅读 · 0 评论 -
Java里强引用、软引用、弱引用、幻引用区别总结
在Java中,引用类型决定了对象的生命周期以及垃圾收集器如何处理这些对象。这里有四种引用类型:强引用、软引用、弱引用和幻象引用(也称虚引用)。这四种引用类型提供了不同程度的控制,使得开发人员能够更精细地管理对象的生命周期和内存使用。原创 2024-06-12 10:44:53 · 1081 阅读 · 0 评论 -
【每日一面】关于JVM
① Java文件分为几种形态?两种,静态和动态。注解保留策略RetentionPolicy与Java文件不同形式:Source:只在源码阶段出现,如果编译成class之后就被丢弃(静态文件)。Class:编译阶段保留,运行阶段就会被丢弃(静态文件)Runtime:运行阶段和class文件都能获取到注解(动态文件)② Java 是如何在保证可移植性的前提下提供高执行效率的?J...原创 2019-01-17 15:06:30 · 500 阅读 · 2 评论 -
Java的三大特性之封装、继承和多态详解
面向对象编程有三大特性:封装、继承、多态。【1】封装封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。对于封装而言,一个对象它所封装的是自己的属性和方法,所以它是不需要依赖其他对象就可以完成自己的操作。使用封装有几大好处:良好的封装能够减少耦合。类内部的结构可以自由修改。可以对成员进...原创 2019-01-15 19:23:08 · 3836 阅读 · 0 评论 -
JVM调优总结(一)之参数配置说明与实例
本篇博文记录JVM调优中的那些琐碎的参数配置,并不断更新。【1】堆设置JDK1.8中默认堆空间和元数据示意图如下:Heap是大家最为熟悉的区域,是jvm用来存储对象实例的区域,Heap在32位的系统中最大为2G。其大小通过-Xms(最小值)和-Xmx(最大值)参数设置,-Xms为JVM启动时申请的最小内存,默认为操作系统物理内存的1/64但小于1G;-Xmx为JVM可申请的最大内存,默认为...原创 2019-01-03 10:13:28 · 2334 阅读 · 1 评论 -
深入分析JVM中线程的创建和运行原理
【1】基础知识JVM中的线程是和OS中的线程一一对应的,操作系统负责调度所有的线程,因此在不同的平台上,Java线程的优先级有所不同。在JVM中除了应用线程,还有其他的一些线程用于支持JVM的运行,这些线程可以被划分为以下几类:VM Thread:负责JVM在安全点内的各种操作,这些操作(诸如自动内存管理、取消偏向锁、线程dump、线程挂起等等)在执行过程中需要JVM处于这样一个状态——堆...转载 2019-01-07 19:19:30 · 5409 阅读 · 0 评论 -
一文读懂Synchronized的实现原理
在多线程并发编程中 Synchronized 一直是元老级角色,很多人都会称呼它为重量级锁,但是随着 Java SE1.6 对 Synchronized 进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了 Java SE1.6 中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必...转载 2019-01-14 22:07:02 · 1251 阅读 · 1 评论 -
认真学习Java中线程实现和调度
并发不一定要依赖多线程(如PHP中很常见的多进程并发),但是在Java里面谈论并发,大多数与线程脱不开关系。线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件I/O等),又可以独立调度(线程是CPU调度的基本单位)。主流的操作系统都提供了线程实现,Java语言则提供了在不同硬件和操作系统平台下对线程操作的统一处理,每个已经执行start()且还未结束的java.lang.Thread类的实例就代表了一个线程。thread原创 2019-02-03 18:53:32 · 744 阅读 · 0 评论 -
深入学习JVM垃圾回收器之CMS
先看一些问题:CMS出现的初衷、背景和目的?CMS的适用场景?CMS的trade-off是什么?优势、劣势和代价CMS会回收哪个区域的对象?CMS的GC Roots包括那些对象?CMS的过程?CMS和Full gc是不是一回事?CMS何时触发?CMS的日志如何分析?CMS的调优如何做?CMS扫描那些对象?CMS和CMS col...转载 2019-01-29 17:41:42 · 3381 阅读 · 0 评论 -
认真学习JVM中的内存泄漏
Java的核心优势之一是在内置垃圾收集器(简称GC)的帮助下实现自动内存管理。GC隐含地负责分配和释放内存,因此能够处理大多数内存泄漏问题。虽然GC有效地处理了大部分内存,但它并不能成为保证内存泄漏的万无一失的解决方案。GC很聪明,但并不完美。即使在尽职尽责的开发人员的应用程序中,内存仍然可能会泄漏。仍然可能存在应用程序生成大量多余对象的情况,从而耗尽关键内存资源,有时会导致整个应用程序失败。...转载 2019-02-09 15:11:46 · 949 阅读 · 0 评论 -
聊聊JVM中那些垃圾收集器
垃圾收集算法是内存回收的方法论,垃圾收集器是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何事先并没有任何规定,故而不同厂商、不同版本的虚拟机所提供的垃圾收集器可能会有很大差别。本文分享的收集器是基于JDK1.7之后的HotSpot虚拟机,这个虚拟机所包含的所有收集器如图所示:连线表示两个收集器可以搭配使用,虚拟机所在的区域表示它是属于新生代还是老年代收集器(上面是新生代,下面是老...原创 2019-01-30 18:03:23 · 966 阅读 · 0 评论 -
一个超乎想象的垃圾收集器:ZGC
Z Garbage Collector,即ZGC,是一个可伸缩的、低延迟的垃圾收集器,主要为了满足如下目标进行设计:停顿时间不会超过10ms停顿时间不会随着堆的增大而增大(不管多大的堆都能保持在10ms以下)可支持几百M,甚至几T的堆大小(最大支持4T)停顿时间在10ms以下,10ms其实是一个很保守的数据,在SPECjbb 2015基准测试,128G的大堆下最大停顿时间才1.68ms...转载 2019-02-13 10:44:18 · 1151 阅读 · 0 评论 -
认真学习JVM的方法调用(方法重载和重写)
方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程。Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(相当于直接引用)。这个特性给Java带来了更强大的动态扩展能力,但也使得Java方法调用过程变得相对复杂起来,需要在...原创 2019-03-06 11:21:46 · 1151 阅读 · 0 评论 -
JVM调优工具之jstack
jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。线程出现停顿的时候通过jstack来查看各个线程...原创 2019-03-04 11:28:39 · 788 阅读 · 0 评论 -
Java中常见的访问/非访问修饰符
Java中有下列访问修饰符:private:私有变量和方法(非外部类)只能被声明它们的类的实例所使用。default:类中的数据、方法和它本身能够被声明为默认default。类中所有default成员都可以被本包中的其它类所访问。protected:相比default有更高的访问权限。只有成员变量和方法能够被声明为protected。父类的protected属性能被它的所有子类所共享。即使子类和父类原创 2017-10-17 10:59:40 · 2363 阅读 · 0 评论 -
深入学习新一代垃圾收集器G1
【1】G1 基础① 垃圾回收的瓶颈传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限。但是他无法解决的一个问题,就是Full GC所带来的应用暂停。在一些对实时性要求很高的应用场景下,GC暂停所带来的请求堆积和请求失败是无法接受的。这类应用可能要求请求的返回时间在几百甚至几十毫秒以内,如果分代垃圾回收方式要达到这个指标,只能把最大堆的设置限...转载 2019-01-07 09:57:14 · 1146 阅读 · 0 评论 -
聊聊JVM中分代垃圾回收(收集)器
【1】为什么要分代?分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比如Http请求中的Session对象、线程、Socket连接,这类对象跟业务直接挂钩,因此生命周期比较长。但是还有一些对象,主要是程序运行过程中生成的临时变量,...转载 2019-01-06 13:03:44 · 3707 阅读 · 0 评论 -
Trembling ! Java类的加载过程详解(加载验证准备解析初始化使用卸载)
【1】类的生命周期一个类从加载进内存到卸载出内存为止,一共经历7个阶段:加载—>验证—>准备—&am原创 2018-09-01 09:04:39 · 2355 阅读 · 0 评论 -
Very Heavy ! Java虚拟机的垃圾回收处理与垃圾收集算法
Java虚拟机的内存模型分为五个部分,分别是程序计数器、Java虚拟机栈、本地方法栈、堆和方法区。这五个区域既然是存储空间,那么为了避免Java虚拟机在运行期间内存存满的情况,就必须得有一个垃圾收集者的角色,不定期地回收一些无效内存,以保障Java虚拟机能够健康地持续运行。这个垃圾收集者就是平常我们所说的“垃圾收集器”,那么垃圾收集器在何时清扫内存?清扫哪些数据?Follow me !...原创 2018-08-28 15:12:03 · 674 阅读 · 0 评论 -
Java中静态代码块、构造方法、代码块、父类与子类之间执行顺序及父类子类实例化对象
PS:今天群里一个小伙伴笔试,匆匆发来的求助信息。。。1.父类、子类之间代码块与构造方法public class HelloA { public HelloA(){ System.out.println("HelloA"); } {System.out.println(&原创 2016-09-21 16:20:45 · 5814 阅读 · 0 评论 -
Come on ! Java对象内存分配与回收策略
Java所承诺的自动内存管理主要是针对对象内存的回收和对象内存的分配。在Java虚拟机的五块内存空间中,程序计数器、Java虚拟机栈、本地方法栈内存的分配和回收都具有确定性。一般都在编译阶段就能确定下来需要分配的内存大小,并且由于都是线程私有,因此它们的内存空间都随着线程的创建而创建,线程的结束而回收。也就是说这三个区域的内存分配和回收都具有确定性。而Java虚拟机中的方法区因为是用来存储...原创 2018-08-28 09:18:47 · 858 阅读 · 0 评论 -
细探究,Java对象创建过程和访问的奥秘
【1】对象创建的过程当虚拟机遇到一条含有“new”的指令时,会进行一系列对象创建的操作。① 检查常量池中是否有即将要创建的这个对象所属的类的符号引用若常量池中没有这个类的符号引用,说明这个类还没有被定义,抛出ClassNotFoundException。若常量池中有这个类的符号引用,则进行下一步工作。② 检查这个符号引用所代表的类是否已经被JVM加载若该类还没有被加载,...原创 2018-08-27 17:36:37 · 917 阅读 · 0 评论 -
Java的接口、类、属性、方法的修饰符使用总结
【1】接口的修饰符接口的修饰符只有:public。接口中的方法都为抽象方法,子类必须实现这些方法。【2】类的修饰符类的修饰符分为:可访问控制符和非访问控制符两种。可访问控制符是:公共类修饰符 public非访问控制符有:抽象类修饰符 abstract ;最终类修饰符 final① 公共类修饰符 public Java 语言中类 的可访问控制符只有一个: pu...原创 2018-08-30 17:32:46 · 3277 阅读 · 0 评论 -
JDK,JRE,JVM区别与联系
安装的时候JDK自带了JRE,故我们只需要安装JDK即可。【1】JDKJDK : Java Development ToolKit(Java开发工具包)。JDK是整个JAVA的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。JDK中包含JRE,在JDK的安装原创 2017-09-21 14:32:06 · 1058 阅读 · 0 评论 -
JVM中Class文件结构详解
【1】JVM 的“无关性”Java具有平台无关性,也就是任何操作系统都能运行Java代码。之所以能实现这一点,是因为Java运行在虚拟机上,不同的操作系统都拥有各自的Java虚拟机,因此Java能实现“一次编写,处处运行”。而JVM不仅具有平台无关性,还具有语言无关性。平台无关性是指不同的操作系统都有各自的JVM,而语言无关性是指Java虚拟机能运行除Java以外的代码。Java源...原创 2018-08-30 16:05:14 · 1135 阅读 · 1 评论 -
让人头疼的String与字符串常量池
【1】String为什么是不可变的① 只有当字符串是不可变的,字符串池才有可能实现字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串。但如果字符串是可变的,那么String interning将不能实现(译者注:String intern是指对不同的字符串仅仅只保存一个,即不会保存多个相同的字符串。),因为这样的话,如果变量改变了它的值,那么其...原创 2018-09-02 16:18:50 · 1228 阅读 · 0 评论 -
常量池技术是个什么鬼
【1】Integer的小坑先看个示例: public static void main(String[] args) { Integer a = 10; Integer b = 10; Integer c = 200; Integer d = 200; System.out.println(a==b);//...原创 2018-09-02 18:42:33 · 1214 阅读 · 0 评论 -
JDK各个版本发布时间和版本名称
版本名称发行日期JDK 1.0Oak(橡树)1996-01-23JDK 1.11997-02-19JDK 1.1.4Sparkler(宝石)1997-09-12JDK 1.1.5Pumpkin(南瓜)1997-12-13JDK 1.1.6Abigail(阿比盖尔–女子名)1998-04-24JDK 1.1.7Brutus(布...原创 2018-12-26 11:12:38 · 36750 阅读 · 2 评论 -
一个Java对象到底占用多大内存
做JVM调优,做内存监控与优化,但是一个Java对象到底占用多大内存空间呢?细探究,Java对象创建的奥秘一文中讲述了Java对象的内存布局:对象头(Header),实例数据(Instance Data)和对齐填充(Padding)。另外:不同的环境结果可能有差异,我所在的环境是HotSpot虚拟机,64位Windwos。在网上搜到了一篇博客讲的非常好:http://yueyemaitian....转载 2019-01-04 16:02:42 · 7281 阅读 · 3 评论 -
JDK1.5,1.6,1.7,1.8,1.9,1.10,1.11的新特性整理
JDK1.5,1.6,1.7,1.8,1.9,1.10,1.11的新特性整理原创 2018-12-19 11:50:45 · 8485 阅读 · 1 评论 -
JDK1.8新特性(二)
继上篇博文JDK1.8新特性(一)后,继续学习。Java8中有两大最为重要的改变。第一个是Lambda 表达式;另外一个则是Stream API(java.util.stream.*)。Stream 是Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用SQL 执行的数据...原创 2018-12-18 10:17:33 · 863 阅读 · 0 评论 -
深入学习Java内存模型JMM
【1】JMM简介① JMMJava内存模型简称JMM(Java Memory Model),是Java虚拟机所定义的一种抽象规范,用来屏蔽不同硬件和操作系统的内存访问差异,让java程序在各种平台下都能达到一致的内存访问效果。② 主内存(Main Memory)主内存可以简单理解为计算机当中的内存(一部分),但又不完全等同。主内存被所有的线程所共享,对于一个共享变量(比如静态变量,或是堆...转载 2018-12-28 12:22:10 · 1372 阅读 · 0 评论 -
查看java文件汇编代码与字节码
【1】命令与虚拟机参数ThreadDemo源码如下:class ThreadDemo implements Runnable{ // 这里,使用volatile修饰flag private volatile boolean flag = false; @Override public void run() { try { ...原创 2018-12-28 11:07:07 · 2656 阅读 · 0 评论