自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(15)
  • 收藏
  • 关注

原创 Java多线程中原子性、可见性、有序性以及竟态条件案例

线程原子性、可见性、有序性代码案例

2024-08-21 23:22:54 826

原创 理解 JVM 工作机制(十一) 类加载器

双亲委派模型是描述类加载器之间的层次关系。它要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。(父子关系一般不会以继承的关系实现,而是以组合关系来复用父加载器的代码)

2023-08-16 19:57:27 109 1

原创 理解 JVM 工作机制(十) 类加载机制和加载的过程

准备阶段是正式为类中定义的变量(即静态变量,被static修饰的变量)分配内存并设置类变量初始值的阶段,从概念上讲,这些变量所使用的内存都应当在方法区中进行分配,但必须注意到方法区本身是一个逻辑上的区域,在JDK7及之前,HotSpot使用永久代来实现方法区时,实现是完全符合这种逻辑概念的;() 方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static {} 块)中的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺序所决定的。直接引用是和虚拟机实。

2023-08-16 19:57:12 139 1

原创 理解 JVM 工作机制(九) 类文件结构

垃圾收集进行时,虚拟机虽然会对直接内存进行回收, 但是直接内存却不能像新生代、老年代那样,发现空间不足了就通知收集器进行垃圾回收, 它只能等老年代满了后 Full GC,然后“顺便”帮它清理掉内存的废弃对象。在 32 位 JDK 上,1.6G 分配给堆,还有一部分分配给 JVM 的其他内存,直接内存最大也只能在剩余的 0.4G 空间中分出一部分, 如果使用了 NIO,JVM 会在 JVM 内存之外分配内存空间,那么就要小心“直接内存”不足时发生内存溢出异常了。

2023-08-16 19:56:58 120 1

原创 理解 JVM 工作机制(八) JVM 性能调优

垃圾收集进行时,虚拟机虽然会对直接内存进行回收, 但是直接内存却不能像新生代、老年代那样,发现空间不足了就通知收集器进行垃圾回收, 它只能等老年代满了后 Full GC,然后“顺便”帮它清理掉内存的废弃对象。在 32 位 JDK 上,1.6G 分配给堆,还有一部分分配给 JVM 的其他内存,直接内存最大也只能在剩余的 0.4G 空间中分出一部分, 如果使用了 NIO,JVM 会在 JVM 内存之外分配内存空间,那么就要小心“直接内存”不足时发生内存溢出异常了。

2023-08-16 19:56:47 131 1

原创 理解 JVM 工作机制(七) 内存分配和回收策略

如果不成立,则虚拟机会查看 HandlePromotionFailure 值是否设置为允许担保失败, 如果是,那么会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小, 如果大于,将尝试进行一次 Minor GC,尽管这次 Minor GC 是有风险的;对象通常在Eden区诞生,如果经过第一次Minor GC后仍然存活,并且能被Survivor区容纳的话,该对象会移动到Survivor区,并且它的年龄计数器会+1,每经历过一次Minor GC,对象年龄就增加1岁。这个过程就是分配担保。

2023-08-13 15:33:11 95 1

原创 理解 JVM 工作机制(六) 垃圾收集器

为了在 GC Roots Tracing 的时候避免扫描全堆,在每个 Region 中,都有一个 Remembered Set 来实时记录该区域内的引用类型数据与其他区域数据的引用关系(在前面的几款分代收集中,新生代、老年代中也有一个 Remembered Set 来实时记录与其他区域的引用关系),在标记时直接参考这些引用关系就可以知道这些对象是否应该被清除,而不用扫描全堆的数据。单个 GC 需要花更多的时间来完成,从而导致更高的暂停时间。并发标记与并发清除过程耗时最长,且可以与用户线程一起工作,因此,

2023-08-13 15:32:57 60 1

原创 理解JVM工作机制(五)垃圾回收算法

为了解决效率问题,一种称为“复制”(Copying)的收集算法出现了,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一一块。当这一块的内存用完了 ,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。老年代的对象一般寿命比较长,因此每次垃圾回收会有大量对象存活,如果采用复制算法,每次需要移动大量存活的对象,效率很低。

2023-08-13 15:32:43 79 1

原创 理解 JVM 工作机制(四) 回收策略

如果对象被判定为有必要执行 finalize() 方法,那么对象会被放入一个 F-Queue 队列中,虚拟机会以较低的优先级执行这些 finalize()方法,但不会确保所有的 finalize() 方法都会执行结束。任何一个对象的 finalize() 方法只会被系统自动调用一次,如果对象面临下一次回收,它的 finalize() 方法不会被再次执行,想继续在 finalize() 中自救就失效了。如果没有,那么就会被垃圾收集器清除。若一个对象不被任何对象或变量引用,那么它就是无效对象,需要被回收。

2023-08-10 12:37:27 59 1

原创 理解JVM工作机制(三)对象的内存布局

元空间是保存元数据的地方元数据:描述数据的数据例如一部电影,导演:—、主演:—、投资方:—,这些信息中的导演、主演、投资方就叫元数据,他们加一起描述了整部电影的详细数据那么在元空间里面保存的就是类的元数据,如方法、字段、类、包的描述信息,这些信息可以用于创建文档、跟踪代码中的依赖性、执行编译时检查。

2023-07-29 16:13:18 48

原创 理解JVM工作机制(二) 对象的创建

普通对象的创建时,JVM接收到new指令,会先去常量池检查是否有符号引用,如果有会检查类是否加载、解析和初始化过。如果没有就会先执行类的加载。下一样,空闲内存和使用中的内存是各自一边的,中间使用的是一个指针分界点来区分。那么分配内存就是仅仅把指针汪空闲内存移动了和对象大小相等的距离。Java通过在虚拟机中维护了一个列表,里面记录了哪些内存块是可用的,在分配内存大小的时候就从列表中找到一块足够大的空间划分给对象实例。假设在分配对象内存的时候,内存的大小是确定的。如果堆中的内存不是规整的而是相互交错的呢?

2023-07-29 16:13:03 53

原创 理解JVM工作机制(一) JVM内存区域

Java 虚拟机栈的栈顶的栈帧是当前正在执行的活动栈,也就是当前正在执行的方法,PC 寄存器也会指向这个地址。只有这个活动的栈帧的本地变量可以被操作数栈使用,当在这个栈帧中调用另一个方法,与之对应的栈帧又会被创建,新创建的栈帧压入栈顶,变为当前的活动栈帧。堆的大小既可以固定也可以扩展,但对于主流的虚拟机,堆的大小是可扩展的,因此当线程请求分配内存,但堆已满,且内存已无法再扩展时,就抛出 OutOfMemoryError 异常。方法结束后,当前栈帧被移出,栈帧的返回值变成新的活动栈帧中操作数栈的一个操作数。

2023-06-09 00:34:08 141

原创 使用Elasticsearch进行分组聚合统计

使用Elasticsearch进行分组聚合统计

2023-05-18 17:32:09 8693 1

原创 Docker Redis -主从配置

本地新建一个redis目录, 用于挂载redis.config 和 data。salve节点配置文件 - redis-slave.conf。master节点配置文件 - redis.conf。登陆主节点redis容器查看主从配置是否生效。查看redis master的内部IP。使用Docker拉取Redis。重启redis-salve节点。

2023-03-20 21:57:56 202

原创 慢接口分析-解决思路

排查工具:logstore、skywalking、Arthas。从下游到上游依次查看日志排查、应用日志、GC日志、系统日志。查看方法内部调用路径,并输出方法路径上的每个节点上耗时。I/O型 (涉及网络、磁盘IO的任务)Arthas快速安装。

2023-03-14 10:20:41 225 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除