JVM
文章平均质量分 91
深入学习JVM,对JVM进行一个介绍及原理总结。
Andya_net
公众号:CodingTechWork
觉得为时已晚的时候,恰恰是最早的时候。
展开
-
SpringBoot——使用ThreadLocal解决类成员变量并发线程安全问题!
换句话说,就是当前线程变量,它是一个本地线程变量,其填充的是当前线程的变量,这个变量对于其他线程来说都是封闭且隔离的。如何实现变量隔离这一功能?可以为每个线程创建一个自有副本,每个线程可以访问自己内部的副本变量来达到隔离效果,从而解决共享变量的线程安全问题。变量是线程内部的局部变量,在不同的线程Thread中有不同的副本,副本只能由当前Thread使用,不存在多线程共享问题。一般由修饰,线程结束时,可回收掉副本。使用注解,解决Bean的多例问题,替代性的解决多线程类成员变量共享问题。原创 2023-04-14 09:44:31 · 3259 阅读 · 0 评论 -
JVM—类加载器和双亲委派模型
关注微信公众号:CodingTechWork,一起工作学习总结。引言 在学习虚拟机类加载机制时,我们已经了解虚拟机把描述类的数据从Claas文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,整个生命周期经历了加载->验证->准备->解析->初始化->使用->卸载这些阶段,而加载就是类加载的一个阶段,主要完成以下三件事:通过一个类的全限定名来获取定义此类的二进制字节流。将这个字节流所代表的静态存储结构转化为方法区的.原创 2021-05-15 17:20:02 · 260 阅读 · 1 评论 -
JVM——jinfo命令使用及GC日志分析
引言 在我们的日常开发过程中,可能不怎么关注JVM的GC,但是一旦我们开发的程序上线后,伴随着运行时间的拉长,各种线上问题就出现了,比如内存溢出,比如机器cpu和memory耗尽,除了查看程序的日志是否报错抛异常,排查是否有bug,而有时候就得先看看程序运行所需要的内存是否足够。这时,我们就需要GC日志来辅助查看。...原创 2021-01-14 16:03:54 · 948 阅读 · 0 评论 -
JAVA——以ReentrantLock为例学习重入锁以及公平性问题
引言 重入锁,顾名思义在于这个重字。开发过程中,我们在用到锁时,可能会用于递归的方法上加锁,此时,那同一个方法对象去重复加锁,是怎么加的呢?本文一起学习一下重入锁这个概念。重入锁介绍重入锁概念 重入锁ReentrantLock,是指支持重进入的锁,表示锁可以支持一个线程对资源的重复加锁,也就是说任意线程在获取到这个锁之后,如果说再次获取该锁时,不会被锁所阻塞(递归无阻塞)。另外,重入锁还支持锁时的公平和非公平性(默认)选择。重入锁实现 实现重入机制,必须解决两个问题:1)线程需要再次获取锁原创 2020-12-07 19:25:48 · 1116 阅读 · 3 评论 -
JVM——字符串常量池详解
引言 在Java开发中不管是前后端交互的JSON串,还是数据库中的数据存储,我们常常需要使用到String类型的字符串。作为最常用也是最基础的引用数据类型,JVM为String提供了字符串常量池来提高性能,本篇文章我们一起从底层JVM中认识并学习字符串常量池的概念和设计原理。字符串常量池由来 在日常开发过程中,字符串的创建是比较频繁的,而字符串的分配和其他对象的分配是类似的,需要耗费大量的时间和空间,从而影响程序的运行性能,所以作为最基础最常用的引用数据类型,Java设计者在JVM层面提供了字符串原创 2020-12-01 18:11:37 · 418 阅读 · 0 评论 -
JVM——Java对象是如何创建、存储和访问的?
关注微信公众号:CodingTechWork,一起学习进步。引言 Java程序员都知道如何创建对象,不就是一个Person person = new Person()的语句就解决了么?然而,我们只知道new,却对于底层如何实现对象的创建、如何存储到内存中去、又如何被访问的知之甚少。对象的创建流程图创建流程Java程序new一个对象。虚拟机遇到一条new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,且检查该符号引用代表的类是否已被加载、解析和初始化过。若没有,需先原创 2020-07-18 21:40:09 · 1025 阅读 · 0 评论 -
JVM——内存区域:运行时数据区域详解
关注微信公众号:CodingTechWork,一起学习进步。引言 我们经常会被问到一个问题是Java和C++有何区别?我们除了能回答一个是面向对象、一个是面向过程编程以外,我们还会从底层内存管理和垃圾收集方面作出比较。 对于C++而言,程序员既要做程序设计开发又要维护底层内存管理;而对于Java而言,程序员不需要控制底层,只需要安心写自己的代码即可,因为Java虚拟机自动实现了内存管理以及垃圾回收。 但是,我们写的程序或者程序环境问题等也时长出现内存泄露和溢出,这个时候程序员如果不知道虚拟机原创 2020-07-18 15:20:30 · 487 阅读 · 0 评论 -
Linux—JVM等性能调优监控
介绍 在linux上跑程序时,常常遇到程序卡顿,内存消耗大,这时候,我们需要使用free查看内存使用情况及top内存消耗排行,当然,我们还可以继续使用一些其他的JVM监控命令如jstat等命令进行java程序的性能评估。free命令free命令介绍 free命令是显示系统内存的使用情况,一般包括了物理内存、交换内存以及内核缓冲区内存。free命令使用[linux@001]$ free --helpUsage: free [options]Options: -b, --bytes原创 2020-05-26 19:25:05 · 1203 阅读 · 0 评论 -
JVM——Java内存模型(JMM)
软硬件发展概述Amdahl定律和摩尔定律1)Amdahl定律:通过系统中并行化和串行化的比重来描述多处理器系统能获得的运算加速能力。2)摩尔定律:用于描述处理器晶体管数量与运行效率之间的发展关系。多任务处理的需求 计算机的运算速度与它的存储和通信子系统速度的差距太大,大量的时间都花费在磁盘I/O、网络通信或者数据库访问上,为了避免处理器大部分时间处于等待其他资源的状态而浪费,就需要计算...原创 2020-04-16 20:35:27 · 692 阅读 · 0 评论 -
JVM—GC垃圾回收器总结
收集算法(标记-清理、复制、标记-整理、分代收集)是内存回收的方法论,垃圾收集器就是内存回收的具体实现。主要有7个gc器,如下图。1 Serial收集器1.1 介绍Serial收集器是单线程的收集器。单线程:1.不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,2.且在垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。Stop the world:是VM在后台自...原创 2020-03-08 22:18:57 · 408 阅读 · 0 评论 -
JVM—类加载过程学习
1 类加载过程图解 系统加载Class类型的文件主要是:加载->连接->初始化,其中连接分为:验证->准备->解析;其实,整个生命周期是7步,类从被加载到虚拟机内存中开始,到卸载出内存为止,分为:加载->验证->准备->解析->初始化->使用->卸载。2 加载 加载分为三步:1)通过全类名获取定义此类的二进制字节流;2)将...原创 2020-03-08 21:51:13 · 281 阅读 · 0 评论 -
JVM—内存分配与回收策略
1 概括1.1 自动内存管理 给对象分配内存+回收分配给对象的内存。前者涉及内存分配策略;后者涉及gc算法(标记-清除、复制、标记-整理、分代收集)以及gc器(Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1)1.2 内存分配大致方向 堆上分配(JIT编译后拆散为标量类型并间接地栈上分配)、对象主要分配在新生代...原创 2020-03-07 16:27:45 · 133 阅读 · 0 评论 -
JVM—垃圾回收GC算法
1 GC算法简介算法特点标记-清除分为“标记”和“清除”两个阶段复制可以解决效率问题,将可用的内存按容量划分为大小相等的两块。标记-整理先标记、再整理,最后清理分代收集划分新生代和老年代2 标记-清除2.1 流程分为“标记”和“清除”两个阶段:(1)首先标记出所需要回收的对象(引用计数法和可达性分析,两次标记过程);(2)在标记完成后统...原创 2020-03-07 16:18:28 · 210 阅读 · 0 评论 -
JVM—引用计数和可达性分析算法(存活性判断)
1 引用计数算法1.1 算法思想 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1; 当引用失效时,计数器值就减1; 任何时候计数器为0时的对象就是不能再被使用。1.2 特点优点:实现简单;判定效率高。缺点:很难解决对象之间相互循环引用的问题。(所以虚拟机不是通过引用计数算法判断对象是否存活)2 可达性分析算法2.1 算法思想 通过一系列称为GC ...原创 2020-03-07 15:55:37 · 248 阅读 · 0 评论 -
JVM内存区域划分
一、运行时数据区域(2)程序计数器1)程序计数器(Program Counter Register):是一块较小的内存空间,是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令)(分支、循环、跳转、异常处理、线程恢复等功能)2)线程私有:多线程是通过线程轮流切换并分配处理器执行时间的方式实现的,任何时刻,一个处理器都原创 2017-03-02 07:51:57 · 536 阅读 · 0 评论