自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Exception in thread “main“ java.lang.IllegalArgumentException: System memory 259522560 must be at le

解决:设置应用程序的 VM optionsidea的设置路径在:Run -Edit Configurations-Application选择对应的程序,设置VM options,如下:-Xms256m -Xmx1024m问题解决

2021-09-14 10:06:52 359

转载 class文件的常量池类型标识不连续的问题

请问java 的class文件的常量池的Constant Type为什么没有值为2的tag?是有什么特别的用处吗?确实,看Java SE 7版的JVM规范,里面对常量池项的tag的定义是:tag值的范围是[1, 3-12, 15-16, 18]可以看到中间没有2、13、14、17。其实这些空缺的号码都曾经存在,但随着研发过程的推进发现它们的设计不够合理,为了避免兼容性问题,直接把这些号码废除掉,然后向后使用更大的号码来放新类型。在JVM规范的早期版本的草案里是有tag值为2...

2021-05-12 09:15:50 221

原创 标准浮点格式

IEEE 754标准准确定义了单精度和双精度浮点格式,并为这两种基本格式分别定义了扩展格式,如下所示:单精度浮点格式(32位)。双精度浮点格式(64位)。扩展单精度浮点格式(>=43位,不常用)。扩展双精度浮点格式(>=79位,一般情况下,Intel x86结构的计算机采用的是80位,而SPARC结构的计算机采用的是128位)。单精度浮点格式单精度浮点格式共32位,其中,s、exp和frac段分别为1位、k=8位和n=32位,如图6所示。其中,32位中第0位存放小数段frac

2021-04-26 20:39:01 1647

原创 19.删除链表的倒数第N个节点

思路:计算数组长度 删除倒数第N个节点,就是删除正数第length-N+1个。 删除正数第length-N+1个节点,需要找到正数第length-N个节点。此时会出现一个问题,没有第0个节点。此时一个技巧就出现了,我们可以创建一个dummy空节点插入到链表的头结点前面。就完美的简化解决了这个问题。因为避免了边界条件的考虑。public class Solution{ public ListNode removeNthFromEnd(ListNode head, int n){ ..

2021-04-23 21:38:51 75

原创 143.重排链表

先写一个递归的方式(效率非常低,遍历次数过多):class Solution{ public void reorderList(ListNode head){ //特殊情况判断,也防止发生NullPointerException; if(head == null || head.next == null || head.next.next == null){ return; } ListNode cur..

2021-04-22 17:04:52 69

原创 876.链表的中间节点

方法一:数组法题目给定节点在100个以内,所以用正常的数组和ArrayList都行。Class Solution{ public ListNode middleNode(ListNode head){ List<ListNode> arr = new ArrayList(); int len = 0; while(head!=null){ arr.add(head); len++;

2021-04-22 10:05:43 97

原创 链接(Linking)阶段

Verification(验证):保证加载的字节码是符合规范的。验证的过程比较琐碎,也比较复杂。大致分为4个阶段格式检查 语义检查 字节码验证 符号引用验证----魔数检查、版本检查、长度检查----是否继承final、是否有父类、抽象方法是否有实现----跳转指令是否指向正确的位置、操作数据的类型是否正常----符号引用的直接引用是否存在注意:验证阶段无法通过检查,虚拟机不会正确加载这个类。但是通过了这个阶段的检查,这个类仍然有可能有问题。Preparation(准

2021-04-20 08:56:32 329

原创 类加载步骤1、loading阶段

loading概述:就是将Java类的字节码文件加载到机器内存中,并在内存中构建类模板对象。从Java虚拟机的角度看,就是读取字节码文件,将相应的字节码文件封装为一个类对象装载完成的操作都有什么? 通过类的全名,获取类的二进制数据流。 将二进制数据流写出为方法区内的数据接口(Java类) 创建java.lang.Class类的实例,表示该类型。作为方法区这个类的各种数据的访问入口。 ...

2021-04-20 07:58:50 110

原创 206、反转数组

第一种:递归方式题解:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next =

2021-04-19 19:28:34 52

原创 Object

Object作为所有类的父类,是整个类层次结构的根.其中包括12个方法。常用11个。唯一不常用的是一个叫做registerNatives()的静态本地方法,此方法放在代码块中和整个类一起加载,应该是类似构造器初始化的功能。...

2021-04-19 08:01:03 62

原创 类字面量

类字面量是一个包含类、接口、数组或基本类型或者伪类型void,被class通过.跟随的表达式。C.class的类型是class,其中C是类、接口或数组类型。p.class的类型是B,其中p是基本数据类型的名字,B是类型p 装箱转换后表达式的类型。void.class的类型是void。如果命名类型是一个变量或参数或元素是变量或参数类型的数组的类型,这会是一个编译时错误。如果命名类型没有指明可访问的类型,并且类字面量出现的地方不在作用域内,这会是一个编译时错误。类字面量指向的是指定类型的类对象,这.

2021-04-18 19:01:10 252

原创 java中的基本数据类型(Primitive Types)

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210418151306865.png?v8 =1000x250x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMTg1NzYy,size_16,color_FFFFFF,t_70)

2021-04-18 15:18:34 380

原创 类的加载过程概述概述

在Java中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载。按照Java虚拟机规范,从class文件到加载到内存中的类,到类卸载出内存位置,它的整个生命周期包括如下7个阶段:也就是大致分为加载--链接--初始化--使用--卸载五个阶段,其中链接(Linking)环节还包括验证(Verification)--准备(Preparation)--解析(Resolution)三个重要步骤。从程序中,类的使用过程看:在链接之前会先判断是否加

2021-04-16 16:26:58 58

原创 GC日志补充说明

2021-04-16 14:38:45 59

原创 显示GC日志的参数

内存分配与垃圾回收的参数列表:-XX:+PrintGC 输出GC日志。类似:-verbose:gc -XX:+PrintGCDetails 输出GC的详细日志 -XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式) -XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如2013-05-04T21:53:59.234+0800) -XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息 -.

2021-04-16 14:26:15 99

原创 7款经典垃圾回收器总结

截止JDK1.8,一共有7款不同的垃圾收集器。每一款不同的垃圾收集器都有不同的特点,在具体使用的时候,需要根据具体的情况选用不同的垃圾收集器。垃圾回收器 分类 作用位置 使用算法 特点 使用场景 Serial 串行运行 新生代 复制算法 相应速度优先 适用于单CPU场景下的client模式 ParNew 并行运行 新生代 复制算法 响应速度优先 多CPU场景下Server模式,配合CMS使用 Paral

2021-04-16 14:13:28 137

原创 G1垃圾回收的优化建议

G1回收过程:补充从Oracle官方透漏出来的信息可以知道,回收阶段(Evacuation)其实本也有想过设计成与用户程序一起并发执行,但这件事情做起来比较复杂,考虑到G1只是回收一部分Region,停顿时间是用户可控制的,所以并不迫切去实现,而是选择把这个特性放到了G1出现之后的低延迟垃圾收集器(即ZGC)中。另外,还考虑到G1不仅仅是面向低延迟,停顿用户线程能够最大幅度的提高垃圾回收效率,为了保证吞吐量所以才选用了完全暂停用户线程的实现方案。G1优化相关建议:年轻代大小避免使用-Xmn或-

2021-04-16 13:51:52 173

原创 G1回收详细过程

G1回收过程1:年轻代GC第一阶段,扫描根:根是只static变量指向的对象,正在执行的方法调用链条上的局部变量等。根引用连同RSet记录的外部引用作为扫描存活对象的入口。第二阶段,更新Rset:处理dirtycardqueue(下面说明)中的card,更新RSet。此阶段完成后,RSet可以准确的反映老年代对所在的内存分段中对象的引用。第三阶段,处理RSet:识别被老年代对象指向的Eden中的的对象,这些被指向的Eden中的对象被认为是存活的对象。第四阶段,复制对象:此..

2021-04-16 13:40:21 1280

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

G1GC的垃圾回收过程主要包括如下三个环节:年轻代GC(YoungGC) 老年代并发标记过程(ConcurrentMarking) 混合回收(MixedGC) 如果需要,单线程、独占式、高强度的FullGC还是继续存在的。它针对GC的评估失败提供了一种失败保护机制,即强力回收。应用程序分配内存,当年轻代的Eden区用尽时开始年轻代回收过程;G1的年轻代收集阶段是一个并行的独占式收集器。在年轻代回收期间,G1GC暂停所有的应用程序线程,启动多线程执行年轻代回收。然后从年轻代区间移动存活...

2021-04-15 20:06:26 445

原创 G1的参数设置

-XX:+UseG1GC手动使用G1收集器执行内存回收业务。 -XX:G1HeapRegionSize设置每个Region的大小。值是2的幂,范围是1MB到32MB之间,目标是根据最小的Java堆大小划分出约2048个区域。默认是堆内存的1/2000。 -XX:MaxGCPauseMillis 设置期望达到的最大GC停顿时间指标(JVM会尽力实现,但不能确保达到)。默认值是200ms。 -XX:ParallelGCThread 设置STW工作线程数的值。最多设置8 -XX:ConcGCThr...

2021-04-15 19:13:49 2686

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

G1垃圾回收器是在Java7update4之后新引入的一个新的垃圾收集器,是当今收集器技术的前沿成果之一。出现是为了适应现在不断扩大的内存和不断增加的处理器数量,从而进一步降低暂停时间(PauseTime),同时兼顾好的吞吐量。官方给G1设定的目标是在延迟可控的情况下尽可能获得高的吞吐量,所以才担当起”全功能收集器“的重任与期望。为什么名字叫GarbageFirst呢?首先,G1是一个并行收集器,它把堆内存分割为很多不同的区域(Region)(物理上是不连续的)。使用不同的Region...

2021-04-15 18:32:50 112

原创 Parallel Scavenge收集器:吞吐量优先

ParallelScavenge收集器,是年轻代中除了ParNew以外的另一款垃圾收集器,同样采用了并行回收、复制算法和”StopTheWorld“机制。 那么它和ParNew的区别?和ParNew收集器不同,ParallelScavenge收集器的目标是达到一个可控制的吞吐量(Throughput),它也被称为吞吐量优先的垃圾收集器。自适应调节策略也是ParallelScavenge与ParNew的一个重要区别。高吞吐量可以高效的利用CPU时间,尽快完成程序的运算任务,(意味着暂停时...

2021-04-15 15:32:11 811 1

原创 ParNew垃圾收集器

可以理解为ParNew收集器是Serial收集器的多线程版本。Par是Parallel的缩写,New说明只能处理的是新生代。 ParNew收集器和Serial收集器非常相似,区别只有ParNew采用的是并行垃圾收集。ParNew在新生代中也是采用复制算法、”StoptheWorld“机制。 ParNew是很多JVM运行在Server模式下新生代默认的垃圾收集器。对于新生代,回收次数频繁,使用并行方式高效。对于老年代,回收次数少,使用串行方式节省资源。(CPU并行需要切换线程,串行可以省去切..

2021-04-15 14:32:03 252

原创 Serial与Serial Old垃圾回收器

Serial收集器是最基本、历史最悠久的垃圾收集器。JDK1.3之前回收新生代的唯一选择。(2000年5月发布) Serial收集器作为HotSpot中client模式下默认的新生代垃圾收集器。 Serial收集器采用复制算法、串行回收和”Stop-The-World“机制的方式执行内存回收。 除了年轻代外,Serial收集器还提供用于执行老年代垃圾收集的SerialOld收集器。SerialOld收集器同样也采用了串行回收和”Stop-The-World“的机制,只不过内存回收算法是标记-压缩算..

2021-04-15 14:07:31 331

原创 System.gc()的理解

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

2021-04-14 16:23:14 205

原创 分区算法的说明

一般来说,在相同条件下,堆空间越大,一次GC所需要的时间也越长,有关GC产生的停顿也越长。为了更好的控制GC产生停顿的时间,将一块大的内存区域分割成多个小块,根据目标的停顿时间,每次合理地回收若干小区间,而不是整个堆空间,从而减少一次GC所停顿的时间。分带算法将按照对象的生命周期划分成两个部分,分区算法将整个堆空间划分成连续的不同小区间。每一个小空间都独立使用,独立回收。这种算法的好处是可以控制一次回收多少个小区间。现在介绍的都是基本的算法思路,GC实现过程要复杂的多,目前还在发展中的前沿G

2021-04-14 15:23:19 119

原创 增量收集算法原理及优缺点

上述现有的算法,在垃圾回收过程中,应用软件将处于一种StoptheWorld的状态。在StopTheWorld状态下,应用程序所有的线程都会挂起,暂停一切的正常工作,等待垃圾回收的完成。如果垃圾回收时间过长,应用程序会被挂起很久,将严重影响用户体验或者系统的稳定性。为了解决这个问题,即对实时垃圾收集算法的研究直接导致了增量收集(IncrementalCollecting)算法的诞生。基本思想:如果一次性将所有垃圾进行处理,需要造成系统长时间的停顿,那么我们可以让垃圾收集线程饿应用线程交替执...

2021-04-14 15:13:09 429

原创 分代收集算法

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

2021-04-14 14:57:57 221

原创 不同指标上对比三种算法

效率上,复制算法最快,但消耗了太多内存。(空间换时间的思想)不考虑实际条件约束的情况下,我们希望有一种垃圾回收算法速度最快、空间开销小、回收后内存空间整齐。 Mark-Sweep Mark-Compact Copying 内存是否整齐 否 整齐 整齐 空间开销 小 小 大 速度 中等 慢 快 可以发现复制算法两项指标都很完美,但耗费的额外空间是在太大,只能在在垃圾对象比较多的,存活对象比较少的时候使用。而标记-.

2021-04-14 14:35:02 502 1

原创 标记-压缩算法原理及优缺点

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

2021-04-14 14:18:35 1244

原创 复制算法原理及优缺点

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

2021-04-14 13:52:44 989

原创 标记-清除(Mark - Sweep)算法

背景:标记-清除算法(Mark-Sweep)是一种非常基础和常见的垃圾收集算法(人们会产生的常规想法),该算法被J.McCarthy等人在1960年提出并应用于Lisp语言。执行过程:当堆中的有效内存空间(availiablememory)被耗尽的时候,会停止整个程序(也成stoptheworld),然后进行两项工作,第一项是标记,第二项则是清除。标记:Collector从引用根节点开始遍历,标记所有被引用的对象。一般是在对象的Header中记录为可达对象。 清除:Collector...

2021-04-14 10:53:23 1871

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

可达性分析(或跟搜索算法、追踪性垃圾收集)相对于引用计数算法而言,可达性分析算法不仅同样具备实现简单和高效等特点,更重要的是该算法可以有效的解决在引用计数算法中循环引用的问题,防止内存泄露的发生。 相较于引用技术算法,这里的可达性分析就是Java、C#选择的。这种类型的垃圾回收通常也叫做追踪性垃圾收集(TracingGrabageCollection)。所谓”GCRoots“根集合就是一组必须活跃的引用。 基本思路:可达性分析算法是以根节点对象集合(GCRoots)为起始点,按照从上...

2021-04-13 19:00:50 291

原创 引用计数法的原理和优缺点

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

2021-04-13 15:40:16 5713 1

原创 java自动内存管理介绍

自动内存管理,无需开发人员手动参与内存的分配和回收,这样降低了内存泄露和内存溢出的风险。 自动内存管理,将开发人员从繁重的内存管理中释放出来,可以更专心地专注于业务开发。自动内存管理引发的忧虑和解决办法:对Java开发人员而言,自动内存管理就像一个黑匣子,如果过度依赖自动,那这可能会是一场灾难,最严重的就是会弱化Java开发人员在程序出现内存溢出时定位问题和解决问题的能力。 那么解决这个问题的方法就是,了解JVM的自动内存分配和内存回收原理。在了解JVM是如何管理内存后,我们才能在遇见OOM时,快

2021-04-13 14:56:59 118

原创 早期的垃圾回收行为

在早期的C/C++时代,垃圾回收基本上是手工进行的。开发人员可以使用new关键字进行内存申请,并使用delete关键字进行内存释放。比如以下代码:这种方式可以灵活控制内存释放的时间,但是会给开发人员带来频繁申请和释放内存的管理负担。倘若有一处内存空间由于程序员的编码问题忘记被回收,那么就会产生内存泄露,垃圾对象永远无法被清除,随着系统运行时间的不断增长,垃圾对象所耗的内存可能持续上升,直至出现内存溢出并造成应用程序崩溃。有了垃圾回收机制后,上述代码块极有可能变成这样:现在,除了java以

2021-04-13 14:22:06 133 1

原创 什么是GC,为什么需要GC

什么是垃圾(Garbage)呢?垃圾是指程序运行过程中,没有任何指针指向的对象。 英语:An object is considered garbage when it can no longer be reached from any pointer in the running program.如果不及时对内存中的垃圾进行清理,那么这些对象会占有空间直至程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出。什么是GC,为什么需要GC?对于高级语言来说,一个基本的认知是,如果不进行

2021-04-13 14:07:14 457

原创 Java是按值传递还是按引用传递?

Java总是按值传递的。也就是说方法的到的是所有参数值的一个拷贝。例如:double percent = 10;harry.raiseSalary(percent);不管方法是如何实现的,在方法调用之后,percent的值还是10。下面我们来看java方法调用正确的过程:假定一个方法试图将一个参数值增加至3倍,并且调用它。public static void tripleValue(double x){ x = x * 3;}double percent = 10;

2021-04-13 13:13:11 107

原创 快速排序

快速排序的几种写法写法一:public class Solution{ private static final Random RANDOM = new Random(); public int[] sortArray(int[] nums){ int len = nums.length; quickSort(nums, 0, len - 1); return nums; } private void quick

2021-04-10 20:28:48 38

原创 JVM运行时参数

01-JVM参数选项类型类型一:标准参数选项特点:比较稳定,后序版本基本不会变化;以 -开头各种选项:运行java或者java -help可以看到所有的标准选项补充内容:-server与 -clientHotspotJVM有两种模式,分别是server和client,分别通过-server和-client模式设置。1.在32为Windows系统上,默认使用Client类型的JVM。要想使用Server模式,则机器配置至少有2个以上的CPU和2G以上的物理内存。client模式...

2021-04-09 19:45:48 156

空空如也

空空如也

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

TA关注的人

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