自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JVM七大垃圾回收器下篇G1(Garbage First)

截止JDK 1.8,一共有7款不同的垃圾收集器。每一款不同的垃圾收集器都有不同的特点,在具体使用的时候,需要根据具体的情况选用不同的垃圾收集器。不同厂商、不同版本的虚拟机实现差别很大。1.两个收集器间有连线,表明它们可以搭配使用: Serial/Serial 0ld、Serial /CMS、ParNew/Serial 0ld、ParNew/CMS、 Parallel Scavenge/Serial 01d、Parallel Scavenge/Parallel 0ld、G1;

2023-04-02 20:03:20 1107 2

原创 JVM七大垃圾回收器上篇Serial、ParNeW、Parallel Scavenge、 Serial Old、 Parallel Old、 CMS、 G1

这种垃圾收集器大家了解,现在已经不用串行的了。而且在限定单核cpu才可以用。现在都不是单核的了。对于交互较强的应用而言,这种垃圾收集器是不能接受的。一般在Javaweb应用程序中是不会采用串行垃圾收集器的。

2023-04-02 19:07:06 1216

原创 JVM关于GC的日志分析

通过阅读GC日志,我们可以了解Java虛拟机内存分配与回收策略。内存分配与垃圾回收的参数列表。

2023-04-02 16:17:21 1226

原创 JVM强引用、软引用、弱引用、虚引用、终结器引用垃圾回收行为总结

Reference子类中只有终结器引用是包内可见的(该类没有被public修饰),其他3种引用类型均为public class,可以在应用程序中直接使用。

2023-03-31 22:27:20 420

原创 JVM垃圾回收行为的并行与并发

并行(Parallel) :指多条垃圾收集线程并行工作,但此时用户线程仍处于等待状态。程序的并发(Concurrent)串行(Serial)

2023-03-31 17:59:04 180

原创 JVM内存溢出与内存泄漏

注意,这里的存储空间并不是指物理内存,而是指Java层面JVM虚拟内存大小,这个虚拟内存大小取决于磁盘交换区设定的大小。Forgotten Reference:由于某种原因没有/忘记断开的引用,导致内存泄漏。

2023-03-29 21:10:56 425

原创 Java垃圾回收System.gc()的理解

/强制调用 失去引用的对象的finalize()方法。System.out.println("SystemGCTest 重写了finalize()");在一些特殊情况下,如我们正在编写一个性能基准,我们可以在运行之间调用System.gc()。//强制调用 失去引用的对象的finalize()方法。//与Runtime.getRuntime().gc();从而证明了System.gc()无法保证GC一定执行.

2023-03-29 18:11:20 359

原创 JVM垃圾回收算法

➢如果只针对Java堆中的某一块区域进行垃圾回收(比如:典型的只针 对新生代),必须考虑到内存区域是虚拟机自己的实现细节,更不是孤立封闭的,这个区域的对象完全有可能被其他区域的对象所引用,这时候就需要一.并将关联的区域对象也加入GC Roots集合中去考虑,才能保证可达性分析的准确性。将活着的内存空间分为两块,每次只使用其中一块,在垃圾回收时将正在使用的内存中的存活对象复制到未被使用的内存块中,之后清除正在使用的内存块中的所有对象,交换两个内存的角色,最后完成垃圾回收。堆中S0和S1使用的就是复制算法。

2023-03-28 14:37:53 578

原创 JVM垃圾回收概述

什么是垃圾( Garbage) 呢?➢垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。➢外文: An object is considered garbage when it can no longer be reached from any pointer in the runningprogram.如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出。

2023-03-27 11:08:28 356

原创 JVM字符串常量池StringTable

jdk1.6中,将这个字符串对象尝试放入串池。➢如果字符串常量池中有,则并不会放入。返回已有的串池中的对象的地址➢如果没有,会把此对象复制一份,放入串池,并返回串池中的对象地址Jdk1.7起,将这个字符串对象尝试放入串池。➢如果字符串常量池中有,则并不会放入。返回已有的串池中的对象的地址➢如果没有,则会把对象的引用地址复制一份,放入串池,并返回串池中的引用地址。

2023-03-22 22:13:01 322

原创 JVM执行引擎

前端编译器:把.java文件转变成.class文件。包括Sun的Javac、Eclipse JDT中的增量式编辑器(ECJ)后端运行期即时编译器(JIT编译器,Just In Time Compiler):把字节码转成机器码。包括HotSpot VM的C1、C2编译器静态提前编译器(AOT编译器,Ahead Of Time Compiler):把*.java编译成本地机器码。包括GNU Compiler for the Java(GCJ)、Excelsior JET。

2023-03-20 23:12:25 158

原创 JVM直接内存(Direct Memory)

由于直接内存在Java堆外,因此它的大小不会直接受限于一Xmx指定的最大 堆大小,但是系统内存是有限的,Java堆和直接内存的总和依然受限于操作系统能给出的最大内存。访问直接内存的速度会优于Java堆。3.简单理解: java process memory = java heap + native memory。1.直接内存不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。2.直接内存是Java堆外的、直接向系统申请的内存区间。

2023-03-20 17:29:54 972

原创 JVM运行时数据区—对象的实例化内存布局与访问定位

虚拟机遇到一条new指令,首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化。优点:定位稳定:当对象实例发生移动(垃圾回收算法,内存整理算法),则不需要修改reference到句柄的定位地址,仅需要在句柄内修改间接地址,重新定位到对象实例即可。将对象的所属类(即类的元数据信息)、对象的HashCode和对象的GC信息、锁信息等数据存储在对象的对象头中。如果实例成员变量是引用变量,仅分配引用变量空间即可,即4个字节大小。

2023-03-17 20:31:00 532 1

原创 JVM运行时数据区—堆

1.一个jvm实例只存在一个堆内存,堆也是java内存管理的核心区域2.Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间(堆内存的大小是可以调节的)3.《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。4.所有的线程共享java堆,在这里还可以划分线程私有的缓冲区(TLAB:Thread Local Allocation Buffer).(面试问题:堆空间一定是所有线程共享的么?不是,TLAB线程在堆中独有的)

2023-03-15 20:11:48 463 1

原创 JVM运行时数据区—方法区

预知JVM前置内容讲解,本人博客往前翻预知JVM后置内容讲解,本人博客往后翻。

2023-03-13 22:53:42 316 1

原创 JVM运行时数据区—本地方法栈

如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的本地方法栈,那么java虚拟机将会抛出一个OutOfMemoryError异常。如果JVM产品不打算支持native方法,也可以无需实现本地方法栈。如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个StackOverFlowError异常。1.Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法(一般非Java实现的方法)的调用。

2023-03-12 23:26:06 106

原创 JVM—本地方法接口

目前该方法的是用越来越少了,除非是与硬件有关的应用,比如通过java程序驱动打印机或者java系统管理生产设备,在企业级应用已经比较少见。,一个Native Method 是这样一个java方法:该方法的底层实现由非Java语言实现,比如C。这个特征并非java特有,很多其他的编程语言都有这一机制,比如在C++ 中,你可以用extern “C” 告知C++ 编译器去调用一个C的函数。java使用起来非常方便,然而有些层次的任务用java实现起来不容易,或者我们对程序的效率很在意时,问题就来了。

2023-03-12 19:43:05 432

原创 Java虚拟机栈—栈帧

这些数据类型包括各类基本数据类型、对象引用(reference),以及returnAddressleixing3.由于局部变量表是建立在线程的栈上,是线程私有的数据,因此不存在数据安全问题。

2023-03-08 23:42:04 1456

原创 SpringCloud简介

应对问题解决方案服务调用时,需要知道对方的状态注册中心provider集群分摊负载负载均衡服务调用过程中可能失败,甚至雪崩熔断器RestTemplate、Ribbon、熔断器调用复杂,需要简化开发代码Feign微服务数量增加,IP地址、端口号记录麻烦,又需要在请求到达微服务前执行统一性操作网关统一入口微服务数量增加,配置文件管理成本增加配置中心,统一管理配置信息。

2023-03-06 23:25:07 129

原创 JVM运行时数据区—Java虚拟机栈

如果java虚拟机栈可以动态拓展,并且在尝试拓展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那java虚拟机将会抛出一个。9.如果当前方法调用了其他方法,方法返回之际,当前栈帧会传回此方法的执行结果给前一个栈帧,接着,虚拟机会丢弃当前栈帧,使得前一个栈帧重新成为当前栈帧。4.JVM直接对java栈的操作只有两个,就是对栈帧的压栈和出栈,遵循先进后出/后进先出的和原则。7.如果在该方法中调用了其他方法,对应的新的栈帧会被创建出来,放在栈的顶端,成为新的当前栈帧。

2023-03-05 23:57:09 805

原创 JVM运行时数据区—程序计数器

JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。一个线程对应一个 JVM Stack。JVM Stack 中包含一组 Stack Frame。当 JVM 调用一个 Java 方法时,它从对应类的类型信息中得到此方法的局部变量区和操作数栈的大小,并据此分配栈帧内存,然后压入 JVM 栈中。

2023-03-05 14:21:44 258

原创 JVM运行时数据区划分

java虚拟机定了了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与县城一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁。如图,灰色的区域为单独线程私有的,红色的为多个线程共享的,即。

2023-03-04 18:46:27 555

原创 JVM—类加载子系统

1.对于用户自定义类来说:将使用系统类System Class Loader加载器中的AppClassLoader进行加载2.java核心类库都是使用引导类加载器BootStrapClassLoader加载的/*** ClassLoader加载//获取系统类加载器 ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();

2023-03-03 10:21:08 397

原创 JVM

Exact VMHotSpot VM :HotSpot指热点代码探测技术BEA JRockit:(BEA 已被Oracle收购) 专注于服务端应用,世界最快的jvm之一IBM J9Taobao JVM: 目前已经在淘宝、天猫上线,替换了Oracle官方JVM;Graal VM: Oracle 2018年4月公开,口号 Run Programs Faster Anywhere.最可能替代HotSpot的产品。

2023-03-02 20:45:17 704

原创 SpringBoot简介

内部包含多个注解,其中最关键的是下面三个。

2023-03-01 18:52:36 523 2

原创 Spring Cache的基本使用与分析

使用 Spring Cache 可以极大的简化我们对数据的缓存,并且它封装了多种缓存,本文基于 redis 来说明。,允许写入空值,加锁,设置不同的过期时间而对于写模式,Spring Cache 并没有相应处理,我们需要使用其它方式处理。1、对于常规数据(读多写少,及时性、一致性要求不高的数据)完全可以使用 Spring Cache2、对于特殊数据(比如要求高一致性)则需要特殊处理。

2023-02-26 18:52:58 520

原创 高并发下缓存失效问题及解决方案

当查询一个不存在的数据,此时缓存是不命中的,就会去查询 db,这将导致每次查询这个不存在的数据都要去访问 db,缓存就没有意义了。如果不怀好意的人利用不存在的数据进行攻击,可能导致数据库崩溃。

2023-02-24 18:20:10 177

原创 本地事务详解

 REPEATABLE READ(可重复读) 该隔离级别是 MySQL 默认的隔离级别,在同一个事务里,select 的结果是事务开始时时间 点的状态,因此,同样的 select 操作读到的结果会是一致的,但是,会有幻读现象。1、PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务, 就加入该事务,该设置是最常用的设置。2、PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当 前不存在事务,就以非事务执行。

2023-02-21 18:35:47 287

原创 Redis事务控制

举个例子, 如果你本来想通过 INCR 命令将键的值加上 1 , 却不小心加上了 2 , 又或者对错误类型的键执行了 INCR , 回滚是没有办法处理这些情况的。1.Redis 命令只会因为错误的语法而失败(并且这些问题不能在入队时发现),或是命令用在了错误类型的键上面:这也就是说,从实用性的角度来说,失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中。在使用WATCH命令监控一个KEY后,当前队列中的命令会由于外部命令的执行而放弃,这是乐观锁的体现。

2023-02-20 18:05:02 423

原创 Redis持久化机制

Redis工作时数据都存储在内存中,万一服务器断电,则所有数据都会丢失。针对这种情况,Redis采用持久化机制来增强数据安全性。说白了就是把内存里的数据保存到硬盘上。

2023-02-19 16:22:11 324

原创 Redis命令行对常用数据结构String、list、set、zset、hash等增删改查操作

M:multi。

2023-02-18 18:44:44 868

原创 Redis常用数据结构及应用场景

和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。Redis中最基本的类型,它是key对应的一个单一值。所以redis的string可以包含任何数据,比如jpg图片或者序列化的对象。它的底层是双向链表,所以它操作时头尾效率高,中间效率低(额外花费查找插入位置的时间)。Redis中的数据,总体上是键值对,不同数据类型指的是键值对中值的类型。list是一个有序可以重复的数据类型。

2023-02-16 21:34:06 1392

原创 Linux下redis的安装

如果不能联网,可以使用下面步骤安装: 1.上传gcc-c++.rpm.packages目录到Linux系统 2.拍摄快照 3.进入rpm包所在目录 4.执行安装 rpm -Uvh *.rpm --nodeps --force 5.验证安装效果 gcc -v。就Redis自身而言是不需要修改的,这里修改的目的是让Redis的运行程序不要和其他文件混杂在一起。cp redis解压目录/redis.conf /usr/local/redis/vim redis解压目录/src/Makefile。

2023-02-16 17:46:27 259

原创 redis的简介及应用场景

在Redis中有一种数据类型是set,和Java中的Set集合很像,不允许存储重复数据。使用Redis可以建立性能非常出色的缓存服务器,查询请求先在Redis中查找所需要的数据,如果能够查询到(命中)则直接返回,大大减轻关系型数据库的压力。Redis是一个严格的Key-value数据库,所有数据都必须通过key去找到value,Redis没有提供直接根据查询条件匹配value的方法。Redis不支持回滚。Redis中一个key对应一个value,没有多个key对应同一个value的情况。

2023-02-15 17:55:10 664

原创 Lambda表达式详细操作

如果Lambda体中只有一行代码,那么Lambda体的大括号和return关键字都可以省略。如果Lambda表达式的参数部分只有一个参数,那么小括号可以省略。口诀:复制小括号,写死右箭头,落地大括号。本质:基于匿名内部类创建的对象。只有一个抽象方法的接口。

2023-02-14 17:31:34 381

原创 StreamAPI详细操作

高效处理集合数据的API方法,仅负责处理数据而不负责保存数据。中文可翻译为流式编程。

2023-02-13 18:10:51 498

原创 CompletableFuture异步编排

CompletableFuture是FutureTask的升级版。

2023-02-11 19:06:47 119

原创 SpringBoot整合RabbitMQ

SpringBoot整合RabbitMQ。

2023-02-10 18:20:12 169

原创 Nginx动静分离

现在在这个 JSP 页面中,/images/mi.jpg 路径并不是按照 Tomcat 上运行的 Web 应用来编写的。而是按照通过 Nginx 访问静态资源的规则,编写的路径。

2023-02-09 19:02:08 403

原创 Nginx负载均衡

访问量太大,一个 Tomcat 扛不住,所以就搭建 Tomcat 集群。让集群中的多个 Tomcat 服务器实例分担负载。

2023-02-09 17:29:19 428

空空如也

空空如也

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

TA关注的人

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