大家好,又见面了。本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面。如果感兴趣,欢迎关注以获取后续更新。通过《重新认识下JVM级别的本地缓存框架GuavaCache——优秀从何而来》一文,我们知道了GuavaCache作为JVM级别的本地缓存组件的诸多暖心特性,也一步步地学习了在项目中集成并使用GuavaCache进行缓存相关操作。GuavaCache作为一款优秀的本地缓存组件,其内部很多实现机制与设计策略,同样值得开发人员深入的掌握与借鉴。作为系列专栏,本篇文章我们将进一步探讨下GuavaCache实现层面的一些逻辑与设计策略,让我们可以
大家好,又见面了。本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面。如果感兴趣,欢迎关注以获取后续更新。通过《重新认识下JVM级别的本地缓存框架GuavaCache——优秀从何而来》一文,我们知道了GuavaCache作为JVM级别的本地缓存组件的诸多暖心特性,也一步步地学习了在项目中集成并使用GuavaCache进行缓存相关操作。GuavaCache作为一款优秀的本地缓存组件,其内部很多实现机制与设计策略,同样值得开发人员深入的掌握与借鉴。作为系列专栏,本篇文章我们将进一步探讨下GuavaCache实现层面的一些逻辑与设计策略,让我们可以
一、汇总JVM是运行在操作系统之上的,它与硬件没有直接的交互。先说一下JVM的内存区域,当函数开始运行时,JVM拿到自己的内存将自己的内存区域进行了分割,分为五块区域:线程共享的有堆、方法区,线程私有的有java栈、本地方法栈、程序计数器。方法区是用来加载class文件的区域,静态变量、常量、类元信息、运行时的常量池存放在在方法区中,方法区在jdk1.7之前它又叫做永久代,但是jdk1.8之后改成元数据空间了;new的对象都存放在堆中;栈也叫栈内存,8种类型的基本变量、对象的引用变量、实例方法都是在函数的栈内存中分配,栈中的数据都是以栈帧的格式存在,每执行一个方法都会产生一个栈帧,保存到栈(后
一、汇总JVM是运行在操作系统之上的,它与硬件没有直接的交互。先说一下JVM的内存区域,当函数开始运行时,JVM拿到自己的内存将自己的内存区域进行了分割,分为五块区域:线程共享的有堆、方法区,线程私有的有java栈、本地方法栈、程序计数器。方法区是用来加载class文件的区域,静态变量、常量、类元信息、运行时的常量池存放在在方法区中,方法区在jdk1.7之前它又叫做永久代,但是jdk1.8之后改成元数据空间了;new的对象都存放在堆中;栈也叫栈内存,8种类型的基本变量、对象的引用变量、实例方法都是在函数的栈内存中分配,栈中的数据都是以栈帧的格式存在,每执行一个方法都会产生一个栈帧,保存到栈(后
“JVM为什么使用元空间替换了永久代?”这是一个工作6年的同学去字节第一面遇到的问题,很遗憾,他没有回答出来大家好,我是Mic,一个工作了14年的Java程序员。关于这个问题,我们怎么回答?面试官到底关注什么呢?面试解析我们都知道Java8以及以后的版本中,JVM运行时数据区的结构都在慢慢调整和优化。但实际上这些变化,对于业务开发的小伙伴来说,没有任何影响。因此我可以说,99%的人都回答不出这个问题。但是互联网大厂的面试就是筛选那1%的优秀人才,因此通过这道题,既可以考察求职者对JVM原理的理解程度又能够考察求职者基本功的扎实程度还能实现高级人才的筛选在Java7里面,JVM运行时数据区是这样
“JVM为什么使用元空间替换了永久代?”这是一个工作6年的同学去字节第一面遇到的问题,很遗憾,他没有回答出来大家好,我是Mic,一个工作了14年的Java程序员。关于这个问题,我们怎么回答?面试官到底关注什么呢?面试解析我们都知道Java8以及以后的版本中,JVM运行时数据区的结构都在慢慢调整和优化。但实际上这些变化,对于业务开发的小伙伴来说,没有任何影响。因此我可以说,99%的人都回答不出这个问题。但是互联网大厂的面试就是筛选那1%的优秀人才,因此通过这道题,既可以考察求职者对JVM原理的理解程度又能够考察求职者基本功的扎实程度还能实现高级人才的筛选在Java7里面,JVM运行时数据区是这样
首先我们可以使用各种JVM工具,查看当前日志,分析当前JVM参数设置,并且分析当前堆内存快照和gc日志,根据实际的各区域内存划分和GC执行时间,觉得是否进行优化,当然我们也可以直接生成堆的dump文件,进行分析,比如GC时间超过1-3秒,或者频繁GC,则必须进行一个优化1.针对JVM堆的设置,一般可以通过-Xms-Xmx限定其最小、最大值,为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间,通常把最大、最小设置为相同的值3.年轻代和年老代设置多大才算合理 1)更大的年轻代必然导致更小的年老代,大的年轻代会延长普通GC的周期,但会增加每次GC的时间;小的年老代会导致更频繁的FullGC
首先我们可以使用各种JVM工具,查看当前日志,分析当前JVM参数设置,并且分析当前堆内存快照和gc日志,根据实际的各区域内存划分和GC执行时间,觉得是否进行优化,当然我们也可以直接生成堆的dump文件,进行分析,比如GC时间超过1-3秒,或者频繁GC,则必须进行一个优化1.针对JVM堆的设置,一般可以通过-Xms-Xmx限定其最小、最大值,为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间,通常把最大、最小设置为相同的值3.年轻代和年老代设置多大才算合理 1)更大的年轻代必然导致更小的年老代,大的年轻代会延长普通GC的周期,但会增加每次GC的时间;小的年老代会导致更频繁的FullGC
程序和机器沟通的桥梁一、闲聊相信很多朋友在出国旅游,或者与外国友人沟通的过程中,都会遇到语言不通的烦恼。这时候我们就需要掌握对应的外语或者拥有一部翻译机。而笔者只会中文,所以需要借助一部翻译器才能与不懂中文的外国友人交流。咱们的执行引擎就类似于这部“翻译机”。二、概述执行引擎的作用就是将字节码指令解释或者编译为对应平台上的本地机器指令。简单来说,执行引擎充当了将高级语言翻译为机器语言的翻译者。对于Hotspot虚拟机,执行引擎中包含两部分:解释器和JIT编译器(即时编译器)。下图是执行引擎的原理:三、解释器解释器所承担的角色就是一个运行时翻译者,将字节码文件中的内容翻译为对应平台的本地机器码指
程序和机器沟通的桥梁一、闲聊相信很多朋友在出国旅游,或者与外国友人沟通的过程中,都会遇到语言不通的烦恼。这时候我们就需要掌握对应的外语或者拥有一部翻译机。而笔者只会中文,所以需要借助一部翻译器才能与不懂中文的外国友人交流。咱们的执行引擎就类似于这部“翻译机”。二、概述执行引擎的作用就是将字节码指令解释或者编译为对应平台上的本地机器指令。简单来说,执行引擎充当了将高级语言翻译为机器语言的翻译者。对于Hotspot虚拟机,执行引擎中包含两部分:解释器和JIT编译器(即时编译器)。下图是执行引擎的原理:三、解释器解释器所承担的角色就是一个运行时翻译者,将字节码文件中的内容翻译为对应平台的本地机器码指