![](https://img-blog.csdnimg.cn/20191012143453839.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
深入浅出JVM虚拟机
文章平均质量分 93
流烟默
这个作者很懒,什么都没留下…
展开
-
Java里强引用、软引用、弱引用、幻引用区别总结
在Java中,引用类型决定了对象的生命周期以及垃圾收集器如何处理这些对象。这里有四种引用类型:强引用、软引用、弱引用和幻象引用(也称虚引用)。这四种引用类型提供了不同程度的控制,使得开发人员能够更精细地管理对象的生命周期和内存使用。原创 2024-06-12 10:44:53 · 1009 阅读 · 0 评论 -
【每日一面】关于JVM
① Java文件分为几种形态?两种,静态和动态。注解保留策略RetentionPolicy与Java文件不同形式:Source:只在源码阶段出现,如果编译成class之后就被丢弃(静态文件)。Class:编译阶段保留,运行阶段就会被丢弃(静态文件)Runtime:运行阶段和class文件都能获取到注解(动态文件)② Java 是如何在保证可移植性的前提下提供高执行效率的?J...原创 2019-01-17 15:06:30 · 477 阅读 · 2 评论 -
Java的三大特性之封装、继承和多态详解
面向对象编程有三大特性:封装、继承、多态。【1】封装封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。对于封装而言,一个对象它所封装的是自己的属性和方法,所以它是不需要依赖其他对象就可以完成自己的操作。使用封装有几大好处:良好的封装能够减少耦合。类内部的结构可以自由修改。可以对成员进...原创 2019-01-15 19:23:08 · 3770 阅读 · 0 评论 -
认真学习Java中线程实现和调度
并发不一定要依赖多线程(如PHP中很常见的多进程并发),但是在Java里面谈论并发,大多数与线程脱不开关系。线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件I/O等),又可以独立调度(线程是CPU调度的基本单位)。主流的操作系统都提供了线程实现,Java语言则提供了在不同硬件和操作系统平台下对线程操作的统一处理,每个已经执行start()且还未结束的java.lang.Thread类的实例就代表了一个线程。thread原创 2019-02-03 18:53:32 · 726 阅读 · 0 评论 -
深入学习新一代垃圾收集器G1
【1】G1 基础① 垃圾回收的瓶颈传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限。但是他无法解决的一个问题,就是Full GC所带来的应用暂停。在一些对实时性要求很高的应用场景下,GC暂停所带来的请求堆积和请求失败是无法接受的。这类应用可能要求请求的返回时间在几百甚至几十毫秒以内,如果分代垃圾回收方式要达到这个指标,只能把最大堆的设置限...转载 2019-01-07 09:57:14 · 1125 阅读 · 0 评论 -
聊聊JVM中分代垃圾回收(收集)器
【1】为什么要分代?分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比如Http请求中的Session对象、线程、Socket连接,这类对象跟业务直接挂钩,因此生命周期比较长。但是还有一些对象,主要是程序运行过程中生成的临时变量,...转载 2019-01-06 13:03:44 · 3518 阅读 · 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 · 36576 阅读 · 2 评论 -
一个Java对象到底占用多大内存
做JVM调优,做内存监控与优化,但是一个Java对象到底占用多大内存空间呢?细探究,Java对象创建的奥秘一文中讲述了Java对象的内存布局:对象头(Header),实例数据(Instance Data)和对齐填充(Padding)。另外:不同的环境结果可能有差异,我所在的环境是HotSpot虚拟机,64位Windwos。在网上搜到了一篇博客讲的非常好:http://yueyemaitian....转载 2019-01-04 16:02:42 · 7236 阅读 · 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 · 8344 阅读 · 1 评论 -
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 · 2277 阅读 · 1 评论 -
深入分析JVM中线程的创建和运行原理
【1】基础知识JVM中的线程是和OS中的线程一一对应的,操作系统负责调度所有的线程,因此在不同的平台上,Java线程的优先级有所不同。在JVM中除了应用线程,还有其他的一些线程用于支持JVM的运行,这些线程可以被划分为以下几类:VM Thread:负责JVM在安全点内的各种操作,这些操作(诸如自动内存管理、取消偏向锁、线程dump、线程挂起等等)在执行过程中需要JVM处于这样一个状态——堆...转载 2019-01-07 19:19:30 · 5342 阅读 · 0 评论 -
一文读懂Synchronized的实现原理
在多线程并发编程中 Synchronized 一直是元老级角色,很多人都会称呼它为重量级锁,但是随着 Java SE1.6 对 Synchronized 进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了 Java SE1.6 中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必...转载 2019-01-14 22:07:02 · 1225 阅读 · 1 评论 -
深入学习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 · 3349 阅读 · 0 评论 -
认真学习JVM中的内存泄漏
Java的核心优势之一是在内置垃圾收集器(简称GC)的帮助下实现自动内存管理。GC隐含地负责分配和释放内存,因此能够处理大多数内存泄漏问题。虽然GC有效地处理了大部分内存,但它并不能成为保证内存泄漏的万无一失的解决方案。GC很聪明,但并不完美。即使在尽职尽责的开发人员的应用程序中,内存仍然可能会泄漏。仍然可能存在应用程序生成大量多余对象的情况,从而耗尽关键内存资源,有时会导致整个应用程序失败。...转载 2019-02-09 15:11:46 · 934 阅读 · 0 评论 -
聊聊JVM中那些垃圾收集器
垃圾收集算法是内存回收的方法论,垃圾收集器是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何事先并没有任何规定,故而不同厂商、不同版本的虚拟机所提供的垃圾收集器可能会有很大差别。本文分享的收集器是基于JDK1.7之后的HotSpot虚拟机,这个虚拟机所包含的所有收集器如图所示:连线表示两个收集器可以搭配使用,虚拟机所在的区域表示它是属于新生代还是老年代收集器(上面是新生代,下面是老...原创 2019-01-30 18:03:23 · 949 阅读 · 0 评论 -
一个超乎想象的垃圾收集器:ZGC
Z Garbage Collector,即ZGC,是一个可伸缩的、低延迟的垃圾收集器,主要为了满足如下目标进行设计:停顿时间不会超过10ms停顿时间不会随着堆的增大而增大(不管多大的堆都能保持在10ms以下)可支持几百M,甚至几T的堆大小(最大支持4T)停顿时间在10ms以下,10ms其实是一个很保守的数据,在SPECjbb 2015基准测试,128G的大堆下最大停顿时间才1.68ms...转载 2019-02-13 10:44:18 · 1127 阅读 · 0 评论 -
认真学习JVM的方法调用(方法重载和重写)
方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程。Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(相当于直接引用)。这个特性给Java带来了更强大的动态扩展能力,但也使得Java方法调用过程变得相对复杂起来,需要在...原创 2019-03-06 11:21:46 · 1133 阅读 · 0 评论 -
JVM调优工具之jstack
jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。线程出现停顿的时候通过jstack来查看各个线程...原创 2019-03-04 11:28:39 · 768 阅读 · 0 评论 -
JDK1.8新特性(二)
继上篇博文JDK1.8新特性(一)后,继续学习。Java8中有两大最为重要的改变。第一个是Lambda 表达式;另外一个则是Stream API(java.util.stream.*)。Stream 是Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用SQL 执行的数据...原创 2018-12-18 10:17:33 · 831 阅读 · 0 评论 -
深入学习Java内存模型JMM
【1】JMM简介① JMMJava内存模型简称JMM(Java Memory Model),是Java虚拟机所定义的一种抽象规范,用来屏蔽不同硬件和操作系统的内存访问差异,让java程序在各种平台下都能达到一致的内存访问效果。② 主内存(Main Memory)主内存可以简单理解为计算机当中的内存(一部分),但又不完全等同。主内存被所有的线程所共享,对于一个共享变量(比如静态变量,或是堆...转载 2018-12-28 12:22:10 · 1331 阅读 · 0 评论 -
Come on ! Java对象内存分配与回收策略
Java所承诺的自动内存管理主要是针对对象内存的回收和对象内存的分配。在Java虚拟机的五块内存空间中,程序计数器、Java虚拟机栈、本地方法栈内存的分配和回收都具有确定性。一般都在编译阶段就能确定下来需要分配的内存大小,并且由于都是线程私有,因此它们的内存空间都随着线程的创建而创建,线程的结束而回收。也就是说这三个区域的内存分配和回收都具有确定性。而Java虚拟机中的方法区因为是用来存储...原创 2018-08-28 09:18:47 · 831 阅读 · 0 评论 -
细探究,Java对象创建过程和访问的奥秘
【1】对象创建的过程当虚拟机遇到一条含有“new”的指令时,会进行一系列对象创建的操作。① 检查常量池中是否有即将要创建的这个对象所属的类的符号引用若常量池中没有这个类的符号引用,说明这个类还没有被定义,抛出ClassNotFoundException。若常量池中有这个类的符号引用,则进行下一步工作。② 检查这个符号引用所代表的类是否已经被JVM加载若该类还没有被加载,...原创 2018-08-27 17:36:37 · 906 阅读 · 0 评论 -
Java中常见的访问/非访问修饰符
Java中有下列访问修饰符:private:私有变量和方法(非外部类)只能被声明它们的类的实例所使用。default:类中的数据、方法和它本身能够被声明为默认default。类中所有default成员都可以被本包中的其它类所访问。protected:相比default有更高的访问权限。只有成员变量和方法能够被声明为protected。父类的protected属性能被它的所有子类所共享。即使子类和父类原创 2017-10-17 10:59:40 · 2322 阅读 · 0 评论 -
Java的接口、类、属性、方法的修饰符使用总结
【1】接口的修饰符接口的修饰符只有:public。接口中的方法都为抽象方法,子类必须实现这些方法。【2】类的修饰符类的修饰符分为:可访问控制符和非访问控制符两种。可访问控制符是:公共类修饰符 public非访问控制符有:抽象类修饰符 abstract ;最终类修饰符 final① 公共类修饰符 public Java 语言中类 的可访问控制符只有一个: pu...原创 2018-08-30 17:32:46 · 3190 阅读 · 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 · 1017 阅读 · 0 评论 -
Java内存分配全面浅析-1
预备知识: 1.一个Java文件,只要有main入口方法,我们就认为这是一个Java程序,可以单独编译运行。 2.无论是普通类型的变量还是引用类型的变量(俗称实例),都可以作为局部变量,他们都可以出现在栈中。只不过普通类型的变量在栈中直接保存它所对应的值,而引用类型的变量保存的是一个指向堆区的指针,通过这个指针,就可以找到这个实例在堆区对应的对象。因此...转载 2016-10-28 12:58:46 · 606 阅读 · 0 评论 -
JVM内存中堆与栈的比较
1.从存放数据的角度:栈中存放的是基本类型的变量or引用类型的变量 堆中存放的是对象or数组对象. 在栈中,引用变量的大小为32位,基本类型为1-8个字节。 但是对象的大小和数组的大小是动态的,这也决定了堆中数据的动态性,因为它是在运行时动态分配内存的,生存期也不必在编译时确定,Java 的垃圾收集器会自动收走这些不再使用的数据。2.从数据共享的角度:**1).在单个线程类,栈中的原创 2016-10-28 14:27:25 · 706 阅读 · 0 评论 -
Java中静态代码块、构造方法、代码块、父类与子类之间执行顺序及父类子类实例化对象
PS:今天群里一个小伙伴笔试,匆匆发来的求助信息。。。1.父类、子类之间代码块与构造方法public class HelloA { public HelloA(){ System.out.println("HelloA"); } {System.out.println(&原创 2016-09-21 16:20:45 · 5750 阅读 · 0 评论 -
Very Heavy ! Java虚拟机的垃圾回收处理与垃圾收集算法
Java虚拟机的内存模型分为五个部分,分别是程序计数器、Java虚拟机栈、本地方法栈、堆和方法区。这五个区域既然是存储空间,那么为了避免Java虚拟机在运行期间内存存满的情况,就必须得有一个垃圾收集者的角色,不定期地回收一些无效内存,以保障Java虚拟机能够健康地持续运行。这个垃圾收集者就是平常我们所说的“垃圾收集器”,那么垃圾收集器在何时清扫内存?清扫哪些数据?Follow me !...原创 2018-08-28 15:12:03 · 658 阅读 · 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 · 2632 阅读 · 0 评论 -
JDK1.8新特性(三)使用详情
继JDK1.8新特性(一),JDK1.8新特性(二)后继续学习JDK1.8新特性。【7】Optional 类final修饰的Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用null 表示一个值不存在,现在Optional 可以更好的表达这个概念。并且可以避免空指针异常。常用方法:Optional.of(T t)原创 2018-12-19 17:36:47 · 1629 阅读 · 0 评论 -
JDK1.8新特性(一)
【1】底层数据结构改变jdk1.8 中对集合的底层结构做了调整。如HashMap从1.7的数据+链表的形式调整为数据+链表+红黑树。ConcurrentHashMap从分段机制+数组+链表+红黑树到CAS+数组+链表+红黑树。这里先简要记录,后续会详解Map的原理与区别。【2】JVM内存调整jdk1.8中去掉了方法去(永久代),使用元空间(MetaSpace)代替,后者使用直接内存(物...原创 2018-12-12 17:11:50 · 3830 阅读 · 0 评论 -
细究Java类加载机制和Tomcat类加载机制
【1】概述与分类类加载器主要分为两类,一类是 JDK 默认提供的,一类是用户自定义的。① JDK 默认提供三种类加载器Bootstrap ClassLoader 启动类加载器:每次执行 java 命令时都会使用该加载器为虚拟机加载核心类。该加载器是由 native code 实现,而不是 Java 代码,加载类的路径为 <JAVA_HOME&原创 2018-12-05 14:34:06 · 1216 阅读 · 0 评论 -
Java虚拟机的锁优化策略
【1】自旋锁① 背景互斥同步对性能最大的影响的阻塞,挂起和恢复线程都需要转入内核态中完成。并且通常情况下,共享数据的锁定状态只持续很短的一段时间,为了这很短的一段时间进行上下文切换并不值得。② 原理当一条线程需要请求一把已经被占用的锁时,并不会进入阻塞状态,而是继续持有CPU执行权等待一段时间,该过程称为“自旋”。③ 优点由于自旋等待锁的过程,线程并不会引起上下文切换,因此...原创 2018-09-06 16:25:05 · 930 阅读 · 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 · 1194 阅读 · 0 评论 -
让人头疼的String与字符串常量池
【1】String为什么是不可变的① 只有当字符串是不可变的,字符串池才有可能实现字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串。但如果字符串是可变的,那么String interning将不能实现(译者注:String intern是指对不同的字符串仅仅只保存一个,即不会保存多个相同的字符串。),因为这样的话,如果变量改变了它的值,那么其...原创 2018-09-02 16:18:50 · 1197 阅读 · 0 评论 -
JVM中Class文件结构详解
【1】JVM 的“无关性”Java具有平台无关性,也就是任何操作系统都能运行Java代码。之所以能实现这一点,是因为Java运行在虚拟机上,不同的操作系统都拥有各自的Java虚拟机,因此Java能实现“一次编写,处处运行”。而JVM不仅具有平台无关性,还具有语言无关性。平台无关性是指不同的操作系统都有各自的JVM,而语言无关性是指Java虚拟机能运行除Java以外的代码。Java源...原创 2018-08-30 16:05:14 · 1115 阅读 · 1 评论 -
Trembling ! Java类的加载过程详解(加载验证准备解析初始化使用卸载)
【1】类的生命周期一个类从加载进内存到卸载出内存为止,一共经历7个阶段:加载—>验证—>准备—&am原创 2018-09-01 09:04:39 · 2319 阅读 · 0 评论 -
认真学,JVM内存模型(运行时数据区)
Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是:程序计数器Java虚拟机栈本地方法栈堆方法区 【1】程序计数器① 什么是程序计数器程序计数器是一块较小的内存空间,可以把它看作当前线程正在执行的字节码的行号指示器。也就是说,程序计数器里面记录的是当前线程正在执行的那一条字节码指令的地址。但是,如果当前线程执行的是一个...原创 2018-08-27 11:07:57 · 1898 阅读 · 1 评论