自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

月伴飞鱼

个人网站:http://hardyfish.top/

  • 博客(98)
  • 资源 (26)
  • 收藏
  • 关注

原创 毕业一年半拿遍所有大厂offer,我是怎么做到的?

最近一段时间面试了几家互联网公司,陆续通过了阿里、头条、美团,滴滴,京东的面试,基本上面试的公司都通过了,所以在这里想分享一些自己面试的经验给大家,希望能帮助大家拿到心仪的offer我的基本情况:19届本科,现在在一家小公司,毕业一年半,后端开发文章在牛客还挺受欢迎的,希望对大家有帮助牛客原地址:https://www.nowcoder.com/discuss/594676?source_id=profile_create_nctrack&channel=-1我在csdn上看到有人直接搬运

2021-04-02 13:16:20 1209 4

原创 Redis面试真题总结(一)

Redis是一个高性能的开源内存数据库系统,它使用键值对存储数据,并支持多种数据结构。例如,一个电商网站,用户下订单后,可以把订单任务放入Redis的消息队列。Redis将数据存储在内存中,而内存的读写速度比磁盘快几个数量级。Redis最常见的使用场景是作为内存职业键值存储来构建缓存。例如,可以缓存从数据库查询出来的数据,后面再需要这些数据时。由于Redis的高性能特性,也经常被用于构建实时系统。例如,一个在线游戏,可以使用Redis来存储用户的分数。来记录用户发布的消息数量,或者用户被赞的次数。

2024-09-19 09:53:01 455

原创 JVM面试真题总结(十三)

当下一次Minor GC发生时,JVM会再次检查Eden区和已经存有对象的Survivor区(例如:S0区)分代复制算法的基本思想是将新创建的对象分配到Eden区,当Eden区满时,触发一次Minor GC。这些策略的目的是尽可能将生命周期长的对象提前移入老年代,减少新生代的GC次数,提高系统的运行效率。而Survivor区的空间较小,主要用于存放从Eden区复制过来仍然存活的对象。需要注意的是,虽然两个Survivor区的总空间占新生代的2/10。,这种垃圾收集的频率较高,但每次收集的时间较短。

2024-09-18 09:58:25 459

原创 JVM面试真题总结(十二)

除了上述变化外,Java 8中的内存结构大致保持不变,包括Java堆、栈、程序计数器、本地方法栈等。Java堆主要用于存储对象实例,栈用于存储局部变量、方法调用等,程序计数器用于存储当前线程的执行位置。总的来说,永久代被移除是为了简化垃圾收集,避免内存溢出,提高性能,以及实现更好的内存控制和监控。而栈用于存储基本数据类型、对象引用变量和方法调用相关信息,大小固定,生命周期较短,访问相对较快。在实际应用中,我们需要关注元空间的内存使用情况,以便在需要时进行调整。)和JVM内存模型是两个不同的概念。

2024-09-17 09:59:40 644

原创 JVM面试真题总结(十一)

总的来说,Java内存模型主要解决了多线程环境下共享数据的一致性、可见性等问题,是Java并发编程的基础。这种模型的好处是,由于启动类加载器是最顶部的加载器,因此它加载的都是最可信任的类库(Java的核心类库)但是在运行时,JVM会优先使用由启动类加载器加载的Java核心类库中的String类。双亲委派模型是Java类加载器的一个重要特性,它可以确保Java核心库的类型安全。:设置元空间的初始大小(Java 8中替代了永久代的概念)。:设置永久代的最大大小(仅在Java 7及更早版本中使用)。

2024-09-16 09:52:58 963

原创 JVM面试真题总结(十)

当程序需要使用某个类时,如果这个类还没有被加载到内存中,那么系统就会通过类加载器来加载这个类。直接内存并不是Java虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。然而,要注意的是,虽然对象实例本身是在堆上分配的,但是对这些对象的引用通常是在栈上分配的。通过这种技术,JVM可以判断出一个新创建的对象的引用是否会逃逸出当前方法或者当前线程。一旦类被加载到内存中,就可以创建这个类的对象,或者调用这个类的静态方法和静态字段。JVM将会根据类的字节码中的指令,对类进行初始化。

2024-09-15 10:14:32 1388

原创 JVM面试真题总结(九)

而synchronized关键字在锁定和解锁时也会插入相应的内存屏障,以确保操作的顺序性和可见性。在Java中,volatile关键字和synchronized关键字的实现就使用了内存屏障。例如,如果你写了一个递归函数,没有提供适当的递归出口,那么这个函数就会无限递归下去。以上面的代码为例,这个方法会不断地调用自己,每次调用都会创建一个新的栈帧并压入栈中。它可以确保某些内存操作的顺序性,以及它们对其他处理器可见的顺序。栈内存主要用于存储局部变量和执行动态链接,还用于方法调用和返回。垃圾收集器的工作过程。

2024-09-14 09:49:35 612

原创 JVM面试真题总结(八)

每个Region都有一个用于垃圾回收的优先级,G1收集器会优先选择回收垃圾最多的Region。G1收集器重新划分了Java堆,主要是为了解决CMS收集器的一些问题,提高垃圾收集的效率。CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用。CMS收集器以最小的停顿时间为目标的收集器,容易产生内存碎片。CMS收集器:初始标记→并发标记→重新标记→标记清楚。G1收集器:初始标记→并发标记→最终标记→筛选回收。区别三:CMS收集器和G1收集器的优劣性。区别二:使用的算法不一样。

2024-09-13 10:06:28 755

原创 JVM面试真题总结(七)

具体来说,引用计数算法为每个对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1。ZGC和G1都是高级的垃圾收集器,为了满足大内存和低延迟的需求而设计。例如,如果堆中的存活对象非常多,或者垃圾收集线程的数量设置得过少。在某些情况下,G1可能无法达到预设的停顿时间目标。引用计数算法是一种非常直观、简单的垃圾收集算法。)垃圾收集器是一种面向服务器的垃圾收集器。当引用失效时,计数器值就减1。)是自动内存管理的重要部分。

2024-09-12 11:18:03 842

原创 JVM面试真题总结(六)

不过,对于新生代这样对象存活率较低的区域,复制算法通常是一种非常高效的垃圾收集方式。当Eden区满时,就会触发一次Minor GC,GC会检查Eden区中的所有对象。因此,现代的垃圾收集器通常不单独使用标记-清除算法,而是结合其他算法一起使用。GC(垃圾收集)的标记整理算法是一种用于回收垃圾对象并释放内存空间的方法。复制算法是垃圾收集中的一种常见算法,它主要被用于新生代的垃圾回收。在实际的应用场景中,标记-整理算法通常用于堆内存的垃圾回收。不过,它的代价是需要移动对象,这会增加一定的开销。

2024-09-11 09:48:27 710

原创 JVM面试真题总结(五)

浮动垃圾并不会影响程序的正确性,但是它可能会暂时占用一些内存,直到下一次垃圾收集时才能被回收。这个算法的一个主要优点是,它可以在程序的执行过程中并发地进行垃圾回收,而不需要暂停整个程序。浮动垃圾是指在进行垃圾收集过程中新生成的,但是在当前垃圾收集结束后无法被回收的对象。三色标记法是一种用于垃圾回收的算法,主要用于处理并发垃圾回收的问题。最后,在清除阶段,所有的白色对象都被认为是垃圾对象,并被回收。然后,垃圾收集器选择一个灰色对象,扫描这个对象的所有引用。标记阶段开始时,根对象被标记为灰色。

2024-09-10 10:10:09 1044

原创 JVM面试真题总结(四)

内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,即使程序可能已经不再需要这部分内存。jhat: 用于与jmap 命令搭配使用,分析jmap 生成的 dump 文件。Java提供了一些强大的工具来帮助开发者定位和解决JVM问题。,我们不断地向其中添加数据,但是却忘记从中删除不再需要的数据。jstack: 用于查看JVM 虚拟机当前时刻的线程快照。jstat:用于监视JVM 虚拟机运行时状态信息的命令。jinfo :用于实时查看和调整虚拟机运行参数。jps: 用于显示所有JVM 虚拟机进程。

2024-09-09 12:04:36 1170

原创 JVM面试真题总结(三)

Full GC的特点是能够清理整个堆内存中的无用对象,但是运行速度较慢,因为它需要处理整个堆内存。Full GC,也被称为全局垃圾收集,主要是对Java堆内存中的新生代和老年代进行的垃圾收集。通过合理的内存设置和垃圾收集器选择,可以降低Full GC的频率,从而提高应用的性能。GC Roots,或者说垃圾回收根,是垃圾收集器进行垃圾回收时的起始点。然后,垃圾收集器会标记出所有堆内存中无用(即不再被引用)的对象。最后,垃圾收集器会清理掉这些无用的对象,从而回收内存空间。,是Java中垃圾收集器的一种。

2024-09-08 09:51:42 1601

原创 JVM面试真题总结(二)

Minor GC的主要优点是效率高,因为新生代通常只占据堆空间的一小部分,并且新生代中的大多数对象都是。在Java内存模型中,volatile是一种特殊的变量,对它的读写操作具有特殊的内存语义。过程中,垃圾收集器会检查新生代中的对象,清理无用的对象(即没有被其他对象引用的对象)需要注意的是,Young GC只能清理年轻代中的无用对象,对于老年代中的无用对象。清理无用的对象(即没有被其他对象引用的对象),并将仍然存活的对象移动到。在Java的内存模型中,堆内存被分为新生代和老年代。

2024-09-07 11:15:35 970

原创 JVM面试真题总结(一)

例如,在多线程环境中,如果两个线程都在访问和修改同一块内存,那么指令重排序可能会导致数据不一致的问题。最后,由于处理器使用了缓存和读/写缓冲区,实际的内存读/写操作的顺序可能会与原始的程序顺序不同。但是如果B指令的运算并不依赖于A指令读取的数据,那么处理器就可以先执行B指令,再执行A指令。首先,源代码在编译的过程中,编译器可能会进行优化,改变程序中语句的执行顺序。在执行程序时,处理器可能会改变指令的执行顺序,这就是所谓的指令重排序。Java既是解释执行的,也是编译执行的,它采用了一种折中的方式。

2024-09-06 09:53:46 1144

原创 操作系统面试真题总结(七)

涉及的任务无法继续执行,因为每个任务都在等待其他任务释放资源,但是没有任务会释放它的资源,因为它们都在等待。乐观锁和悲观锁是并发控制中两种不同的策略,用于处理多个线程对共享资源的并发访问问题。总的来说,避免和预防死锁是一种权衡,需要在资源的有效利用和系统稳定性之间做出平衡。在实际系统中,可能会使用多种策略与技术相结合的方式来处理死锁。而乐观锁假设不会有冲突发生,在更新操作时进行冲突检测。只要这四个条件中的任意一个得不到满足,就不会发生死锁。一旦死锁已经发生,解除死锁可能会涉及到比较复杂的操作。

2024-09-05 10:02:04 527

原创 操作系统面试真题总结(六)

涉及的任务无法继续执行,因为每个任务都在等待其他任务释放资源,但是没有任务会释放它的资源,因为它们都在等待。这是因为CPU可以通过时间片轮转或其他任务切换策略,在各个任务之间快速切换,给人以它们在同时进行的错觉。这是一种非阻塞调用,也就是说,还没得到结果,就继续做别的事情,不会因为单一操作的等待而阻塞。这是一种阻塞调用,也就是说,进行某项操作的过程中,不得不停下来等待,直到这个操作完成。如果你的电脑有多个核心或处理器,你就可以在多个核心或处理器上同时执行多个线程,这是。,主要取决于具体的需求和场景。

2024-09-04 10:50:58 1006

原创 操作系统面试真题总结(五)

阻塞适用于需要确保结果完整性和依赖顺序的情况,而非阻塞适用于需要提高并发性和响应性的情况。非阻塞是指任务在等待某个操作完成时,不会暂停自己的执行,而是立即返回,继续执行其他任务。阻塞是指任务在等待某个操作完成时,暂停自己的执行,并等待操作完成后再继续执行。当线程切换发生时,操作系统会保存当前线程的上述上下文,加载目标线程的上下文。值得注意的是,线程切换是有性能开销的,因为涉及到保存和加载上下文的操作。而线程是进程内的执行单元,共享进程的内存空间和系统资源。在实际应用中,阻塞和非阻塞可以用在不同的场景中。

2024-09-03 09:51:55 708

原创 操作系统面试真题总结(四)

实际上,当一个进程创建大量线程时,由于每个线程都都需要一定的系统资源(例如,存储线程的上下文消息、栈空间等)进程的地址空间是指操作系统为每个进程分配的虚拟内存空间,用于存储进程的代码、数据和堆栈等信息。因此,实际上一个进程可以创建的线程数量是受限制的,需要考虑到系统的资源和限制因素。需要注意的是,进程的终止并不是立即发生的,而是通过信号通知进程终止。线程共享进程的内存空间和系统资源,每个线程有独立的程序计数器(在操作系统中,线程是进程的一部分,是进程内的一个执行单元。常用的调度算法有如下几个。

2024-09-02 09:48:22 610

原创 操作系统面试真题总结(三)

总之,僵尸进程是指在父进程没有及时回收子进程终止状态时,子进程成为已经结束但仍占用系统资源的状态。进程的创建是通过操作系统调度和管理的,当一个程序被执行时,操作系统会为其创建一个独立的进程。僵尸进程的主要原因是进程在结束执行后,父进程并没有及时处理子进程的终止状态信息。不同的方法可以根据实际情况进行选择和组合,以有效地处理过多的僵尸进程。因此,及时处理僵尸进程是非常重要的,可以采取合适的方法来清理僵尸进程。虽然僵尸进程本身无害,但过多的僵尸进程可能是不可取的。在操作系统中,进程是指正在执行的程序实例。

2024-09-01 10:20:46 1273

原创 操作系统面试真题总结(二)

通过使用虚拟内存,操作系统能够为每个进程提供独立的地址空间,使得进程之间相互隔离,更安全稳定。物理地址,又称实际地址或绝对地址,是数据在计算机系统中物理内存(RAM)的实际位置或者地址。在操作系统中,逻辑地址(有时也被称为虚拟地址),是在运行过程中的程序或进程所看到的地址。对于程序来说,它只需要对内存进行抽象的、逻辑的操作,不用关心具体数据在物理内存中的位置。在虚拟内存中,每个进程能够访问的内存空间大于实际物理内存的容量。栈主要存储局部变量和函数调用的信息,比如函数的返回地址和参数。

2024-08-31 11:39:30 1108

原创 操作系统面试真题总结(一)

硬件中断是由硬件设备触发的,比如外部设备的请求、时钟中断等。操作系统如果同意了这个请求,会在堆上找到一块合适的空闲空间,然后将其分配给程序。当函数执行结束后,对应的栈帧就会被释放,相关的存储空间将供后续的函数调用使用。每次调用这段代码的一个新实例时,都会有一个新的栈帧被创建以存储这次调用的信息。因此,划分用户态和内核态,为操作系统的运行提供了一个有序、可控和安全的环境。中断的作用是打断当前的程序执行流程,转而执行与中断事件相关的处理程序。(LIFO)的数据结构,也就是说最后进入的元素会被首先取出。

2024-08-29 10:02:25 1359

原创 计算机网络面试真题总结(七)

Traceroute 发送的 IP 数据报封装的是无法交付的 UDP 用户数据报,并由目的主机发送终点不可达差错报告报文。举个实际的例子来理解,如果你给朋友发送了一条用特定密码(这里的密码指的是对称加密的密钥)加密后的信息。Traceroute 是 ICMP 的另一个应用,用来跟踪一个分组从源点到终点的路径。在实际应用中,比如在进行HTTPS通信时,服务器会把它的数字证书发送给客户端。也就是说,用这个密钥加密的信息,只有用同样的密钥才能解密。在这个过程中,你们都使用的是同一个密钥,称为对称密钥。

2024-08-28 10:01:22 598

原创 计算机网络面试真题总结(六)

浏览器得到IP地址后,就可以向该IP地址对应的服务器发送HTTP请求,建立起与服务器的连接,开始浏览网页。这个过程是递归查询的过程,每一级的DNS服务器负责下一级DNS服务器的查询,直到找到IP地址。虽然收到了传输层传来的数据,可是这些传过来的数据五花八门,有html格式的,有mp4格式的,攻击者通过控制大量的僵尸计算机或利用其他合法的网络设备,向目标服务器或网络发起大量的请求。并将数据提交、存储到数据库中;DDoS 攻击是指 利用多个不同的计算机或网络设备,协同发起大规模的拒绝服务攻击。

2024-08-27 12:06:39 1215

原创 计算机网络面试真题总结(五)

HTTP/1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接。验证证书的可信性:客户端会检查证书的颁发机构是否被信任,以确保证书是由可信的第三方机构颁发的。验证证书的合法性:客户端会检查证书的有效期、签发机构和相关属性,确保证书的合法性。把数据的摘要消息进行一个加密,比如 MD5,得到一个签名,和数据一起发送。总的来说,HTTPS是对HTTP的增强和加密升级,提供了更高的安全性。目前,主流的HTTP协议还是HTTP/1.1 和 HTTP/2。

2024-08-26 09:56:38 398

原创 计算机网络面试真题总结(四)

由于网络的MTU限制,你不能一次性发送整个文件,所以你需要将文件拆分成多个小的数据包进行发送,这就是TCP拆包。UDP不属于连接协议,具有资源消耗少,处理速度快的优点,所以通常音频,视频和普通数据在传送时,使用UDP较多。在传统的HTTP/1.0版本中,每次请求完成后,TCP连接都会被关闭,下次请求需要重新建立连接,这种方式称为。接收端在接收到数据包后,会向发送端确认已接收到的数据包序号,并告诉发送端自己的接收窗口大小。连接的方式,在一次连接上进行多次请求和响应的机制,以提高性能和效率。

2024-08-26 09:55:10 835

原创 计算机网络面试真题总结(三)

大概就是:发送方维持一个发送窗口,凡位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。TCP流量控制是一种内置于TCP协议的机制,用于防止发送方把接收方的缓冲区塞满,以避免数据丢失。接收方在接收到数据后,会向发送方发送确认,确认号表示的是接收方期望接收的下一个数据字节的序号。协议,它可以在等待确认信号的同时,继续发送其他的数据包,可提高信道利用率。协议,每当发送方发送一个数据包后,就会停止发送并等待接收方的确认信号。如果接收方处理数据的速度慢,那么接收窗口的大小就会减小,甚至变为0。

2024-08-25 09:10:28 995

原创 计算机网络面试真题总结(二)

需要注意的是,Cookie是存储在用户本地的浏览器中,它可能包含敏感信息,因此在使用Cookie时需要注意安全性。通过在Cookie中存储持久性数据,网站可以实现 记住我 的功能,使用户在下次访问时不需要重新输入用户名和密码。客户端在后续的请求中,会将存储在Cookie中的Session ID自动带上,供服务器在接收到请求时进行识别。从效率的角度讲,UDP 的效率更快,因为 UDP 不需要做诸如三次握手/四次挥手/重传等额外的消耗。需要注意的是,会话数据通常存储在服务器端,可以在一段时间后过期或被销毁。

2024-08-24 09:27:53 1134

原创 计算机网络面试真题总结(一)

因为攻击者根本就不理服务器的接收、发送能力是否正常,然后疯狂着重复发 SYN 报文的话。301是HTTP协议中的一种状态码,当用户或搜索引擎向服务器发出浏览请求时。),指页面永久性转移,表示为资源或页面永久性地转移到了另一个位置。至于 TIME_WAIT 持续的时间至少是一个报文的来回时间。那他每次都在第一次握手中的 SYN 报文中放入大量的数据。服务端收到 ACK 报文之后,就处于关闭连接了,处于。指定自己的初始化序列号,为后面的可靠传送做准备。第三次握手的时候,是可以携带数据的。

2024-08-23 10:09:45 476

原创 深入理解Java虚拟机(锁优化)

大多数情况下,上面的原则都是正确的,但是如果一系列的连续操作都对同一个对象反复加锁和解锁,甚至加锁操作是出现在循环体之中的。如果在同一个锁对象上,自旋等待刚刚成功获得过锁,并且持有锁的线程正在运行中,那么虚拟机就会认为这次自旋也很有可能再次成功。因此,我们可以让没有请求到锁的线程等一会,但不放弃处理器的执行时间,看看持有锁的线程是否很快释放锁。这样是为了使得需要同步的操作数量尽可能变少,即使存在锁竞争,等待锁的线程也能尽可能快地拿到锁。

2024-08-22 09:55:26 917

原创 深入理解Java虚拟机(线程安全)

我们在调用的时候不需要进行额外的保障措施,但是对于一些特定顺序的连续调用,就可能需要在调用端使用额外的同步手段来保证调用的正确性。在synchronized中,锁对象的wait()跟它的notify()或者notifyAll()方法配合可以实现一个隐含的条件。是一个线程安全的容器(因为它的add()、get()和size()等方法都是被synchronized修饰的,尽管这样效率不高。当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步。

2024-08-21 18:35:29 1018

原创 深入理解Java虚拟机(类加载器)

无论哪一个类加载器要加载这个类,最终都是委派给处于模型最顶端的启动类加载器进行加载,因此Object类在程序的各种类加载器环境中都能够保证是同一个类。如果该类加载加载失败,则抛出异常转而让下一层加载器加载(越基础的类由越上层的加载器进行加载)),这样解决了基础类型的不一致问题。由自身缺陷导致,我们回想一下该模型的好处,无论哪一个类加载器要加载一个类,最终都是委派给处于模型最顶端的启动类加载器进行加载。它的查找顺序只有在开头符合双亲委派模型的原则,其余的类查找都是在平级的类加载器中进行。

2024-08-21 18:34:04 801

原创 深入理解Java虚拟机(类加载机制)

类的初始化阶段是类加载过程的最后一个步骤,直到初始化阶段,JVM才真正开始执行类中编写的Java程序代码,将主导权移交给应用程序。相对于类加载过程的其他阶段,非数组类型的加载阶段(准确地说,是加载阶段中获取类的二进制字节流的动作)是开发人员可控性最强的阶段。如果数组的组件类型(Component Type,指的是数组去掉一个维度的类型,注意和前面的元素类型区分开来)是引用类型。验证阶段对于虚拟机的类加载机制来说,是一个非常重要的、但却不是必须要执行的阶段,因为验证阶段只有通过或者不通过的差别。

2024-08-20 09:59:16 758

原创 深入理解Java虚拟机(垃圾收集器)

虽然G1仍然保留新生代和老年代的概念,但新生代和老年代不再是固定的了,它们都是一系列区域(不需要连续)的动态集合。而重新标记阶段则是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录。与CMS的标记-清除算法不同,G1从整体来看是基于标记-整理算法实现的收集器,但从局部(两个。最后是并发清除阶段,清理删除掉标记阶段判断的已经死亡的对象,由于不需要移动存活对象。并发标记阶段就是从GC Roots的直接关联对象开始遍历整个对象图的过程。

2024-08-20 09:57:04 300

原创 深入理解Java虚拟机(垃圾收集算法)

标记-复制算法常被称为复制算法,为了解决标记-清除算法面对大量可回收对象时执行效率低的问题。标记-清理算法与标记-整理算法的本质差异在于前者是一种非移动式的回收算法,而后者是移动式的。当这一块用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用的内存空间一次清理掉。标记-整理算法标记的过程仍然与标记-清除算法一样,但后续步骤不是直接对可回收对象进行清理。标记-清除算法是最基础的垃圾收集算法,该算法分为。):跨代引用相对于同代来说仅占极少数。

2024-08-18 09:17:02 400

原创 深入理解Java虚拟机(内存分配策略)

将引用分为强引用(Strongly Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)4种。在方法区中常量引用的对象,譬如字符串常量(String Table)里的引用。在方法区中类静态属性引用的对象,譬如Java类的引用类型静态变量。在本地方法栈JNI(即通常所说的Native方法)引用的对象。Java虚拟机内部的引用,如基本数据类型对应的Class对象。在虚拟机栈(栈帧中的本地变量表)中引用的对象。

2024-08-17 09:48:13 743

原创 深入理解Java虚拟机(内存溢出异常)

类加载过多,会导致方法区内存溢出,在实际的应用中,如Spring框架,会使用到CGLib这类字节码技术,会产生大量的动态类。如果虚拟机栈允许动态扩展,当扩展栈容量无法申请到足够的内存,将抛出OutOfMemoryError异常。出现的明显特征,Heap Dump文件不会看见明显的异常情况,如发现内存溢出后产生的Dump文件很小。Java堆内存的OutOfMemoryError异常是实际应用最常见的内存溢出情况。在默认设置下,动态创建新类型已经很难使虚拟机出现产生方法区内存溢出。运行时常量池溢出时,在。

2024-08-16 09:37:00 802

原创 深入理解Java虚拟机(堆对象)

第一部分:存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。因此,当使用Seria、parNew等带压缩整理过程的收集器时,系统采用的分配算法是指针碰撞,既简单又高效。第二部分:类型指针,即对象指向它的类型元数据的指针,虚拟机通过这个指针来判断这个对象是哪个类的实例。假设Java堆中内存是绝对规整的,空闲内存和被使用内存被分到两边,中间放置指针作为分界点的指示器。此时从虚拟机的角度看,对象已经产生,但从。

2024-08-15 10:59:46 829

原创 深入理解Java虚拟机(内存区域)

这些数据类型在局部变量表中的存储空间以局部变量槽(Slot)来表示,其中64位长度的long和double类型的数据会占用两个变量槽,其余的数据类型只占用一个。和Java堆一样,是各个线程共享的内存区域,用于存储已被虚拟机加载的类型信息、常量、静态变量、及时编译器编译后的代码缓存等数据。因此,为了线程切换后能恢复到正确的位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

2024-08-14 15:52:24 898

原创 分布式知识总结(一致性Hash算法)

机制,即对每个服务器节点计算出多个hash值,它们都会映射到hash环上,映射到这些虚拟节点的对象key,最终会缓存在真实的节点上。一致性hash算法本质上也是一种取模算法,不过不同于上边按服务器数量取模,一致性hash是对固定值。个值抽象成一个圆环,圆环的正上方的点代表0,顺时针排列,以此类推,1、2、3、4、5、6……之间的整数,而这个整数映射在hash环上的位置代表了一个服务器,依次将。服务器上,导致其他节点资源浪费,系统压力大部分集中在。节点宕机,沿顺时针方向对象映射节点,缓存在。

2024-08-13 10:27:04 776

复仇者联盟精品桌面壁纸免费下载

复仇者联盟精品壁纸

2021-06-13

Sublime Text 3126.dmg

Sublime Text 3126.dmg

2019-06-06

jdk-12.0.1_osx-x64_bin.dmg

jdk-12.0.1_osx-x64_bin.dmg

2019-06-06

尚硅谷大数据技术之Kafka(笔记+代码+资料).rar

Kafka是一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。在本课程中,你将学习到,Kafka架构原理、安装配置使用、详细的Kafka写入数据和处理数据以及写出数据的流程、新旧版本对比及运用、分区副本机制的详解、内部存储策略、高阶API直接消费数据、等等

2019-05-28

尚硅谷大数据之Zookeeper视频(笔记+代码+资料)

Zookeeper主要应用于大数据开发中的,统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等场景。该框架相当于大数据框架中的润滑剂。是大数据大数据开发工程师必须会的框架之一。本套课程讲解了,Zookeeper的集群安装、选举机制、监听器原理、写数据流程、Shell命令行操作、客户端API操作、服务器节点动态上下线综合案例以及企业真实面试题。

2019-05-28

尚硅谷大数据视频_Kafka视频教程-笔记.zip

尚硅谷大数据视频_Kafka视频教程-笔记

2019-05-16

SSM高级整合(SSM+BootStrap)

SSM+BootStrap实现SSM的基本整合和CRUD!!!

2017-07-23

从零开始学SpringBoot

从零开始学SpringBoot!!!

2017-07-20

SSM个人博客项目实战(SSM+EasyUI)

SSM实现个人博客项目,前台使用EasyUI!

2017-07-15

学生信息管理系统(JSP+Servlet+EasyUI)--入门项目

学生信息管理系统(JSP+Servlet+EasyUI)--入门项目!!!

2017-07-13

学生信息管理系统(SSH+EasyUI)---入门项目

SSH+EasyUI实现学生管理系统!!!

2017-07-13

EasyUI使用-中文手册

EasyUI中文手册,方便大家学习!!!

2017-07-12

学生信息管理系统(JSP+Servlet)

学完JSP和Servlet后的第一个项目!!!

2017-07-03

各种API性能_性能优化技巧

各种API性能_性能优化技巧!!!

2017-06-12

JDK API 1.8参考手册

JDK API 1.8 参考手册!

2017-06-06

张孝详JAVA就业面试宝典

Java就业面试宝典!

2017-06-06

JSTL中文文档-JSP

JSTL中文文档!!!

2017-06-04

EL手册-JSP

EL手册查看!!!

2017-06-04

算法图解-入门书

像小说一样有趣的算法入门书!!!

2017-06-03

IDEA-2017入门教程

IDAE工具的使用!!!

2017-05-31

阿里Java开发规范手册

Java开发规范必不可少,大家学起来!

2017-05-30

MyBatis学习入门案例

MyBatis学习入门案例

2017-05-25

空空如也

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

TA关注的人

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