![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
MrBlackWhite
越努力越幸运
展开
-
JVM 为什么使用元空间替换了永久代?
在Java8和以后版本中JVM的内存结构慢慢发生了变化。如果在网络上搜索JVM内存结构,90%的可能会搜到Java7及以前的内存图,本篇文章将会对JVM内存结构再次细化,深入理解Java8之后内部的变化。JVM内存结构的细化 再来看一下JVM内存结构图。为了更细化的讲解,我们将该图进行进一步的优化调整。针对java7及以前版本的细化。看出变化了吗?堆和方法区连在了一起,但这并不能说堆和方法区是一起的,它们在逻辑上依旧是分开的。但在物理上来说,它们又是连续的一块内存。也就是说,方法区和转载 2020-07-05 17:11:27 · 1367 阅读 · 0 评论 -
Java内存模型-本机内存
Java堆空间是在编写Java程序中被我们使用得最频繁的内存空间,平时开发过程,开发人员一定遇到过OutOfMemoryError,这种结果有可能来源于Java堆空间的内存泄漏,也可能是因为堆的大小不够而导致的,有时候这些错误是可以依靠开发人员修复的,但是随着Java程序需要处理越来越多的并发程序,可能有些错误就不是那么容易处理了。有些时候即使Java堆空间没有满也可能抛出错误,这种情况下需要了解...转载 2019-04-21 09:51:55 · 719 阅读 · 0 评论 -
Java内存模型-防止内存泄漏
ava中会有内存泄漏,听起来似乎是很不正常的,因为Java提供了垃圾回收器针对内存进行自动回收,但是Java还是会出现内存泄漏的。 i.什么是Java中的内存泄漏: 在Java语言中,内存泄漏就是存在一些被分配的对象,这些对象有两个特点:这些对象可达,即在对象内存的有向图中存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象了。如果对象满足这两个条件,该对象就可以...转载 2019-04-22 16:57:04 · 576 阅读 · 0 评论 -
JVM 架构解读
每个Java开发人员都知道字节码由JRE(Java运行时环境)执行。但许多人不知道JRE是Java Virtual Machine(JVM)的实现,它分析字节码,解释代码并执行它。作为开发人员,我们应该知道JVM的架构是非常重要的,因为它使我们能够更有效地编写代码。在本文中,我们将更深入地了解Java中的JVM架构和JVM的不同组件。什么是JVM?Virtual Machine...转载 2019-04-22 16:58:07 · 255 阅读 · 3 评论 -
详解Java类的生命周期
引言 最近有位细心的朋友在阅读笔者的文章时,对Java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内Java方面的教材大多只是告诉你“怎样做”,但至于“为什么这样做”却不多说,所以造成大家在基础和原理方面的知识比较匮乏,所以笔者今天就斗胆来讲一下这个问题,权当抛砖引玉,希望对在这个问题上有疑惑的朋友有所帮助,...转载 2019-04-22 16:57:55 · 144 阅读 · 0 评论 -
Java内存模型基础
并发编程模型的分类在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。 在消息传递的并发模型里,线程之间没有公共状态,线程之...转载 2019-04-22 16:57:44 · 279 阅读 · 0 评论 -
Java内存模型-重排序
数据依赖性如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分下列三种类型:名称 代码示例 说明 写后读 a = 1;b = a; 写一个变量之后,再读这个位置。 写后写 a = 1;a = 2; 写一个变量之后,再写这个变量。 读后写 a = b;b = 1; 读一个变量...转载 2019-04-22 16:57:35 · 169 阅读 · 0 评论 -
Java内存模型-顺序一致性
数据竞争与顺序一致性保证当程序未正确同步时,就会存在数据竞争。java内存模型规范对数据竞争的定义如下: 在一个线程中写一个变量, 在另一个线程读同一个变量, 而且写和读没有通过同步来排序。 当代码中包含数据竞争时,程序的执行往往产生违反直觉的结果(前一章的示例正是如此)。如果一个多线程程序能正确同步,这个程序将是一个没有数据竞争的程序。JMM对正确同步的多线...转载 2019-04-21 00:47:52 · 171 阅读 · 0 评论 -
Java内存模型-volatile
volatile的特性当我们声明共享变量为volatile后,对这个变量的读/写将会很特别。理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个监视器锁对这些单个读/写操作做了同步。下面我们通过具体的示例来说明,请看下面的示例代码:class VolatileFeaturesExample { volatile long vl = ...转载 2019-04-21 00:15:28 · 109 阅读 · 0 评论 -
Java内存模型-锁
锁的释放-获取建立的happens before 关系锁是java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。下面是锁释放-获取的示例代码:class MonitorExample { int a = 0; public synchronized void writer() { //1 a++...转载 2019-04-21 00:30:38 · 124 阅读 · 0 评论 -
Java内存模型-final
与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问。对于final域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。 下面,我们通过一些示例性的代...转载 2019-04-21 00:34:42 · 178 阅读 · 0 评论 -
双重检查锁定与延迟初始化
双重检查锁定的由来在java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出现问题。比如,下面是非线程安全的延迟初始化对象的示例代码:public class UnsafeLazyInitialization { private static In...转载 2019-04-21 00:40:34 · 146 阅读 · 0 评论 -
深入剖析Classloader(一)--类的主动使用与被动使用
我们知道java运行的是这样的,首先java编译器将我们的源代码编译成为字节码,然后由JVM将字节码load到内存中,接着我们的程序就可以创建对象了,我们知道JVM将字节码load到内存之后将将建立内存模型(JVM的内存模型我们将在稍后阐述),那JVM是怎么将类load到内存中的呢?对了,是通过Classloader,今天我们就来深入探讨一下Classloader。首先我们来看一段诡异的代码(...转载 2019-04-21 00:43:40 · 191 阅读 · 0 评论 -
深入剖析Classloader(二)-根类加载器,扩展类加载器与系统类加载器
类的加载的最终产品是位于堆(heap)中的class对象Class对象封装了类在方法区内的数据结构并向Java程序员提供访问方法区内的数据结构的接口。而反射就像一面镜子一样可这个接口是反射的接口,所以我们可以通过反射获得这个类的方法和属性,包括私有的方法和属性!下面我们来详细的介绍一下类加载器类的加载器有两种1、Java虚拟机自带的加载器2、 用户自定义类加载器...转载 2019-04-21 00:46:58 · 1406 阅读 · 0 评论 -
深入理解JVM—JVM内存模型
我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等待成本,但是随着CPU的发展,内存的读写速度也远远跟不上CPU的读写速度,因此,为了解决这一纠纷,CPU厂商在每颗CPU上加入了高速缓存,用来缓解这种症状,因此,现在CPU同内存交互就变成了下面的样子...转载 2019-04-22 16:57:25 · 182 阅读 · 0 评论 -
Java内存模型-总结
处理器内存模型顺序一致性内存模型是一个理论参考模型,JMM和处理器内存模型在设计时通常会把顺序一致性内存模型作为参照。JMM和处理器内存模型在设计时会对顺序一致性模型做一些放松,因为如果完全按照顺序一致性模型来实现处理器和JMM,那么很多的处理器和编译器优化都要被禁止,这对执行性能将会有很大的影响。根据对不同类型读/写操作组合的执行顺序的放松,可以把常见处理器的内存模型划分为下面几种类型:...转载 2019-04-22 16:57:15 · 127 阅读 · 0 评论 -
关于java7-12各个版本更新介绍
JDK 12JDK 12是Java SE平台版本12的开源参考实现,由JSR 386在Java Community Process中指定。JDK 12于2019年3月19日达到一般可用性.GPL下的生产就绪二进制文件可从Oracle获得;其他供应商的二进制文件很快就会出现。该版本的功能和时间表是通过JEP流程提出和跟踪的,并由JEP 2.0提案进行了修订。使用JDK R...原创 2019-05-14 16:35:34 · 3197 阅读 · 0 评论 -
Java内存模型-堆和栈
i.Java内存管理简介: 内存管理在Java语言中是JVM自动操作的,当JVM发现某些对象不再需要的时候,就会对该对象占用的内存进行重分配(释放)操作,而且使得分配出来的内存能够提供给所需要的对象。在一些编程语言里面,内存管理是一个程序的职责,但是书写过C++的程序员很清楚,如果该程序需要自己来书写很有可能引起很严重的错误或者说不可预料的程序行为,最终大部分开发时间都花在了调试这种程序以及...转载 2019-04-21 09:49:06 · 976 阅读 · 0 评论 -
Java内存模型-JMM简介
原本准备把内存模型单独放到某一篇文章的某个章节里面讲解,后来查阅了国外很多文档才发现其实JVM内存模型的内容还蛮多的,所以直接作为一个章节的基础知识来讲解,可能该章节概念的东西比较多。一个开发Java的开发者,一旦了解了JVM内存模型就能够更加深入地了解该语言的语言特性,可能这个章节更多的是概念,没有太多代码实例,所以希望读者谅解,本文尽量涵盖所有Java语言可以碰到的和内存相关的内容,同样也会提...转载 2019-04-21 09:48:21 · 156 阅读 · 0 评论 -
jvm系列知识汇总
jvm系列知识汇总原创:白玉IT哈哈https://mp.weixin.qq.com/s/M2IYpIjo02CvgMptvlUKZw#%23点击可阅读《JVM系列:jvm基本结构》《JVM系列:java中JVM的原理》《JVM系列:解决JVM最大内存设置问题》《JVM系列:JVM参数设置、分析》《JVM系列:JAVA虚拟机体系结构》《JVM系列:类装...转载 2018-08-09 17:39:29 · 827 阅读 · 0 评论 -
JVM系列:java中JVM的原理
目录一、Java虚拟机的生命周期:二、java虚拟机的体系结构:三、类加载器子系统:四、方法区:五、堆:六、基本结构:七、Java代码编译和执行的整个过程八、Java源码编译机制九、类加载机制十、类加载双亲委派机制介绍和分析 类执行机制十一、内存管理和垃圾回收 JVM内存组成结构 JVM内存回收十二...转载 2018-08-09 18:31:38 · 405 阅读 · 0 评论 -
JVM系列:解决JVM最大内存设置问题
你知道JVM内存最大能调多大吗,这里和大家分享一下JVM最大内存方面的内容,Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在Java虚拟机启动时创建的。JVM内存最大能调多大今天分析了当前比较流行的几个不同公司不同版本JVM最大内存,得出来的结果如下:公司JVM版本最大内存(兆)client最大内存(兆)serverSUN1.5.x14921...转载 2018-08-09 18:36:23 · 8997 阅读 · 0 评论 -
JVM系列:JVM参数设置、分析
不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM、GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java程序的工作效率。但是调整GC是以个极为复杂的过程,由于各个程序具备不同的特点,如:web和GUI程序就有很大区别(Web可以适当的停顿,但GUI停顿是客户无法接受的),而且由于跑在各个机器上的配置不同...转载 2018-08-09 18:37:30 · 161 阅读 · 0 评论 -
JVM系列:JAVA虚拟机体系结构
JAVA虚拟机的生命周期 一个运行时的Java虚拟机实例的天职是:负责运行一个java程序。当启动一个Java程序时,一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实例也就随之消亡。如果同一台计算机上同时运行三个Java程序,将得到三个Java虚拟机实例。每个Java程序都运行于它自己的Java虚拟机实例中。 Java虚拟机实例通过调用某个初始类的main()方法来运行一个Ja...转载 2018-08-09 18:44:27 · 206 阅读 · 0 评论 -
JVM系列:类装载器的体系结构
在了解Java虚拟机的类装载器之前,有一个概念我们是必须先知道的,就是java的沙箱,什么是java的沙箱,java的沙箱总体上经历了这么一个过程,从简单的java1.0的基础沙箱到java1.1的基于签名和认证的沙箱到后来基于基础沙箱+签名认证沙箱的java1.2的细粒度访问控制。java的沙箱是你可以接受来自任何来源的代码,但沙箱限制了它进行可能破坏系统的任何动作,因为沙...转载 2018-08-09 19:07:49 · 194 阅读 · 0 评论 -
JVM系列:Class文件检验器
前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,class文件校验器。class文件 校验器,保证class文件内容有正确的内部结构,Java虚拟机的class文件检验器在字节码执行之前对文件进行校验,而不是在执行中进行校验class文件校验器要进行四趟独立的扫描来完成校验工作class文件校...转载 2019-04-20 23:12:46 · 340 阅读 · 0 评论 -
JVM系列:安全管理器
前面已经简述了Java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器。安全管理器是一个单独的对象,在java虚拟机中,它在访问控制-对于外部资源的访问控制-起到中枢作用如果光看概念可能并不能很好的理解,或者说比较抽象,下面是ClassLoader其中的一个构造函数,先简单的看看它在初始化ClassLoader之前会...转载 2019-04-20 23:16:26 · 415 阅读 · 0 评论 -
JVM系列:策略文件
什么是Java的策略,什么又是策略文件。 今天我换一下笔记的方式,不是直接讲概念,而是先来做一个小例子,相信你做完这个例子之后再看我对例子的讲解,你对策略,策略文件,会豁然开朗的感觉。 例子很简单,简单的才是大家的,下面跟着我(你完全可以copy我的代码)。 第一步,定义一个简单类。package com.yfq.test; import java.i...转载 2019-04-20 23:19:41 · 340 阅读 · 0 评论 -
Java垃圾回收机制
说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联系起来。在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理。顾名思义,垃圾回收就是释放垃圾占用的空间,那么在Java中,什么样的对象会被认定为“垃圾”?那么当一些对象被确定为垃圾之后,采用什么样的策略来进行回收(释放空间)?在目前的商业虚拟机中,有哪些典型的垃圾收集...转载 2019-04-20 23:24:50 · 151 阅读 · 0 评论 -
JVM-堆与栈
数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress引用...转载 2019-04-20 23:26:00 · 131 阅读 · 0 评论 -
JVM调优总结-基本垃圾回收算法
可以从不同的的角度去划分垃圾回收算法:按照基本回收策略分引用计数(Reference Counting):比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。标记-清除(Mark-Sweep):此算法执行分两阶段。第一阶段从引用根节点开始标记所有...转载 2019-04-20 23:27:59 · 127 阅读 · 0 评论 -
JVM调优总结-垃圾回收面临的问题
如何区分垃圾上面说到的“引用计数”法,通过统计控制生成对象和删除对象时的引用数来判断。垃圾回收程序收集计数为0的对象即可。但是这种方法无法解决循环引用。所以,后来实现的垃圾判断算法中,都是从程序运行的根节点出发,遍历整个对象引用,查找存活的对象。那么在这种方式的实现中,垃圾回收从哪儿开始的呢?即,从哪儿开始查找哪些对象是正在被当前系统使用的。上面分析的堆和栈的区别,其中栈是真正进行程序执行地方...转载 2019-04-20 23:29:20 · 123 阅读 · 0 评论 -
JVM调优总结-分代垃圾回收详述
为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。 在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比如Http请求中的Session对象、线程、Socket连接,这类对象跟业务直接挂钩,因此生命周期比较长。但是还有一些对象,主要是程序运行过程中生成...转载 2019-04-20 23:30:27 · 140 阅读 · 0 评论 -
JVM架构解析
每个Java开发人员都知道字节码经由JRE(Java运行时环境)执行。但他们或许不知道JRE其实是由Java虚拟机(JVM)实现,JVM分析字节码,解释并执行它。作为开发人员,了解JVM的架构是非常重要的,因为它使我们能够编写出更高效的代码。本文中,我们将深入了解Java中的JVM架构和JVM的各个组件。JVM虚拟机是物理机的软件实现。Java的设计理念是WORA(Write Onc...转载 2019-04-20 23:32:59 · 101 阅读 · 0 评论 -
触发JVM进行Full GC的情况及应对策略
堆内存划分为 Eden、Survivor 和 Tenured/Old 空间,例如以下图所看到的:从年轻代空间(包含 Eden 和 Survivor 区域)回收内存被称为 Minor GC,对老年代GC称为Major GC,而Full GC是对整个堆来说的,在近期几个版本号的JDK里默认包含了对永生带即方法区的回收(JDK8中无永生带了)。出现Full GC的时候常常伴随至少一次的Minor...转载 2019-04-20 23:34:08 · 353 阅读 · 0 评论 -
JVM系列:jvm基本结构
JVM系列:jvm基本结构这一节,主要来学习jvm的基本结构,也就是概述。说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成图形,所以只要你有耐心,仔细,认真,并发挥你的想象力,这一章之后你会充满自信。当然,不是说看完本章,就对jvm了解了,jvm要学习的知识实在是非常的多。在你看完本节之后,后续我们还会来学jvm的细节,但是如果你在学习...转载 2018-08-09 18:19:24 · 445 阅读 · 0 评论