
JVM
Franco蜡笔小强
小码农
展开
-
Java中的常量池之Class常量池
在Java中,常量池的概念想必很多人都听说过。这也是面试中比较常考的题目之一。在Java有关的面试题中,一般习惯通过String的有关问题来考察面试者对于常量池的知识的理解,几道简单的String面试题难倒了无数的开发者。所以说,常量池是Java体系中一个非常重要的概念。谈到常量池,在Java体系中,共用三种常量池。分别是字符串常量池、Class常量池和运行时常量池。本文是《好好说说Java中的常量池》系列的第一篇,先来介绍一下到底什么是Class常量池。什么是Class文件在Java代码的转载 2020-05-19 19:54:09 · 884 阅读 · 0 评论 -
Java对象的内存分配过程是如何保证线程安全的?
JVM内存结构,是很重要的知识,相信每一个静心准备过面试的程序员都可以清楚的把堆、栈、方法区等介绍的比较清楚。上图,是一张在作者根据《Java虚拟机规范(Java SE 8)》中描述的JVM运行时内存区域结构画的。很多人都知道Java对象是在堆内存中分配空间的(JIT优化除外),也知道内存分配过程中是线程安全的,那么虚拟机到底是如何保证线程安全的呢?本文就来简单介绍一下。1...原创 2020-04-14 09:40:09 · 902 阅读 · 0 评论 -
JVM成神之路-JVM引用模型
本文通过探析Java中的引用模型,分析比较强引用、软引用、弱引用、虚引用的概念及使用场景,知其然且知其所以然,希望给大家在实际开发实践、学习开源项目提供参考。Java的引用对于Java中的垃圾回收机制来说,对象是否被应该回收的取决于该对象是否被引用。因此,引用也是JVM进行内存管理的一个重要概念。Java中是JVM负责内存的分配和回收,这是它的优点(使用方便,程序不用再像使用C语言那样担心...原创 2018-10-15 18:41:54 · 712 阅读 · 0 评论 -
JVM成神之路-类加载机制-双亲委派,破坏双亲委派
概述概念虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接时候用的Java类型。类的生命周期类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用、卸载。其中验证、准备、解析统称为连接上图中,加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须严...原创 2018-08-21 09:24:50 · 17395 阅读 · 5 评论 -
ClassLoader机制(源码级别)
写在前面:Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中,JVM在加载类的时候,都是通过ClassLoader的loadClass()方法来加载class的,loadClass使用双亲委派模式。 为了更好的理解类的加载机制,我们来深入研究一下ClassLoader和他的loadClass()...转载 2018-08-20 11:54:23 · 1068 阅读 · 0 评论 -
JVM成神之路-HotSpot虚拟机-编译原理、JIT、编译优化
Java编译原理什么是字节码、机器码、本地代码?字节码是指平常所了解的 .class 文件,Java 代码通过 javac 命令编译成字节码机器码和本地代码都是指机器可以直接识别运行的代码,也就是机器指令字节码是不能直接运行的,需要经过 JVM 解释或编译成机器码才能运行此时你要问了,为什么 Java 不直接编译成机器码,这样不是更快吗?1. 机器码是与平台相关的,也就是操...原创 2018-08-13 16:02:53 · 7083 阅读 · 7 评论 -
JVM成神之路-volatile--这一篇全了解
Java语言为了解决并发编程中存在的原子性、可见性和有序性问题,提供了一系列和并发处理相关的关键字,比如synchronized、volatile、final、concurren包等。在前一篇文章中,我们也介绍了synchronized的用法及原理。本文,来分析一下另外一个关键字——volatile。本文就围绕volatile展开,主要介绍volatile的用法、volatile的原理,以及v...原创 2018-08-13 10:14:13 · 1488 阅读 · 0 评论 -
JVM成神之路-synchronized--这一篇全了解
Java语言为了解决并发编程中存在的原子性、可见性和有序性问题,提供了一系列和并发处理相关的关键字,比如synchronized、volatile、final、concurren包等。在《深入理解Java虚拟机》中,有这样一段话:synchronized关键字在需要原子性、可见性和有序性这三种特性的时候都可以作为其中一种解决方案,看起来是“万能”的。的确,大部分并发控制操作都能使用syn...原创 2018-08-13 10:08:32 · 676 阅读 · 0 评论 -
JVM成神之路-Java垃圾回收
Java垃圾回收机制为什么要进行垃圾回收?随着程序的运行,内存中存在的实例对象、变量等信息占据的内存越来越多,如果不及时进行垃圾回收,必然会带来程序性能的下降,甚至会因为可用内存不足造成一些不必要的系统异常。哪些“垃圾”需要回收?如果某个对象已经不存在任何引用,那么它可以被回收。什么时候进行垃圾回收?引用计数算法每个对象添加一个引用计数器,每被引用一次,计数器加1,失...原创 2018-08-02 15:37:53 · 31304 阅读 · 8 评论 -
JVM成神之路-Java对象模型
首先我们要知道: 在jvm的内存结构中,对象保存在堆中,而我们在对对象进行操作时,其实操作的是对象的引用。 Java对象包含三个部分一个Java对象可以分为三部分存储在内存中,分别是:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头(包含锁状态标志,线程持有的锁等标志) 实例数据 对齐填充 oop-klass model(...原创 2018-07-23 15:01:17 · 9270 阅读 · 2 评论 -
JVM成神之路-Java内存模型(JMM)
Java 内存模型基础什么是 Java 内存模型(JMM-共享内存模型)内存模型描述了程序中各个变量(实例域、静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存中取出变量这样的底层细节。(共享变量是存放在堆内存中,对于局部变量等不会在线程之间共享) Java内存模型定义了多线程之间共享变量的可见性以及如何在需要的时候对共享变量进行同步。原始的Java内存模型效率...原创 2018-07-03 15:32:05 · 4543 阅读 · 3 评论 -
JVM成神之路-Java内存模型概述
为什么要有内存模型在介绍Java内存模型之前,先来看一下到底什么是计算机内存模型,然后再来看Java内存模型在计算机内存模型的基础上做了哪些事情。要说计算机的内存模型,就要说一下一段古老的历史,看一下为什么要有内存模型。内存模型,英文名Memory Model,他是一个很老的老古董了。他是与计算机硬件有关的一个概念。那么我先给你介绍下他和硬件到底有啥关系。CPU和缓存一致性我们应该...原创 2018-07-03 14:35:17 · 592 阅读 · 1 评论 -
JVM成神之路-JVM内存结构
线程私有程序计数器当前线程所执行的字节码的行号指示器 对于 Java 方法,记录正在执行的虚拟机字节码指令的地址;对于 native 方法,记录值为空(Undefined) 唯一一个Java 虚拟机规范中没有规定任何 OutOfMemoryError 的内存区域Java 虚拟机栈:java方法执行的内存模型 生命周期与线程执行结果相同每个线程都有独自的虚拟机栈,...原创 2018-06-21 10:58:30 · 1632 阅读 · 3 评论 -
JVM参数及调优
JVM实用参数系列成为Java GC专家(5)—Java性能调优原则(调优原则)JVM 优化经验总结JVM调优总结原创 2017-11-28 08:59:35 · 1457 阅读 · 0 评论 -
JDK,JRE,JVM区别与联系
JVM自动内存管理:内存区域基础概念JDK : Java Development ToolKit(Java开发工具包)。JDK是整个JAVA的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。JDK有以下三种版本: J2SE,standard转载 2017-11-28 08:41:12 · 322 阅读 · 0 评论 -
深入理解Java内存模型(七)——总结
处理器内存模型顺序一致性内存模型是一个理论参考模型,JMM和处理器内存模型在设计时通常会把顺序一致性内存模型作为参照。JMM和处理器内存模型在设计时会对顺序一致性模型做一些放松,因为如果完全按照顺序一致性模型来实现处理器和JMM,那么很多的处理器和编译器优化都要被禁止,这对执行性能将会有很大的影响。根据对不同类型读/写操作组合的执行顺序的放松,可以把常见处理器的内存模型划分为下面几种类型:转载 2017-11-21 08:58:55 · 349 阅读 · 0 评论 -
深入理解Java内存模型(六)——final
与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问。对于final域,编译器和处理器要遵守两个重排序规则:在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。下面,我们通过一些示例性的代码来分别说明这转载 2017-11-21 08:52:41 · 349 阅读 · 0 评论 -
深入理解Java内存模型(五)——锁
锁的释放-获取建立的happens before 关系锁是java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。下面是锁释放-获取的示例代码:class MonitorExample { int a = 0; public synchronized void writer() { //1 a+转载 2017-11-21 08:49:56 · 372 阅读 · 0 评论 -
深入理解Java内存模型(四)——volatile
volatile的特性当我们声明共享变量为volatile后,对这个变量的读/写将会很特别。理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个监视器锁对这些单个读/写操作做了同步。下面我们通过具体的示例来说明,请看下面的示例代码:class VolatileFeaturesExample { volatile long vl = 0L;转载 2017-11-21 08:47:55 · 344 阅读 · 0 评论 -
深入理解Java内存模型(三)——顺序一致性
数据竞争与顺序一致性保证当程序未正确同步时,就会存在数据竞争。java内存模型规范对数据竞争的定义如下:在一个线程中写一个变量,在另一个线程读同一个变量,而且写和读没有通过同步来排序。当代码中包含数据竞争时,程序的执行往往产生违反直觉的结果(前一章的示例正是如此)。如果一个多线程程序能正确同步,这个程序将是一个没有数据竞争的程序。JMM对正确同步的多线程程序的内存一致性做了如下转载 2017-11-21 08:45:58 · 337 阅读 · 0 评论 -
深入理解Java内存模型(二)——重排序
数据依赖性如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分下列三种类型:名称代码示例说明写后读a = 1;b = a;写一个变量之后,再读这个位置。写后写a = 1;a = 2;写一个变量之后,再写这个变量。读后写a = b;b = 1;读一个变量之后,再转载 2017-11-21 08:44:53 · 305 阅读 · 0 评论 -
深入理解Java内存模型(一)——基础
并发编程模型的分类在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通转载 2017-11-21 08:43:12 · 505 阅读 · 0 评论