摸鱼JVM -运行时数据区

大部分两三年经验的程序员水平是怎样的? 每一行都一样 入职超过一年后基本开始混吃等死,直到对薪资有了新要求换工作甚至换行业,如果薪资过的去基本就一直混吃等死了。 想着一直在学习的都成为了大神了,而绝大部分普通人是不可能在,吃穿不愁后还去努力,而放弃自己美好的娱乐时间的,就如有一句话,你以为你努力了就能成为好学生,殊不知努力本身已经是一种万中无一的优秀品质了; 如果你有这种品质,想避免35岁中年危机,那么可以学习一下阿里的这条路线 当然摸鱼也是一种乐趣,追求不同的就别往下看了 ---------------------------.. 阅读详情

前言

前面介绍过

JVM被分为三个主要的子系统:

  1. 类加载器子系统
  2. 运行时数据区(也就是内存相关)
  3. 执行引擎

JVM

前面我们介绍了JVM的类加载机制, 今天我们则重点聊聊JVM的运行时数据区, 即JVM内存相关知识

关于JVM内存, 有两个比较重要的概念,

这两个概念, 经常会有人搞混, 所以, 顺带来做个梳理.

  • 内存模型

  • 内存结构

什么是内存模型(JMM)?

Java Memory Model, 就是我们常说的JMM;

JMM和JVM内存结构不同, 它只是一个抽象的概念, 描述了一组规则或规范, 这个规范定义了一个线程对共享变量的写入时对另一个线程是可见的。

我们知道, Java的多线程之间是通过共享内存进行通信的,而由于采用共享内存进行通信,在通信过程中会存在一系列如可见性、原子性、顺序性等问题,而JMM就是围绕着多线程通信以及与其相关的一系列特性而建立的模型.

JMM定义了一些语法集, 这些语法集映射到Java语言中就是volatile、synchronized等关键字.

简而言之, JMM就是为了解决Java多线程对共享数据的读写一致性问题而产生的一种模型!

PS: 关于Java多线程的读写一致性问题的前世今生可以阅读我的另一篇文章你不得不知道的线程安全问题

JMM内存模型可以归纳为下图

内存模型

什么是JVM内存结构?

JVM的内存结构也叫运行时数据区;

JVM中内存通常划分为两个部分, 分别为堆内存与栈内存,栈内存主要用运行线程方法存放本地暂时变量与线程中方法运行时候须要的引用对象地址;

堆内存则存放全部的对象信息.

相比栈内存, 堆内存能够所大的多, 所以JVM一直通过对堆内存划分不同的功能区块, 实现对堆内存中对象管理.

堆内存不够最常见的错误就是OOM(OutOfMemoryError)

栈内存溢出最常见的错误就是StackOverflowError

此外, 也有较为细致的划分;

根据JVM 规范, 定义了五种运行时数据区, 分别是:

  • 程序计数器
  • Java虚拟机栈
  • 本地方法栈
  • Java堆
  • 方法区

这里注意, JVM规范只是一种规范, 而不是具体的实现!

可以这么理解: JVM规范和JVM的关系就是接口和实现类的关系!

JVM规范只是规定了这五种数据区的作用, 并没有规定如何去实现它,所以在不同的JVM中对这五种数据区实现是不同的;

举个例子:

我们常用的HotSpot虚拟机, 在JDK1.8之前对方法区的实现就是永久代!
JDK1.8后又取消了永久代,转而用元空间实现了方法区!

接下来,我们就以HotSpot虚拟机为例来理清JVM的内存结构

程序计数器(线程私有)

程序计数器可以看作是JVM对CPU程序计数器的一种模拟;

它是一块较小的内存空间, 用来存储当前线程的所执行的字节码的行号;

我们知道, Java的多线程是通过线程轮流切换、分配处理器时间片的方式来实现的,
所以在任何一个时刻, 一个CPU的内核只会执行一个线程中的命令;
一旦当前线程的时间片结束然后被挂起, 当又轮到这个被挂起的线程执行的时候, 如何去恢复被挂起前的状态?
这个就是依靠程序计数器,保存当前执行的字节码的位置.

简而言之, 就是个“书签”的功能.

注意以下几点:

  1. 程序计数器是线程私有的, 每个线程都有一个自己的程序计数器.
  2. 如果当前线程执行的是native方法, 则其值为null
  3. 在这块内存空间中不存在任何OutOfMemoryError情况
Java虚拟机栈(线程私有)

Java虚拟机栈描述 java 方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stack Frame) 用于存储局部变量表、操作数栈、动态链接、方法出口等信息.

每一个方法从调用直至执行完成 的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程.

栈帧( Frame)是用来存储数据和部分过程结果的数据结构,同时也被用来处理动态链接 (Dynamic Linking)、 方法返回值和异常分派( Dispatch Exception).

栈帧随着方法调用而创建,随着方法结束而销毁, 无论方法是正常完成还是异常完成(抛出了在方法内未被捕获的异常)都算作方法结束。

Java虚拟机栈

Java虚拟机栈特点如下:

  1. Java虚拟机栈是线程私有的,它的生命周期与线程相同(随线程而生,随线程而灭)
  2. 栈帧包括局部变量表、操作数栈、动态链接、方法返回地址和一些附加信息
  3. 每一个方法被调用直至执行完毕的过程, 就对应这一个栈帧在虚拟机栈中从入栈到出栈的过程

栈帧结构如下图
image.png

  • 局部变量表

局部变量表也被称之为局部变量数组或本地变量表,是一组变量值的存储空间;

主要用于存储方法参数和定义在方法体内的局部变量这些数据类型.
包括各类基本数据类型、对象引用(reference), 以及returnAddressleixing

局部变量表所需的容量大小是在编译期确定下来的,并保存在方法的Code属性的maximum local variables数据项中, 在方法运行期间是不会改变局部变量表的大小的.

方法嵌套调用的次数由栈的大小决定, 一般来说, 栈越大, 方法嵌套调用次数越多.
对一个函数而言, 他的参数和局部变量越多,使得局部变量表膨胀,它的栈帧就越大,以满足方法调用所需传递的信息增大的需求。进而函数调用就会占用更多的栈空间.

局部变量表中的变量只在当前方法调用中有效, 在方法执行时, 虚拟机通过使用局部变量表完成参数值到参数变量列表的传递过程; 当方法调用结束后, 随着方法栈帧的销毁,局部变量表也会随之销毁.

  • 操作数栈

操作数栈, 是一个后入先出栈, 主要用于保存计算过程的中间结果, 同时作为计算过程中变量临时的存储空间;

当一个方法开始执行的时候,一个新的栈帧也会随之被创建出来,这个方法的操作数栈默认是空的, 在方法的执行过程中, 根据字节码指令,往栈中写入数据或提取数据;

操作数栈并非采用访问索引的方式来进行数据访问的, 而是只能通过标准的入栈push和出栈pop操作来完成一次数据访问

如果被调用的方法带有返回值的话,其返回值将会被压入当前栈帧的操作数栈中,并更新PC寄存器中下一条需要执行的字节码指令

每一个操作数栈都会拥有一个明确的栈深度用于存储数值, 其所需的最大深度在编译器就定义好了,保存在方法的code属性中,为max_stack的值.

  • 动态链接(或运行时常量池的方法引用)

每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用;

包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接(Dynamic Linking);

比如: invokedynamic指令
在Java源文件被编译到字节码文件时, 所有的变量和方法引用都作为符号引用(Symbilic Reference)保存在class文件的常量池里.

比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用.

PS: 几个概念
在JVM中,将符号引用转换为调用方法的直接引用与方法的绑定机制相关

  1. 静态链接和动态链接

静态链接
当一个字节码文件被装载进JVM内部时,如果被调用的目标方法在编译期可知,且运行期保持不变。
将调用方法的符号引用转换为直接引用的过程称为静态链接。

动态链接
被调用的目标方法在编译期无法被确定下来,只能够在程序运行期将方法的符号引用转换为直接引用,这种引用转换的过程具备动态性,称为动态链接。

  1. 早期绑定和晚期绑定
    绑定是一个字段、方法或者类在符号引用被替换为直接引用的过程,这仅仅发生一次。

早期绑定
被调用的目标方法在编译期可知,且运行保持不变。

晚期绑定
被调用方法在编译期无法被确定下来,只能够在程序运行期根据实际类型绑定相关的方法。

  1. 虚方法和非虚方法
    非虚方法
    如果方法在编译期就确定了具体的调用版本,这个版本在运行时是不可变的,这样的方法称为非虚方法;
    静态方法、私有方法、final方法、实例构造器、父类方法都是非虚方法;

虚方法
不是非虚方法的方法,都是虚方法;

  • 方法返回地址

存放调用该方法的PC寄存器的值
一个方法的结束, 有两种方式:

  1. 正常执行完成;
  2. 出现未处理的异常, 非正常退出;

无论通过哪种方式退出, 在方法退出后都返回该方法被调用的位置;

方法正常退出时, 调用pc计数器的值作为返回地址, 即调用该方法的指令的下一条指令的地址;

如果异常退出, 返回地址是通过异常表来确定, 栈帧中一般不会保存这部分信息.

正常完成出口和异常完成出口的区别在于:
通过异常完成出口退出的不会给他上一层调用者产生任何返回值。

  • 附加信息

虚拟机规范允许具体的虚拟机实现增加一些规范里没有描述的信息到栈帧中.

例如与调试相关的信息, 这部分信息完全取决于具体的虚拟机实现.
实际开发中, 一般会把动态连接、方法返回地址与其他附加信息全部归为一类,成为栈帧信息.

本地方法栈(线程私有)

本地方法栈与虚拟机栈的区别是:
虚拟机栈执行的是 Java 方法, 本地方法栈执行的是本地方法(Native Method),其他基本上一致;

在 HotSpot 中直接把本地方法栈和虚拟机栈合二为一, 这里暂时不做过多叙述.

堆(线程共有)

堆内存和元数据区都被所有线程共享, 在虚拟机启动时创建.

Java 堆是内存空间占据的最大一块区域了, 用来存放对象实例及数组,也就是说我们 new 出来的对象都存放在这里。

这里也是垃圾回收器的主要活动营地了, 于是它就有了一个别名叫做 GC 堆, 并且单个 JVM 进程有且仅有一个 Java 堆.

现代JVM 采用分代收集算法, 因此Java堆从GC的角度还可以细分为: 新生代(Eden 区和From Survivor 区和 To Survivor 区)和老年代.

image.png

新生代(占1/3的堆空间,通常使用MinorGC)

新生代几乎是所有 Java 对象出生的地方, 用来存放新生的对象.

由于频繁创建对象, 所以会频繁触发 MinorGC 进行垃圾回收.

新生代又细分为三个区

  • Eden
  • From Servivor (也叫S0)
  • To Servivor (也叫S1)
Eden : S0 : S1  占比为 :   8:1:1  (可以通过参数 –XX:SurvivorRatio 来设定)

JVM 每次只会使用 Eden 和其中的一块 Survivor 区域来为对象服务, 所以无论什么时候,总是有一块 Survivor 区域是空闲着的, 谁空闲谁就是To区,To区不参与垃圾回收;
因此,新生代实际可用的内存空间为 9/10 ( 即90% )的新生代空间.

MinorGC 的过程(复制->清空->互换)

一般情况下, 新对象都会在新生代 ( Eden 和 一个 Survivor 区域, 假设是 From 区域 ) 出生;
对于大对象 ( 即: 需要分配一块较大的连续内存空间 ) , 新生代放不下时, 则直接进入到老年代;

一次完整的MinorGC 的过程如下:

  • 复制: Eden、From复制到 To,年龄+1
    在初始阶段, 新创建的对象被分配到Eden区, 此时From 和 To 都为空;
    当Eden满的时候会触发第一次GC, 此时会把还活着的对象复制到 From;
    当Eden再次触发GC的时候会扫描Eden和From, 对这两个区域进行垃圾回收;
    经过这次回收后, 还存活的对象会复制到 To

  • 清空: 清空Eden、From
    上述操作完成后, 清空 Eden 和 From 中的对象

  • 互换: To 和 From 互换(谁空谁是To区)
    最后,To 和 From 互换,原 To 成为下一次 GC 时的 From区;

PS: 对象会在From和To区域中复制来复制去, 如此交换15次(JVM默认为15,最大也是15,因为只留了4个字节; 可以通过参数 -XX:MaxTenuringThreshold 来设定),
最终如果对象还是存活, 就存入老年代.

老年代(占2/3的堆空间,通常使用MajorGC)

老年代主要存放应用程序中生命周期长的内存对象, 这些对象比较稳定, 所以 MajorGC 不会频繁执行.

在进行 MajorGC 前一般都先进行 了一次 MinorGC, 使得有新生代的对象晋身入老年代, 导致老年代空间不够用时才触发.

当无法找到足够大的连续空间分配给新创建的较大对象时也会提前触发一次 MajorGC 进行垃圾回收腾出空间.

MajorGC(标记->清除)

MajorGC 采用标记清除算法: 首先扫描一次所有老年代,标记出存活的对象,然后回收没 有标记的对象.

MajorGC 的耗时比较长,因为要扫描再回收.

MajorGC 会产生内存碎片,为了减 少内存损耗,我们一般需要进行合并或者标记出来方便下次直接分配.

当老年代也满了装不下的时候,就会抛出 OOM(Out of Memory)异常

方法区(线程共有)

方法区是线程共享的, 主要存储类信息、常量池、静态变量、JIT编译后的代码等数据, 理论上来说方法区是堆的逻辑组成部分;

前面简单提过, 方法区只是JVM规范定义的一个数据区, 不同的JVM对其实现方式不同, 而我们常用的HotSpot对方法区的实现, 随着JDK版本的升级, 也是经历了多次调整.

JDK1.7到1.8的内存结构对比

  • JDK1.6及之前(永久代): 方法区存放类信息、字符串常量池、静态变量、即时编译器编译后的代码等数据

  • JDK1.7及以后(永久代): 将静态变量、字符串常量池从方法区中移了出来,放在了JVM堆中

  • JDK1.8及以后(元空间): 类的元信息(类信息、字段、方法、常量等)被存储在元空间中; 常量池和静态变量被放在了JVM堆中

为什么要用元空间来替代永久代呢?

简介: 永久代主要存放 Class 和 Meta(元数据)的信息, Class 在被加载的时候被放入永久区域,它和和存放实例的区域不同,GC 不会在主程序运行期对永久区域进行清理;
所以这 也导致了永久代的区域会随着加载的 Class 的增多而胀满,最终抛出 OOM 异常.

  • 为永久代设置空间大小很难确定
    一个应用动态加载的类的大小是很难确定的,如果永久代设置的过小,会频繁触发FullGC,并且可能会出现OOM.
    而元空间并不在虚拟机中,而是使用本地内存, 因此,理论上系统可以使用的内存有多大,元空间就有多大, 所以出现永久代的OOM的概率很小

  • 对永久代进行调优十分困难
    永久代的调优是很困难的, 虽然可以设置永久代的大小,但是很难确定一个合适的大小, 因为其中的影响因素很多, 比如类数量的多少、常量数量的多少等;
    将元数据从永久代剥离出来, 不仅实现了对元空间的无缝管理, 还可以简化Full GC以及对以后的并发隔离类元数据等方面进行优化

请关注我的订阅号

订阅号.png

紫光PG2L100H平台DDR3 IP核调试实战:从AXI接口到状态机设计的避坑指南 本文详细介绍了在紫光PG2L100H FPGA平台上调试DDR3 IP核的实战经验,重点解析了AXI接口的特殊行为和状态机设计的关键技巧。通过具体代码示例和调试方法,帮助开发者规避常见陷阱,实现高性能DDR3控制器设计,达到1.2GB/s的稳定带宽。 阅读详情

相关推荐

基于Q-learning的无人机三维路径规划(含完整C++代码)

基于Q-learning的无人机三维路径规划(含完整C++代码)

weixin_54186646的博客 1万+

JVM学习笔记

①避免类的重复加载;②防止核心API被篡改;为了避免原始类被覆盖的问题。老子走过的路,小子不用走比如,用户编写了一个Object类,放入程序中加载。当没有双亲委派机制时,就会出现重复的Object类,给开发人员造成很大的困扰,本来就只需要基于JDK开发就好了,现在还得把JDK中的类全记住,避免编写重复的类。当存在双亲委派机制时,整个事情就不一样了,每次加载类时,都会遵循双亲委派机制,去问父类是否可以加载,如果可以呢,那就不需要再次加载了,这样事情就简单了。

qq_41119146的博客 1111

浅谈功放PA的VBW

摘要:VBW(视频带宽)反映功放的宽带非线性特性和记忆效应,影响数字预失真(DPD)校正能力。其成因是功放管寄生参数(如Cshunt和Leff)形成低频并联谐振,导致供电臂阻抗增大,引发电压波动和记忆效应。测试方法包括双音IM3/IM5测试(以两侧IM3差≥3dB定义VBW)和魔T测试(通过S21曲线测量谐振频率)。改善措施主要是减小Leff,如采用双电源平衡馈电。VBW指标要求通常为魔T测试结果大于3倍信号带宽,以确保功放线性度。

weixin_49761275的博客 1572

摸鱼JVM - 执行引擎

前面介绍过类加载器子系统运行时数据区(也就是内存相关)执行引擎前几章我们简单的梳理了一下JVM的类加载机制及运行时数据区,今天我们来聊聊JVM执行引擎.如无特殊说明, 所有描述JVM的特性均特指HotSpot VMHotSpot中采用的是解释器+JIT即时编译器混合.好处在Java程序运行时,JVM可以快速启动,前期先由解释器发挥作用,不需要等到编译器把所有字节码指令编译完之后才执行,这样可以省去很大一部分的编译时间;...

CTO技术的博客 563

压电传感器信号放大难题?用运放设计电荷放大器的5个关键步骤

本文详细解析了压电传感器信号放大难题,并提供了用运放设计电荷放大器的5个关键步骤。从电压放大到电荷放大的范式转换,到运放选型、反馈网络设计、PCB布局及频响特性验证,帮助工程师解决工业自动化中的信号衰减问题,提升测量精度和稳定性。

weixin_27303545的博客 446

基于N32G003的PMBus从机协议栈设计与STM32F103模拟I2C主机通信实战

本文详细介绍了基于N32G003微控制器设计PMBus从机协议栈,并与STM32F103模拟I2C主机进行通信的实战方案。重点阐述了中断驱动架构、命令解析、CRC8优化及超时恢复机制,实现了在70kHz速率下稳定可靠的工业电源管理通信,适用于服务器电源、通信基站等成本敏感应用场景。

numpy6sculptor的博客 919

【java】走进JVM,浅水也能摸鱼

这不是一篇描述jvm是什么的文章,也不介绍jvm跨平台的特性,也不是讲述jvm安全特性的文章,更不是讲解jvm指令操作,数据运算的文章,本文重点讲述类型的生命周期。 类型的生命周期涉及到:类的装载、jvm体系结构、垃圾回收机制。 为什么要讲jvm体系结构?因为类的装载和垃圾回收机制都和jvm体系结构息息相关。 那么什么是jvm体系结构呢? 当jvm运行起来的时候,它会向系统申请一片内存

Coder,梦到了梦 829

从静态到动态:如何用Deformable 3DGS和4DGS实现高效动态场景建模

本文深入探讨了Deformable 3DGS和4DGS在动态场景建模中的技术突破,详细解析了这两种方法如何高效处理动态内容。Deformable 3DGS通过引入时间维度的变形场扩展传统3DGS,而4DGS则采用四维时空体素分解方法,两者均显著提升了动态场景建模的效率和质量,适用于虚拟现实、增强现实等应用场景。

weixin_29063035的博客 433

摸鱼JVM - 几个常识概念启蒙 (老鸟请跳过)

JDK, JRE, JVM这几个概念很容易搞晕, 其实, 哪怕是JAVA老手也不一定能理清这些, 所以, 咸鱼还是简单的过下这几个概念.

CTO技术的博客 260

多模态大模型:技术原理与实战 全球多模态大模型介绍

关键词:多模态大模型、深度学习、计算机视觉、自然语言处理、跨模态学习、迁移学习、人工智能随着人工智能技术的飞速发展,多模态大模型已经成为了当前AI领域最热门的研究方向之一。多模态大模型能够同时处理和理解多种类型的数据,如文本、图像、音频和视频等,这为AI系统在复杂场景下的应用提供了更加强大和灵活的能力。本文将深入探讨多模态大模型的技术原理,介绍其实战应用,并对全球主要的多模态大模型进行全面的介绍和比较。

AI天才研究院 4265

使用 Simulink 实现基于相控阵雷达的波束形成技术

摘要:本文详细介绍了利用MATLAB Simulink和Phased Array System工具箱实现相控阵雷达波束形成的完整流程。主要内容包括:1)创建Simulink模型;2)设计天线阵列参数;3)信号生成模块配置;4)波束形成算法实现;5)结果可视化方法;6)仿真调试与优化;7)代码导出与部署。通过分步指导,读者可以掌握从理论到实践的完整开发流程,包括关键参数设置和算法实现示例。该方案适用于军事、气象等领域的雷达系统开发,并支持后续嵌入式和智能算法集成。

xiaoheshang_123的博客 179

JVM 面试问题,背完去面试(面试篇 一)

首先声明,该博客用于对JVM有了解的人,本文也是根据B站某班的老师讲的内容,进行了总结。将概念理论,大家自己去查找,我也可以发你地址(很多视频,不说讲的不好,实在是在摸鱼,纯粹浪费时间,而有些博客写的实在是看不下去,还是错的)。 基于我自己的理解,做了一些简单的总结,你可以背完去面试,但是不建议。很多东西你得有自己的认识,下面涉及的很多概念,都需要一定的基础。 - 谈谈你对JVM的认识。题目很大,等于没问 1. 首先,JVM(Java Virtual Machine)java虚拟机,但是也不能说只能运

dadachenchen的博客 467

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java虚拟机概述

导读:我们写了一行Java语言的代码,那么这行代码执行的时候到底发生了什么事情,就需要我们对Java虚拟机以及背后的运行机制有深入的理解,本文只是作为复习资料做一个笼统的介绍。学习JVM需要一些前置知识,这些知识包括计算机组成原理、操作系统;如果想深入理解的理解JVM,可以看周志明的《深入理解JAVA虚拟机》以及《Java虚拟机规范》、《Java语言规范》;本文仍旧希望能说清楚JVM内在演变逻辑。...

weixin_47267435的博客 52

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

上班摸鱼在群里吹牛B,逮到一个华为10年老Java开发,聊过之后收益良多...

接私活 对程序员这个圈子来说是一个既公开又隐私的话题,不说全部,应该大多数程序员都有过想要接私活的想法,当然,也有部分得道成仙的不主张接私活。但是很少有人在公开场合讨论私活的问题,似乎都在避嫌。就跟有人下班后跑滴滴一样,程序员私有时间接点活挣点钱不也很正常么,不过不要在上班时间就行,就跟你上班期间出去跑滴滴一样。 但是我是不建议接私活的,接私活会浪费自己在一大部分的精力,就算不接私活,利用好工作后的八小时也能比别人强,月薪也绝对不会比那些接私活的少。 把有限的时间花在提升自己的能力上,技术深度,技术广度

qq_42986622的博客 812

上班摸鱼在群里吹牛B,逮到一个华为10年老Java开发,聊过之后收益良多

这份面试题几乎包含了他在一年内遇到的所有面试题以及答案,甚至包括面试中的细节对话以及语录,可谓是细节到极致,甚至简历优化和怎么投简历更容易得到面试机会也包括在内!也包括教你怎么去获得一些大厂,比如阿里,腾讯的内推名额!某位名人说过成功是靠99%的汗水和1%的机遇得到的,而你想获得那1%的机遇你首先就得付出99%的汗水!你只有朝着你的目标一步一步坚持不懈的走下去你才能有机会获得成功!成功只会留给那些有准备的人!

2401_84003839的博客 778

外包干了四年,今天分手了

这是来自一位粉丝的投稿内容如下: 先说一下自己的个人情况,大专毕业,18年通过校招进入湖南某外包公司,干了接近4年的CRUD,马上2022年了,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的CRUD,已经让我变得不思进取,谈了3年的女朋友也因为我的心态和工资和我分手了。于是,我决定要改变现状,放眼于明年的金三银四! 刚开始准备时,自己都蒙了,接近年的CRUD让我的技术没有一丝的进步,提升的只有我的年龄... 没办法,我找到了我在阿里P7的学长,作为他的

m0_64262620的博客 280

不愧是 GitHub 上标星 120K 的Java手册,内容不多,只讲重点

今天日常摸鱼的时候在 GitHub 上发现了这份标星 120K 的 Java 手册(现已标星 129k), 里面涵盖了 Java 所有的知识点,包括基础知识、Java 集合、JVM、多线程并发、spring 原理、微服务、Netty 与 RPC 、Kafka、日记、设计模式、Java 算法、数据库、Zookeeper、分布式缓存、数据结构等等, 内容不多,只讲重点。 为了帮助大家更好的学习,现将这份资料免费分享出来,希望对需要的小伙伴有帮助哦 不论是用于巩固基础,还是在面试中提高竞争力都可以收

gu1857035894的博客 410

每天突击学习五分钟,24年春招Java面试不发愁

内卷可以说是2023年最火的一个词了。2024年还没开始,在很多程序员网站看到很多Java程序员的2023年度总结都是:Java越来越卷了(手动狗头),2023年是被卷的一年。前有几百万毕业生虎视眈眈,后有在职人员带头“摸鱼”占着坑位,加上疫情让很多公司倒闭,市面上根本没那么多就业岗位。自然而然HR们就开始优中选优,计划内卷矛盾!那么如何在众多的应聘者中脱颖而出呢?答案之一就是要摸清现在互联网公司的面试套路!

知识分享官 1010

神技!清华大佬联合十多名Java架构大神纯手打的Java面试突击手册开源

内卷可以说是2022年最火的一个词了。2022年刚开始,在很多程序员网站看到很多Java程序员的2021年度总结都是:Java越来越卷了(手动狗头),2021年是被卷的一年。前有几百万毕业生虎视眈眈,后有在职人员带头“摸鱼”占着坑位,加上疫情让很多公司倒闭,市面上根本没那么多就业岗位。自然而然HR们就开始优中选优,计划内卷矛盾!那么如何在众多的应聘者中脱颖而出呢?答案之一就是要摸清现在互联网公司的面试套路!我们以大厂为例,他们的面试题都长这样:你来随意讲一个集合框架整体框架。

老男孩的架构路 577

没想到大厂里面月薪70K的大佬竟然这么低调

引言 实在没想到,在某大厂月薪70K的大佬竟然如此低调,闲话少说,直接上图 刚开始认识这个大佬的时候,没什么特别深的印象,平常的时候也和我们在一起水群,摸鱼,啥都干,也没事的时候来课堂上上课,录播有时候也会要,直到他报名,我们才知道这个大佬有多牛逼~巨佬尚且求知,蝼蚁安知天命? 这个巨佬现在进军的方向是音视频由此可以得到一个有用的信息,关于音视频这一块是有巨大发展潜力的,这一点是毋庸置疑的,所以为了更快的跟上大佬的脚步,大家一定要找准方向c 关于面试资料以及相关音视频,架构资料和Android进

Androidbye的博客 234

Java 多线程系列Ⅴ(常见锁策略+CAS+synchronized原理)

常见锁策略+CAS+synchronized原理

LEE180501的博客 612

【JVM】对象内存布局

HotSpot JVM 中,Java 对象内存布局由对象头(12字节,含Mark Word与压缩Klass Pointer)、实例数据及对齐填充构成,总大小为8字节倍数。对象头支持锁状态动态复用,指针压缩使引用仅4字节,但堆超32GB时失效。实例字段按类型优先级重排序以减少间隙,最小对象大小为16字节。通过JOL工具可精准验证布局,理解锁机制、GC、伪共享等底层行为。

2301_79732484的博客 147

内存数据库SQLite

本文以“黑板”比喻内存数据库,对比传统硬盘数据库,详解 SQLite 使用 :memory: 实现高速临时存储的原理与优势。通过动态占位符生成、executemany 批量操作等技巧,实现毫秒级数据读写,适用于单元测试、临时计算与隐私保护场景。强调其瞬时性与内存限制,提醒开发者注意数据量控制与安全防护,突出参数化查询防注入的核心价值。

看了都说刑的博客 313
上一篇: 摸鱼JVM - 类加载机制
下一篇: 46. 从零开始学springboot: spel结合aop实现动态传参
码哥说
博客等级 码龄8年 5645粉丝 172原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码哥说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值