jvm
文章平均质量分 84
南国_之恋
每一个坚持c++的人都有一个淫荡的梦想,希望自己像硅谷天才工程师一样牛逼
展开
-
【JavaEE多线程】synchronized原理篇
synchronized转载 2023-02-07 18:08:26 · 73 阅读 · 0 评论 -
深入理解JVM—JVM内存模型
我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等待成本,但是随着CPU的发展,内存的读写速度也远远跟不上CPU的读写速度,因此,为了解决这一纠纷,CPU厂商在每颗CPU上加入了高速缓存,用来缓解这种症状,因此,现在CPU同内存交互就变成了下面的样子。同样,根据摩尔定律,我们知道单核CPU的主频不可能无限制的增长,要想很多的提升新能,需要多个处理.转载 2021-11-29 17:16:43 · 159 阅读 · 0 评论 -
GC复制存活对象,它内存地址变了么?
前些天与一位朋友技术交流,朋友在招人面试时想到一个问题,JVM垃圾回收时,会复制存活的对象到不同的区域。比如从新生代复制到老年代,在此过程中,被复制的对象的地址是否变了呢?对他提出的这个问题很感兴趣,深入研究了一下,便有了这篇文章。更新引用是JVM的职责任何一款JVM的设计,采用任何一种GC算法进行对象的移动操作时,如何更新对象引用都是JVM的基本职责。也就是说,当移动对象时,必然会涉及到对象引用的变更,只不过这部分操作JVM已经帮我们做了。作为开发者来说,可以将引用理解为存储对象的抽象句柄,而不转载 2021-04-26 14:41:22 · 391 阅读 · 1 评论 -
JVM(三):类加载机制(类加载过程和类加载器)
一、为什么要使用类加载器?Java语言里,类加载都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一些性能开销,但是会给java应用程序提供高度的灵活性。例如:1.编写一个面向接口的应用程序,可能等到运行时再指定其实现的子类;2.用户可以自定义一个类加载器,让程序在运行时从网络或其他地方加载一个二进制流作为程序代码的一部分;(这个是Android插件化,动态安装更新apk的基础)二、类加载的过程使用java编译器可以把java代码编译为存储字节码的Class文件,使用其他语言的编.转载 2021-04-14 11:41:09 · 259 阅读 · 0 评论 -
JVM类加载机制详解(二)类加载器与双亲委派模型
在上一篇JVM类加载机制详解(一)JVM类加载过程中说到,类加载机制的第一个阶段加载做的工作有:1、通过一个类的全限定名(包名与类名)来获取定义此类的二进制字节流(Class文件)。而获取的方式,可以通过jar包、war包、网络中获取、JSP文件生成等方式。2、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。这里只是转化了数据结构,并未合并数据。(方法区就是用来存放已被加载的类信息,常量,静态变量,编译后的代码的运行时内存区域)3、在内存中生成一个代表这个类的java.lang.C转载 2021-04-14 11:28:52 · 78 阅读 · 0 评论 -
JVM类加载机制详解(一)JVM类加载过程
首先Throws(抛出)几个自己学习过程中一直疑惑的问题:1、什么是类加载?什么时候进行类加载?2、什么是类初始化?什么时候进行类初始化?3、什么时候会为变量分配内存?4、什么时候会为变量赋默认初值?什么时候会为变量赋程序设定的初值?5、类加载器是什么?6、如何编写一个自定义的类加载器?首先,在代码编译后,就会生成JVM(Java虚拟机)能够识别的二进制字节流文件(*.class)。而JVM把Class文件中的类描述数据从文件加载到内存,并对数据进行校验、转换解析、初始化,使这转载 2021-04-14 11:12:23 · 744 阅读 · 0 评论 -
jstack(查看线程)、jmap(查看内存)和jstat(性能分析)
jstack(查看线程)、jmap(查看内存)和jstat(性能分析)公司内部同事分享的一篇文章周末看到一个用jstack查看死锁的例子。昨天晚上总结了一下jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令。供大家参考1.Jstack1.1 jstack能得到运行java程序的java stack和native stack的信息。可以轻松得知当前线程的运行情况。如下图所示注:这个和thread dump是同样的结果。但是thread dump是用kill -...转载 2021-03-23 10:30:01 · 2809 阅读 · 0 评论 -
死磕Java之聊聊ThreadLocal源码(基于JDK1.8)
记得在一次面试中被问到ThreadLocal,答得马马虎虎,所以打算研究一下ThreadLocal的源码面试官 : 用过ThreadLocal吗?楼主答 : 用过,当时使用ThreadLocal的时候,使用Spring实现横切整个Controller层,使用ThreadLocal实现了统计每次请求对应方法的执行时间,具体代码如下 public class ProfilerAdvice {转载 2021-01-15 10:47:21 · 131 阅读 · 0 评论 -
面试官:知道ThreadLocal嘛?谈谈你对它的理解?(基于jdk1.8)
在java的多线程模块中,ThreadLocal是经常被提问到的一个知识点,提问的方式有很多种,可能是循序渐进也可能是就像我的题目那样,因此只有理解透彻了,不管怎么问,都能游刃有余。这篇文章主要从以下几个角度来分析理解1、ThreadLocal是什么2、ThreadLocal怎么用3、ThreadLocal源码分析4、ThreadLocal内存泄漏问题下面我们带着这些问题,一点一点揭开ThreadLocal的面纱。若有不正之处请多多谅解,并欢迎批评指正。以下源码均基于jdk1.8。转载 2021-06-16 10:42:03 · 80 阅读 · 0 评论 -
jdk8:垃圾收集器
垃圾收集器是垃圾回收算法(标记-清除算法、复制算法、标记-整理算法)的具体实现,不同商家、不同版本的JVM所提供的垃圾收集器可能会有很在差别. 图中展示了7种不同分代的收集器: Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1; 而它们所处区域,则表明其是属于新生代收集器还是老年代收集器: 新生代收集器:Serial、ParNew、Parallel Scavenge; 老年代收集器:Serial Old、转载 2020-08-31 18:08:22 · 248 阅读 · 0 评论 -
JavaGC垃圾回收机制和常见算法
Java GC是在什么时候,对什么东西,做了什么事情?”什么位置:大部分在堆中,还有方法区!!方法区的垃圾收集主要回收两部分内容:废弃常量和无用的类,当满了之后同样触发FullGC,HotSpot1.8之前由永久代实现,1.8已经移到元空间,元空间并不在虚拟机中,而是使用本地内存。什么时候:程序员不能控制具体时间,系统在不可预测的时间调用System.gc()函数的时候;当然可以通过调优,用NewRatio控制newObject和oldObject的比例,用MaxTenuringThr...转载 2020-08-31 17:47:17 · 184 阅读 · 0 评论 -
一个简单需求:HashMap实现相同key存入数据后不被覆盖
看似是一个简单的问题,其实里面包含很多的东西!需求:实现一个在HashMap中存入(任意类型)相同的key值后,key中的value不会被覆盖,而是能够进行叠加!拿到一个需求的时候,我们要先进行分析,看此需求能否实现,基于已有的知识(经验),然后在通过目前的一些技术看此需求如何实现。要实现在HashMap中插入相同的key值,内容不被覆盖,那么肯定要了解HashMap的一些机制,首先看一下HashMap的put方法:从JDK API中看到HashMap的put如何先前存储了一个key转载 2020-08-31 16:28:07 · 2087 阅读 · 0 评论 -
Java内存管理-Stackoverflow问答-Java是传值还是传引用?(十一)
本文导图:一、由一个提问引发的思考在Stack Overflow看到这样一个问题:Is Java “pass-by-reference” or “pass-by-value”?翻译成中文:Java是传值还是传引用?请先不要看下面的内容,思考10秒后,在继续阅读!!!为什么建议先思考,在阅读内容呢?我们每天可能会利用碎片化的时间阅读很多内容,有很多信息和知识其实在大脑过一下,然后就忘记了!如何才能高效的利用碎片化时间掌握或者记住更多的内容和知识,我自己碎片化阅.转载 2020-08-31 15:49:24 · 90 阅读 · 0 评论 -
Java内存管理-你真的理解Java中的数据类型吗(十)
作为Java程序员,Java 的数据类型这个是一定要知道的! 但是不管是那种数据类型最终存储都要到内存中,本文由浅入深对数据类型进行介绍和讲解,相信读完本文你一定会有收获的,会对Java数据类型有更深的了解和认识!本文地图一、什么是位、字节、字符、字符集位(bit):计算机内部存储数据的最小单位,音译为比特,每个二进制数字0或者1就是1个位!字节(Byte):计算机存储容量(数据处理)的基本单位,音译拜特,8个位构成一个字节;即:1 byte (字节)= 8 bit(位)。一个字节能转载 2020-08-31 15:40:57 · 112 阅读 · 0 评论 -
Java内存管理-一文掌握虚拟机创建对象的秘密(九)
回顾一下:本文是接着上一篇内容:Java内存管理-愚人节new一个对象送给你(八),继续整理!主要内容讲解HotSpot虚拟机在Java堆中对象是如何创建、内存分配布局和访问方式。本文地图:一、给你创建一个对象如果你是一直从第一季看过来的,那一定知道前面有个地方讲过类的整个生命周期,之前只是讲到了初始化阶段,类是如何使用和类是如何被卸载还没有进行讲解!那本文就简单介绍一下类的使用,我们new一个 “如花” 似玉的girl!这里再回顾一下,类从被加载到虚拟机内存中开始,到卸载出内存为.转载 2020-08-31 15:26:01 · 106 阅读 · 0 评论 -
Java内存管理-愚人节new一个对象送给你(八)
今天是愚人节,首先祝大家节日快乐,有心仪对象的伙伴,如果还没有表白的那要抓紧时间了,今天是一个很好的机会! 没有对象的伙伴也不要担心,今天我给你 new 一个对象出来,一个貌美“如花” 的对象!本文开始Java内存管理第二季,如果你还没有阅读过上一季的内容,我推荐你先阅读一下上一季:第一季总结:由浅入深JAVA内存管理 Core Story稍微再回顾一下第一季的一些核心内容,我们知道了Java 虚拟机,知道了JVM的内存模型,以及类加载模型和机制,并实现自定义加载器。虽然第一季内容看似比较多,但是对转载 2020-08-31 15:16:00 · 145 阅读 · 0 评论 -
Java内存管理-掌握自定义类加载器的实现(七)
上一篇分析了ClassLoader的类加载相关的核心源码,也简单介绍了ClassLoader的设计思想,读源码相对来说是比较枯燥的,还是这个是必须要走的过程,学习源码中的一些思想,一些精髓,看一下大神级人物是怎么写出那么牛逼的代码。我们能够从中学到一点点东西,那也是一种进步和成长了。本文基于上一篇文章内容,手把手写一个自定义类加载器,并且通过一些简单的案例(场景)让我们更加细致和静距离的体验类加载器的神奇之处。本文地图:一、上文回顾扩展上一篇介绍了ClassLoader中loadClass(转载 2020-08-31 15:01:30 · 120 阅读 · 0 评论 -
Java内存管理-掌握类加载器的核心源码和设计模式(六)
上一篇文章介绍了类加载器分类以及类加载器的双亲委派模型,让我们能够从整体上对类加载器有一个大致的认识,本文会深入到类加载器源码分析,了解类加载器ClassLoader中核心的源码,并且分析ClassLoader中的设计思想或者设计模式!本文地图:一、ClassLoader核心API介绍当你要学习类的时候,首先我们要做的就是这个类API文档,下面我们从JDK API文档对 ClassLoader进行一个简单的整理。在看API之前,我们先可以大致看一下整个ClassLoader的类结构图:转载 2020-08-31 14:25:41 · 182 阅读 · 0 评论 -
Java内存管理-掌握虚拟机类加载器(五)
上一篇介绍虚拟机类加载机制,讲解了类加载机制中的三个阶段,分别是:加载、连接(验证、准备、解析)、初始化 ,知道了类加载的机制。下面我们就要知道类到底是通过什么方式加载到内存中的,也就是本文要介绍的类加载器,类加载器就是加载类的信息到内存中。本文地图 :一、什么是类加载器(ClassLoader)虚拟机设计团队把类加载阶段中的”通过一个类的全限定名来获取描述此类的二进制字节流“这个动作是放到Java虚拟机外部去实现的,以便让应用程序自己决定如何去获取所需的类,实现这个动作的代码模块称为”类.转载 2020-08-28 18:01:10 · 88 阅读 · 0 评论 -
Java内存管理-掌握虚拟机类加载机制(四)
上一篇介绍了整个JVM运行时的区域,以及简单对比了JDK7和JDK8中JVM运行时区域的一些变化,也顺便总结了哪些区域会发生异常(内存溢出)问题。前一篇的话还是非常重要,请大家务必要多多阅读学习和掌握,因为这些基础的知识点会关联后续的一系列问题内容,如果前面没有先有一定的基础知识储备,到后面的一些篇章介绍你可能会蒙B的,可能会有一种what the fuck的感觉,这TMD到底在说什么。所以墙裂建议先好好阅读前面的博文。本章介绍JVM中类加载的机制,通过类加载的机制的学习我们可以知道类加载的整个流程是什转载 2020-08-28 17:47:28 · 109 阅读 · 0 评论 -
Java内存管理-JVM内存模型以及JDK7和JDK8内存模型对比总结(三)
上一篇分享了JVM及其启动流程,今天介绍一下JVM内部的一些区域,以及具体的区域在运行过程中会发生哪些异内存常! 其实也就对应了内存管理的第一篇中 JVM的第三个阶段,程序运行内存溢出。知识地图:一、概述Java的内存管理采用[自动内存管理]机制,因为这个自动管理机制,Java程序员就不需要去写释放内存的代码,而且不容易出现内存泄漏问题(比C/C++程序员少一些烦恼)。但是由于内存的申请和释放都交给了Java虚拟机,一旦出现内存泄漏和溢出问题时,在不了解Java虚拟机内存结构和自动管理机制的转载 2020-08-28 16:17:51 · 144 阅读 · 1 评论