自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 jsf中文使用教程

jsf中文使用教程。

2024-04-18 21:52:36 56

原创 jsf学习资料

jsf学习资料。

2024-04-18 21:50:09 16

原创 primefaces 中文文档

primefaces 中文文档。

2024-04-14 21:05:00 85

原创 JUC之 AbstractQueuedSynchronizer之AQS

AbstractQueuedSynchronizer之AQS

2023-08-08 20:25:42 236

原创 JUC之 ReentrantLock、ReentrantReadWriteLock、StampedLock

ReentrantLock、ReentrantReadWriteLock、StampedLock

2023-08-08 20:23:23 229

原创 JUC之Java对象内存布局和对象头

Java对象内存布局和对象头

2023-08-08 09:18:10 180

原创 JUC之ThreadLocal

ThreadLocal 深度解析

2023-08-07 16:36:18 539

原创 JUC之CAS

CAS

2023-08-07 11:29:36 73

原创 JUC之线程中断与LockSupport

线程中断与LockSupport

2023-08-06 20:56:25 123

原创 JUC之 “volatile“

volatile

2023-08-06 10:39:23 105

原创 JUC之JMM(Java内存模型)

Java内存模型

2023-08-05 11:06:40 139

原创 JUC之线程基础

JUC-线程基础

2023-08-03 16:14:46 89

原创 JUC之Java “锁“

Java的那些”锁“事

2023-08-02 21:47:14 138

原创 JUC之synchronized锁升级

sychronized的锁升级

2023-08-01 20:36:52 277

原创 方法返回地址与一些附加信息

**存放调用该方法的pc寄存器的值。**一个方法的结束,有两种方式:正常执行完成出现未处理的异常,非正常退出无论通过哪种方式退出,在方法退出后都返回到该方法被调用的位置.方法正常退出时,调用者的pc计数器的值作为返回地址,即调用该方法的指令的下一条指令的地址。而通过异常退出的,返回地址是要通过异常表来确定,栈帧中一般不会保存这部分信息。当一个方法开始执行后,只有两种方式可以退出这个方法:执行引擎遇到任意一个方法返回的字节码指令(return),会有返回值传递给上层的方法调用者,简称正常完成出口

2022-05-10 16:13:50 112

原创 方法调用:解析与分配

在JVM中,将符号引用转换为调用方法的直接引用与方法的绑定机制相关链接静态链接当一个字节码文件被装载进JVM内部时,如果被调用的目标方法在编译期确定,且运行期保持不变时,这种情况下将调用方法的符号引用转换为直接引用的过程称之为静态链接动态链接如果被调用的方法在编译期无法被确定下来,也就是说,只能够在程序运行期将调用的方法的符号转换为直接引用,由于这种引用转换过程具备动态性,因此也被称之为动态链接。绑定机制对应的方法的绑定机制为:早期绑定(Early Binding)和晚期绑定(Late Bin

2022-05-10 16:09:42 105

原创 动态链接原理

动态链接动态链接、方法返回地址、附加信息 : 有些地方被称为帧数据区每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接(Dynamic Linking)。比如:invokedynamic指令在Java源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(symbolic Reference)保存在class文件的常量池里。比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动

2022-05-10 16:00:58 443

原创 操作数栈原理

操作数栈操作数栈:Operand Stack每一个独立的栈帧除了包含局部变量表以外,还包含一个后进先出(Last - In - First -Out)的 操作数栈,也可以称之为 表达式栈(Expression Stack)操作数栈,在方法执行过程中,根据字节码指令,往栈中写入数据或提取数据,即入栈(push)和 出栈(pop)某些字节码指令将值压入操作数栈,其余的字节码指令将操作数取出栈。使用它们后再把结果压入栈比如:执行复制、交换、求和等操作操作数栈,主要用于保存计算过程的中间结果,同时作

2022-05-10 15:55:10 166

原创 局部变量表

局部变量表局部变量表:Local Variables,被称之为局部变量数组或本地变量表定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量这些数据类型包括各类基本数据类型、对象引用(reference),以及returnAddress类型。由于局部变量表是建立在线程的栈上,是线程的私有数据,因此不存在数据安全问题局部变量表所需的容量大小是在编译期确定下来的,并保存在方法的Code属性的maximum local variables数据项中。在方法运行期间是不会改变局部变量表的大小的。

2022-05-04 23:09:03 1175

原创 虚拟机栈以及栈原理

虚拟机栈概述由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。有不少Java开发人员一提到Java内存结构,就会非常粗粒度地将JVM中的内存区理解为仅有Java堆(heap)和Java战(stack)?为什么?首先栈是运行时的单位,而堆是存储的单位栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放,放哪里

2022-05-04 23:03:13 336

原创 程序计数器

介绍JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。在JVM规范中,每个线程都有它自己的程序计数

2022-05-03 15:48:37 230

原创 JVM系统线程

线程线程是一个程序里的运行单元。JVM允许一个应用有多个线程并行的执行。 在Hotspot JVM里,每个线程都与操作系统的本地线程直接映射。当一个Java线程准备好执行以后,此时一个操作系统的本地线程也同时创建。Java线程执行终止后,本地线程也会回收。操作系统负责所有线程的安排调度到任何一个可用的CPU上。一旦本地线程初始化成功,它就会调用Java线程中的run()方法。JVM系统线程如果你使用console或者是任何一个调试工具,都能看到在后台有许多线程在运行。这些后台线程不包括调用pu

2022-05-03 15:36:06 177

原创 运行时数据区概述

前言当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。结合JVM虚拟机规范,来探讨一下经典的JVM内存布局。我们通

2022-05-03 15:33:10 98

原创 强引用、软引用、弱引用、虚引用,终结器引用

Reference子类中只有终结器引用是包内可见的,其他3种引用类型均为public,可以在应用程序中直接使用强引用(StrongReference):最传统的“引用”的定义,是指在程序代码之中普遍存在的引用赋值,即类似“object obj=new Object()”这种引用关系。无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。软引用(SoftReference):在系统将要发生内存溢出之前,将会把这些对象列入回收范围之中进行第二次回收。如果这次回收后还没有足够的内存,

2022-05-02 18:09:27 111

原创 垃圾回收的并行与并发,安全点与安全区域

并行在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理器上运行。并发不是真正意义上的“同时进行”,只是CPU把一个时间段划分成几个时间片段(时间区间),然后在这几个时间区间之间来回切换,由于CPU处理的速度非常快,只要时间间隔处理得当,即可让用户感觉是多个应用程序同时在进行。并行当系统有一个以上CPU时,当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程互不抢占CPU资源,可以同时进行,我们称之为并行(Paralle1)。其实决

2022-05-02 18:03:42 162

原创 System.gc()的理解和内存溢出,内存泄漏,Stop The World

System.gc()在默认情况下,通过system.gc()或者Runtime.getRuntime().gc() 的调用,会显式触发FullGC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。然而system.gc() )调用附带一个免责声明,无法保证对垃圾收集器的调用。(不能确保立即生效)JVM实现者可以通过system.gc() 调用来决定JVM的GC行为。而一般情况下,垃圾回收应该是自动进行的,无须手动触发,否则就太过于麻烦了。在一些特殊情况下,如我们正在编写一个性能基准,我们

2022-05-02 17:55:28 2779

原创 垃圾回收之清除阶段:分代收集算法,增量收集算法,分区算法

分代收集算法前面所有这些算法中,并没有一种算法可以完全替代其他算法,它们都具有自己独特的优势和特点。分代收集算法应运而生。分代收集算法,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点使用不同的回收算法,以提高垃圾回收的效率。在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比如Http请求中的Session对象、线程、Socket连接,这类

2022-05-02 17:40:13 161

原创 垃圾回收之清除阶段:标记-整理算法

背景复制算法的高效性是建立在存活对象少、垃圾对象多的前提下的。这种情况在新生代经常发生,但是在老年代,更常见的情况是大部分对象都是存活对象。如果依然使用复制算法,由于存活对象较多,复制的成本也将很高。因此,基于老年代垃圾回收的特性,需要使用其他的算法。标记一清除算法的确可以应用在老年代中,但是该算法不仅执行效率低下,而且在执行完内存回收后还会产生内存碎片,所以JvM的设计者需要在此基础之上进行改进。标记-压缩(Mark-Compact)算法由此诞生。1970年前后,G.L.Steele、C.J.Che

2022-05-02 17:32:28 193

原创 垃圾回收之清除阶段:复制算法

背景为了解决标记-清除算法在垃圾收集效率方面的缺陷,M.L.Minsky于1963年发表了著名的论文,“使用双存储区的Lisp语言垃圾收集器CA LISP Garbage Collector Algorithm Using Serial Secondary Storage)”。M.L.Minsky在该论文中描述的算法被人们称为复制(Copying)算法,它也被M.L.Minsky本人成功地引入到了Lisp语言的一个实现版本中。核心思想将活着的内存空间分为两块,每次只使用其中一块,在垃圾回收时将正在使用

2022-05-02 17:27:35 93

原创 垃圾回收之清除阶段:标记-清除算法

清除阶段当成功区分出内存中存活对象和死亡对象后,GC接下来的任务就是执行垃圾回收,释放掉无用对象所占用的内存空间,以便有足够的可用内存空间为新对象分配内存。目前在JVM中比较常见的三种垃圾收集算法是标记一清除算法(Mark-Sweep)复制算法(copying)标记-压缩算法(Mark-Compact)标记-清除算法(Mark-Sweep)是一种非常基础和常见的垃圾收集算法,该算法被J.McCarthy等人在1960年提出并并应用于Lisp语言。标记-清除算法执行过程当堆中的有效内存空

2022-05-02 17:03:52 384

原创 对象的finalization机制

对象的finalization机制Java语言提供了对象终止(finalization)机制来允许开发人员提供对象被销毁之前的自定义处理逻辑。当垃圾回收器发现没有引用指向一个对象,即:垃圾回收此对象之前,总会先调用这个对象的finalize()方法。finalize() 方法允许在子类中被重写,用于在对象被回收时进行资源释放。通常在这个方法中进行一些资源释放和清理的工作,比如关闭文件、套接字和数据库连接等。注意永远不要主动调用某个对象的finalize()方法I应该交给垃圾回收机制调用。理由包括下

2022-05-02 16:56:46 119

原创 垃圾回收之标记阶段-可达性分析算法

可达性分析算法可达性分析算法:也可以称为 根搜索算法、追踪性垃圾收集相对于引用计数算法而言,可达性分析算法不仅同样具备实现简单和执行高效等特点,更重要的是该算法可以有效地解决在引用计数算法中循环引用的问题,防止内存泄漏的发生。相较于引用计数算法,这里的可达性分析就是Java、C#选择的。这种类型的垃圾收集通常也叫作追踪性垃圾收集(Tracing Garbage Collection)思路所谓"GCRoots”根集合就是一组必须活跃的引用。基本思路:可达性分析算法是以根对象集合(GCRoots

2022-04-30 20:15:18 358

原创 垃圾回收之标记阶段-引用计数算法

引用计数算法在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。那么在JVM中究竟是如何标记一个死亡对象呢?简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡。判断对象存活一般有两种方式:引用计数算法和可达性分析算法。引用计数算法(Reference Counting)比较简单,对每个对象

2022-04-30 16:48:33 102

原创 垃圾回收概述

什么是垃圾?垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序的结束,被保留的空间无法被其它对象使用,甚至可能导致内存溢出。大厂面试题蚂蚁金服你知道哪几种垃圾回收器,各自的优缺点,重点讲一下cms和G1?JVM GC算法有哪些,目前的JDK版本采用什么回收算法?G1回收器讲下回收过程GC是什么?为什么要有GC?GC的两种判定方法?CMS收集器与G1收集器的特点百度说一下GC算法

2022-04-30 16:30:34 55

原创 GC日志分析

通过阅读Gc日志,我们可以了解Java虚拟机内存分配与回收策略。 内存分配与垃圾回收的参数列表-XX:+PrintGc输出GC日志。类似:-verbose:gc-XX:+PrintGcDetails输出Gc的详细日志-XX:+PrintGcTimestamps 输出Gc的时间戳(以基准时间的形式)-XX:+PrintGCDatestamps 输出Gc的时间戳(以日期的形式,如2013-05-04T21:53:59.234+0800)-XX:+PrintHeapAtGC在进行Gc的前后打印出堆的信

2022-04-30 09:55:32 175

原创 垃圾回收器总结

截止JDK1.8,一共有7款不同的垃圾收集器。每一款的垃圾收集器都有不同的特点,在具体使用的时候,需要根据具体的情况选用不同的垃圾收集器。HotSpot虚拟机在JDK7/8后所有收集器及组合如下图怎么选择垃圾回收器Java垃圾收集器的配置对于JVM优化来说是一个很重要的选择,选择合适的垃圾收集器可以让JVM的性能有一个很大的提升。怎么选择垃圾收集器?优先调整堆的大小让JVM自适应完成。如果内存小于100M,使用串行收集器如果是单核、单机程序,并且没有停顿时间的要求,串行收集器如果是多CPU

2022-04-30 09:48:05 58

原创 G1回收过程

并发标记过程初始标记阶段:标记从根节点直接可达的对象。这个阶段是STW的,并且会触发一次年轻代GC。根区域扫描(Root Region Scanning):G1 GC扫描survivor区直接可达的老年代区域对象,并标记被引用的对象。这一过程必须在youngGC之前完成。并发标记(Concurrent Marking):在整个堆中进行并发标记(和应用程序并发执行),此过程可能被youngGC中断。在并发标记阶段,若发现区域对象中的所有对象都是垃圾,那这个区域会被立即回收。同时,并发标记过程中,会计算

2022-04-30 08:49:49 246

原创 G1回收过程-年轻代GC

年轻代GCJVM启动时,G1先准备好Eden区,程序在运行过程中不断创建对象到Eden区,当Eden空间耗尽时,G1会启动一次年轻代垃圾回收过程。YGC时,首先G1停止应用程序的执行(stop-The-Wor1d),G1创建回收集(Collection Set),回收集是指需要被回收的内存分段的集合,年轻代回收过程的回收集包含年轻代Eden区和Survivor区所有的内存分段。然后开始如下回收过程:第一阶段,扫描根根是指static变量指向的对象,正在执行的方法调用链条上的局部变量等。根引用连

2022-04-30 08:49:08 386

原创 G1垃圾回收器的回收过程

回收过程G1GC的垃圾回收过程主要包括如下三个环节:年轻代GC(Young GC)老年代并发标记过程(Concurrent Marking)混合回收(Mixed GC)(如果需要,单线程、独占式、高强度的FullGC还是继续存在的。它针对GC的评估失败提供了一种失败保护机制,即强力回收。)顺时针,young gc->young gc+concurrent mark->Mixed GC顺序,进行垃圾回收。应用程序分配内存,当年轻代的Eden区用尽时开始年轻代回收过程;G1的年轻代

2022-04-29 18:58:51 895

原创 G1回收器:区域化分代式

G1回收器既然我们已经有了前面几个强大的GC,为什么还要发布Garbage First(G1)?原因就在于应用程序所应对的业务越来越庞大、复杂,用户越来越多,没有GC就不能保证应用程序正常进行,而经常造成STW的GC又跟不上实际的需求,所以才会不断地尝试对GC进行优化。G1(Garbage-First)垃圾回收器是在Java7 update4之后引入的一个新的垃圾回收器,是当今收集器技术发展的最前沿成果之一。与此同时,为了适应现在不断扩大的内存和不断增加的处理器数量,进一步降低暂停时间(pause t

2022-04-29 18:44:40 325 1

jsf中文使用教程jsf中文使用教程

jsf中文使用教程jsf中文使用教程

2024-04-18

jsf学习资料jsf学习资料

jsf学习资料

2024-04-18

jpa示例源码,学习资料

jpa示例源码,学习资料

2024-04-18

primefaces 中文文档

primefaces 中文文档

2024-04-14

空空如也

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

TA关注的人

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