自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

大力海棠的博客

我才发现,你很耀眼,请让我再瞧瞧你的双眼!

  • 博客(174)
  • 资源 (1)
  • 收藏
  • 关注

原创 新的征程!

其实大概在半年前?我就差点结束了日志的更新,原因是当时了解到的两个实验,双缝干涉和光子的全同性。在查阅许多资料,思考并总结后,对我的价值观产生了一定的冲击,当时感觉甚至可以写篇论文出来,欲放下自己在编程方面的日志更新转入另一个领域,无奈自己的物理水平以及暂时没能深入地,发掘,找到支撑自己结论的方法,所以暂时搁置了。 首先是双缝干涉实验,演示了粒子的波粒二象性,如光子和电子这些,它既是粒子,又是波,这取决于实验时如何去观测它(具体的实验内容大家可以自己去百度)。虽然薛定谔的猫帮我们解释了这一...

2021-07-17 19:59:49 239

原创 使用Java连接到Redis

目录连接Redis服务器Jedis使用管道运行Lua脚本使用连接池 使用Java连接Redis,需要使用Redis的Java客户端(Jedis)才能在Java应用程序中使用Redis,当然我们也可以用IDEA或其他IDE,这篇日志就来总结下Java连接Redis的一些操作。需要安装JDK1.8还有Jedis的JAR包,并把它们配置到CLASSPATH里,当然也可以用Maven来帮我们构建管理这些依赖,如果我们使用Gradle来管理Jedis的依赖项的话,需要将这一行内容comp..

2021-07-12 17:38:11 1840 2

原创 Redis故障检查:内存问题

目录查询缓冲区查询系统内存大数据集内存碎片 延迟问题检查完了,部署运行过程中的Redis还应该去检查可能的内存问题,因为Redis是一个基于内存的键值对数据存储服务器,里面所有的数据都是保存在内存中的,也就是说,当服务器重启时,里面的数据都会全部被清空。虽然RDB或AOF持久化会帮我们把数据写入到磁盘,以供数据库备份或是故障后的恢复,但如果运行过程中内存使用不合理,可能会导致OOM等问题。查询缓冲区 首先我们可以检查下客户端的查询缓冲区,使用命令:b...

2021-07-05 17:45:53 3981 3

原创 Redis故障检查:延迟测量

目录网络延迟测量固有延迟往返延迟检查CPU利用率检查持久化操作 Redis的故障检查,上一篇日志总结到的是找出一些慢查询操作,也就是这些查询花费了很长的时间才能完成,但是这个慢操作识别只记录的是命令执行消耗的时间,不包括网络传输消耗的时间以及磁盘读写消耗的时间,所以,当Redis出现较大延迟问题时,除了检查执行的操作命令外,还应检查一下是否网络延迟、CPU使用率过高或者是持久化操作造成的。网络延迟测量固有延迟 在Redis运行前,我们可以先对运行它...

2021-06-28 17:35:25 1459

原创 Redis故障检查:识别慢查询操作

目录运行状态信息持久化信息识别慢查询 前几篇日志总结了下对Redis部署时的一些配置,Redis启动后,面对各种请求,数据持久化到硬盘,很可能会出现内存不足等故障问题,导致Redis速度变慢甚至崩溃。在Redis运行前我们可以做很多配置防止这些问题的出现,在Redis运行后,面对未知的突发情况,出现问题了,其实我们也可以用一些命令查看,发现它,例如使用SLOWLOG命令查看Redis中的慢查询操作。运行状态信息 Redis运行后,怎么查看它的运行状态来判断当...

2021-06-21 17:34:30 796

原创 管理Redis:备份、恢复和内存监控

目录备份和恢复内存使用监控从一开始我们启动一个Redis实例时,先用bin/redis-server启动一个redis-server进程,然后命令bin/redis-cli连接到这个实例,关闭时调用bin/redis-cli shutdown命令。bin目录下面的redis-cli工具除了启动关闭redis外,还可以做其他很多的操作,方便地操作Redis,例如使用其来管理备份和恢复数据,已经内存使用监控等,这篇日志就来简单总结下。备份和恢复 Redis备份有两种方式,RDB...

2021-06-14 17:38:37 313

原创 Redis基准测试和影响性能因素

前面的日志中我们对Redis的部署进行了一些配置,如网络配置设置其socket监听队列的上限、安全配置通过bind命令和port命令把Reids绑定到安全的IP地址和端口上,还有内存淘汰策略的配置等。这些是除CPU性能和网络带宽之外我们能做的优化,那么在这些配置工作做好后,如何知道它是否能满足我们的需要?答案是可以对Redis进行基准测试,如果基准测试能达到我们对预期场景的需要,那么可以考虑部署上线,如果达不到要求,可能需要我们做些配置上的调整,或者升级更高性能的硬件了。基准测试...

2021-06-07 17:38:27 279

原创 部署Redis:配置内存策略

作为一个基于内存的轻量级数据结构服务,Redis把所有的数据都是保存在内存中的,虽然RDB或AOF持久化会将数据写入到磁盘中,但实际运行环境中Redis使用内存的空间总是比它持久化到磁盘的空间大,加上内存成本也相对较贵的原因,所以我们应该对其内存策略进行一些配置。键的过期删除方式其实在节省Redis内存方面,前面的日志中我们总结过一种方法,就是设置键的过期时间,通过EXPIRE命令给键绑定一个过期时间,这样我们就不用主动调用DEL命令来删除键,时间一过该键就会被Redis自动回收。对过期的键有.

2021-05-31 17:45:20 819 1

原创 Linux上部署Redis的一些参数配置

目录内存相关配置Copy-On-Write网络配置安全配置 对于Redis的使用和优化,前面总结到的有内存方面,使用不同的数据类型和使用不同的接口操作数据以节省内存,运行时配置主从实例优化减轻主实例的负担以及防止突然的断网或断电等单点故障问题。除以上这些,我们还可以在Redis部署启动前,进行一些参数配置,如内存分配策略,内存交换,以及一些网络和安全方面的配置等,这篇日志就来总结一下,当我们在Linux上真正部署Redis前,可以进行的一些参数配置,以优化Redis的执行和提高...

2021-05-24 17:49:35 220

原创 Redis持久化:使用AOF

目录APPEND-ONLY FILE命令写入过程AOF文件 上一篇日志总结了Redis持久化方式中的RDB,它是Redis默认使用的持久化方式,使用RDB将数据持久化到磁盘的好处,可以对指定时间间隔内的数据备份,备份的数据只生成一个dump.rdb文件,备份时效率高,因为Redis主进程只需创建一个子进程来完成持久化任务,之后可以继续处理收到的其他命令。数据恢复速度快,简单,只需将dump.rdb文件复制到bin目录下,再重启Redis即可。缺点是如果对数据完整性和一致性有比较高的...

2021-05-17 17:45:06 625

原创 Redis持久化:使用RDB

目录使用RDB阻塞与非阻塞RDBRDB文件格式 Redis作为一个基于内存的键值对数据结构服务器,其所有的数据都是保存在内存中的,也就是说,如果没有持久化操作,当Redis服务器重启时,里面的数据都会全部被清空,内存空间会被其它进程占用。数据持久化允许将数据写入到硬盘中,以供数据库备份或是故障后的恢复,Redis提供的持久化方式有两种RDB和AOF,这篇日志我们先来总结下RDB,它是Redis默认使用的的持久化方式。使用RDB RDB方式就是在对数据库的写...

2021-05-10 17:47:30 1659

原创 Redis主从服务器实例配置:只读从实例

目录主从实例配置主从实例同步完全重新同步部分重新同步 以前学习mysql时接触到数据热备份,也就是mysql主从,当主数据库服务器发生故障时,可以使用从数据库继续工作,且从数据库也体现出备份作用,防止主数据库因突然断网,或断电等因素导致的数据丢失问题。还有一个重要的作用是提高数据库I/O访问的效率,因为单个数据库服务对于大量的I/O操作,效率是很低的,例如一个网站访问量很大时,造成大量数据的写入,数据写入时需要加锁,之后其他的线程暂时不能读写数据库,进而影响了整个网站的数据读取...

2021-05-03 17:42:33 854

原创 Redis内存优化:使用不同的接口操作数据

目录空间和时间HSET和HMSET使用HSCAN空间和时间 接着看关于Redis内存使用的一些优化方式,上一篇日志讲到用不同的数据类型,JSON字符串和Hash存储都比String类型存储有很大的内存节省。总的来说,在不同场景中使用不同的存储方式达到内存消耗尽可能小,来提升查询的性能,例如举个例子,在计算一个博客里面的访客数时,最快想到的可能是使用集合存储,或者使用HyperLogLog数据类型也可以,因为每一个用户都是唯一的,基数统计可以很方便做到统计基数任务。还可以用位图,...

2021-04-26 17:39:44 257

原创 Redis内存优化:使用不同的数据类型

目录Redis的一些使用场景存储示例使用字符串类型使用json字符串类型使用哈希类型Redis的一些使用场景 Redis的一些常用场景,有数据排序查询、session存储,缓存等,数据排序前面的日志中有体现,如果我们想要维护一个歌曲热度排名名单,可以在Redis中使用有序集合,通过ZADD命名添加对象到一个有序集合中,之后使用ZREVRANGE命令或ZRANGE命令将集合里的元素按权重降序或升序输出。session通常存储在服务器之外的外部内存中,Redis作为基于内存...

2021-04-19 17:40:52 235

原创 Redis消息传递模式与Lua脚本

目录发布-订阅模式示例活跃频道Lua脚本测试用例 以前钻研Java多线程编程时有接触到一种并发编程方式叫反应式编程,当时这方面学习不深入,简单来说反应式编程就是处理异步流中的数据,因为以流的形式处理数据,所以执行效率很高。反应式编程其中一个重要特点是消息驱动,即对输入有反应,典型的消息处理模式是“发布-订阅”模式,记得Java中用到的组件是Publisher和Subscriber,分别代表发布者和订阅者。回到Redis,在Redis中也有这一经典消息传递模式,这篇日志就来总...

2021-04-12 17:49:51 328

原创 列表/集合排序与Redis事务

目录集合排序按权重进行排序Redis事务Redis事务和关系型数据库事务区别 排序重要性毋庸置疑,基本上大家看的算法书,编程语言书都会讲到各种各样的排序算法,现在基本上都有封装好的排序算法工具包,直接拿来用就可以了,不需要重复造轮子,Java语言对ArrayList就有sort()方法可以直接调用。在Redis中,列表和集合里的元素都是无序的,有序集合虽然有序,但它的排序方式是按照权重来排序,如果我们想按照元素的值来排序,Redis也提供了SORT命令为集合进行排序,这篇日志就...

2021-04-05 17:48:01 185

原创 Geo地理位置,位图与expiration

目录Geo地理位置信息Geo与有序集合位图bitmap过期时间Expiration 看了下前面三篇日志,总结了字符串、列表、哈希、集合与基数统计HyperLogLog,剩下Geo数据类型,这篇日志就把最后一个Geo地理位置信息也总结下,这样Redis支持的7种数据类型就总结完(五种最基本的数据类型加HyperLogLog和Geo),之后就可以转入一些更“高级”点的数据,如位图bitmap,键的过期时间Expiration和管道等。首先是Geo类型,它可以用来存储和查询地理位置坐...

2021-03-29 17:45:31 860

原创 Redis数据类型:有序集合与基数统计

目录有序集合ZADD和ZREM基数统计HyperLogLog 前面说的无序集合类型,特点是里面存放的对象都是唯一的,无需的,使用无序集合的场景通常是集合的交并差运算,或者检查某个对象是否在集合中。除了无序集合外,集合set还有有序集合类型,集合的对象唯一特点可以用来做计数,但是还有更节省内存消耗的数据结构可以使用,这篇日志就来总结有序集合,基数统计和Geo这三种数据类型。有序集合ZADD和ZREM 首先是有序集合,顾名思义集合中存放的对象都是有序排列...

2021-03-22 17:46:37 408

原创 Redis数据类型:哈希类型和无序集合

目录哈希hash类型HSET和HGET遍历哈希HSCAN命令集合set类型SADD和SREM 接着往下,Redis数据类型中还有哈希类型(hash)和集合类型(set),这两个相信大家也熟悉,哈希类型以前学习数据结构时不是有哈希表嘛,就是存储数据时建立起字段key和值value之间的映射关系,类似于Java中的map。set集合类型和List类似,Redis中的集合类型相当于一个无序的集合,里面不允许有重复的元素,这篇日志就总结下在Redis中对两个数据类型的一些操作。...

2021-03-15 17:48:32 869 1

原创 Redis数据类型:字符串和列表

目录string字符串类型SET和GET存储字符串的编码方式List列表类型PUSH和POP Redis作为一个轻量级键值数据库,跟之前上课时学的关系型数据库不同,使用Redis进行数据存储服务时,我们不需要去担心存储模式和表的结构,不需要用SQL语句来操作里面的数据,而是直接使用API操作数据结构。Redis支持的数据结构有字符串类型、列表类型、哈希类型和集合类型等,接下来的日志就总结下以前学习Redis的过程,从基本的Redis数据类型开始。string字符串...

2021-03-08 17:44:25 291 1

原创 栈上替换、方法内联和代码缓存

目录OSR栈上替换方法内联代码缓存大小 上一篇日志讲到使用JIT即使编译方式下代码的执行方式有解释执行和编译执行两种,对于程序中函数的执行,要么是使用解释执行的方式,要么是使用编译执行方式(对于热点代码)编译后得到的机器码执行,这两种方式的切换发生在函数的两次调用间隔,前一次调用时虚拟机没有把这段函数判定为热点代码,后一次调用时发现其是热点代码并且进行了编译,那么就会使用提供的机器码执行。对于大部分的函数执行来说是这样的,但有一些情况例外,如调用次数不多且里面有很多循环操作的函数,...

2021-03-01 17:45:23 1121 2

原创 虚拟机执行效率优化:JIT相关参数

目录三种执行模式编译阈值多级编译 我们知道Java程序经过编译得到字节码文件后,再通过解释器解释执行,相对于其他静态编译执行语言(也就是程序在执行前全部被翻译成机器码),解释执行的效率要低很多。原因简单来说是字节码解释器在执行时使用的软件代码来模拟字节码执行,如果是使用模板解释器来执行,每一条字节码关联一个模板函数,模板函数里面就是字节码对应的机器指令,性能有所提升,这些是对解释器的优化。但还不够,相信大家都听过Java虚拟机中的JIT即时编译技术,其工作过程是一边翻译一边执行,将...

2021-02-22 17:38:53 821

原创 javac静态编译优化总结

目录计算表达式优化字符串连接条件语句优化switch语句优化 我们都知道Java有自己的语言规范,JVM也有自己的解析规则,Java程序能够运行在虚拟机上,得益于javac编译器,将Java语言编译成字节码,javac属于静态编译,因为它不能直接把程序源码编译成机器可以识别的机器码,javac将程序整个完全编译成字节码后,才能交由虚拟机解释执行,这个过程需要耗费的时间(对比于其他可一边编译一边执行的语言)和空间(整个完全编译完成)都比较大。为了提高程序的执行速度,有的虚拟机里提...

2021-02-15 17:54:55 864

原创 JVM常用指令:比较控制和函数调用

目录比较控制比较指令条件跳转分支跳转函数调用和返回 程序的顺序执行需要由条件控制指令来控制,例如条件跳转、比较和分支跳转等,JVM常用指令中有一类控制指令,负责虚拟机有条件地或者无条件地从指定位置执行指令,使得程序按照我们希望的顺序执行。总的来说控制指令分为比较、跳转、比较跳转和有/无条件的分支跳转,同样控制程序执行的还有函数调用和返回指令,这篇日志就来总结这两部分常用的指令。比较控制比较指令 比较指令有fcmpg、fcmpl、dcmpg、dcm...

2021-02-08 17:48:45 343

原创 JVM常用指令:对象操作、运算和类型转换

目录类型转换指令基本运算指令对象操作指令 上一篇接照按指令的功能和操作的数据类型进行分类,除了压栈出栈指令外,还有类型转换,运算和对象操作指令三种,即加减乘除取余取反,对象操作中的字段访问和类型检查等,这篇日志就来总结下这部分常用的JVM指令。类型转换指令 类型转换在代码中出现一般是用户进行显式的数据类型转换操作,例如(int)num;在指令集中助记符形式是x2y,表示将x类型数据转换成y类型数据,例如i2l表示将int数据类型转换成long数据类型,l2d...

2021-02-01 18:00:13 351

原创 JVM常用指令:常量,变量的压栈出栈指令

目录常量压栈指令局部变量表压栈指令操作数栈出栈指令通用指令 上一篇日志里用到的指令如bipush,iload等都是JVM常用的指令,它们有各自的分类,如bipush是常量压入操作数栈,iload是将数组指令索引压入操作数栈,根据操作的数据类型不同还可以分为,i开头的是对integer类型操作指令,f开头是对float类型操作指令。每一条字节码指令由一个字节的助记符加上后面的参数组成,例如sipush 100指令一共占用3个字节,sipush占一字节加上后面的参数占两个字节。这...

2021-01-25 17:46:00 841

原创 反编译java文件看字节码执行顺序

目录反编译信息字节码执行入栈出栈退出临界区 上一篇日志开头里讲到,.java文件加载前首先被Java编译器编译成.class文件,也就是字节码文件,类似于C程序编译链接后形成的可执行文件,但是.class文件里存放的不是操作系统能直接执行的指令,而是JVM能识别的指令,它需要装载到JVM里解释运行。.class文件里的结构很复杂,保存的二进制流是一些如class的一些接口,方法列表,常量池,版本号,魔数等,这篇日志用一段简单的代码通过对其反编译来看看里面的每一句话被转化成了什么...

2021-01-18 17:57:23 495 1

原创 自定义ClassLoader实现类的热加载

目录热加载逻辑自定义ClassLoader热加载类类加载过程 热加载简单来说就是在程序运行时可以重新加载之前经过编译转换后的类,Java并不支持热加载,因为我们编写的代码文件,也就是.java文件在加载前首先被Java编译器编译成.class文件,当程序执行需要使用到这个类时,会将它的.class文件加载到JVM里,通过类加载器读取这些.class文件后,转化成类实例,即可以生成类的对象。对于同一个类来说,JVM只会把它加载一次,加载完成后也不能把它删除掉,如果我们想要在运行过...

2021-01-11 17:49:45 799

原创 从工厂模式回看解决双亲委派问题

目录上下文加载器突破双亲委派模式JDK 9双亲委派模型 简单工厂模式下,假设核心类和工厂方法由启动类加载器加载,应用类由应用类加载器加载,因为双亲委派模式下上层的类加载器无法访问下层ClassLoader加载的类,所以会导致启动类加载器加载的工厂方法无法创建应用类加载器加载的类的实例。在工厂模式中解决的方式就是把工厂方法抽象出来,具体生成实例的逻辑交由子类来实现,简单工厂模式变成抽象工厂模式,这个在上一篇日志中总结到,那么回到双亲委派问题,JVM解决的方式是在启动类加载器代码中新建...

2021-01-04 17:49:52 205

原创 从ClassLoader双亲委派看工厂模式

目录双亲委派模式问题简单工厂模式抽象工厂模式示例双亲委派模式问题 双亲委派模式在类加载时会先交由其双亲加载器来处理,如果请求失败了,再由自己加载,这样做其中一点是出于安全考虑。检查类有没有被加载前面的日志里总结过,是从最底层自定义类加载器开始往上检查(加载类则是从顶到往下加载),最后到启动类加载器,这里有一点要注意的是,底层的类可以访问其双亲类加载器加载的类,反过来就不行,顶层的类无法访问自己下层加载的类,这样就会出现一些问题,我们知道启动类加载器负责加载系统中一些核心类,...

2020-12-28 17:47:31 117

原创 ClassLoader分类和双亲委派模式

目录ClassLoader分类核心类双亲委派模式加载示例 加载类的过程需要从系统外部根据类名获取其二进制数据流,途径可以是外部文件,数据库或者从网络上download,接着把它们交给JVM,让虚拟机将这些数据转化成Class实例,这一过程通过ClassLoader类加载器来完成,ClassLoader只作用在类加载过程,获取二进制流交给JVM之后,接下来的连接和初始化等操作就不再参与了,对于ClassLoader,它是一个类,里面提供了一些方法来完成加载流程,例如publi...

2020-12-21 17:46:12 326

原创 Class字节码文件装载:类验证、解析和初始化

目录验证类解析类示例初始化不可逆的初始化过程 紧跟上一篇,Java程序在开始运行时并非完全加载的,各个部分在需要时才会加载,Class使用时被装载进JVM,类加载器ClassLoader会检查这个Class对象是否已经加载,如果尚未加载,ClassLoader就会根据类名查找.class文件,加载过程获取得到二进制数据流并解析成数据结构后,下一步就进入连接阶段,连接时进行的一步很重要的操作是验证,包括格式、语义、字节码和引用等验证,保证加载进来的Class字节码是符合规范的...

2020-12-14 17:43:59 357

原创 Class字节码文件装载:装载条件和加载类

目录装载条件主动使用被动使用加载类获取方法列表 我们知道,将源文件编译成相同的,正确的class字节码文件后,就可以在不同平台的Java虚拟机上运行,实现Java程序的跨平台性,可以看出其对JVM以及Java程序的重要性。与C编译链接后形成可执行文件不同,class字节码文件不是底层操作系统能够直接执行的机器指令,它是需要装载到JVM里解释运行的,只有被虚拟机装载进来的class类才能在程序中被使用,装在过程分为三部分:加载,连接和初始化,加载简单来说就是通过类名来获取该类...

2020-12-07 17:55:28 334

原创 JVM中的锁(下):粒度、分离和锁粗化

目录锁分离锁粗化减少锁占有时间减少锁粒度 上两篇日志从锁的实现方面,总结了JVM对锁的一些实现和使用中膨胀的过程,从偏向锁、轻量级锁到自旋再到重量级锁,随着线程竞争越来越激烈,锁膨胀的也越来越厉害,不同锁的实现在不同场景下有它的优点和缺点,没错,在某些场景下,锁操作并不一定总能优化程序的,例如偏向锁在线程竞争激烈的场景下,需要不断变换自己的偏向状态,自旋锁在线程占用锁时间较长的场景下做的自旋操作通常是无用功,最后还是得不到锁,浪费了占用的CPU。所以,为了让程序执行的更加连贯,...

2020-11-30 17:45:46 341

原创 JVM中的锁(中):锁膨胀和锁消除

目录锁膨胀自旋锁重量级锁锁消除 接着上一篇,偏向锁失效后JVM让线程去申请轻量级锁,轻量级锁就是一种乐观思想,举个例子,在写入数据时会先判断这个期间有没有其他线程修改过这个数据,具体方式是读出版本号or时间戳,如果没有,就可以加锁,进行写入修改,否则继续重复读出数据,比较,再写入,轻量级锁就是这么个思想,使用的也是CAS操作。如果轻量级锁获取失败,证明有多个线程在同时竞争这个对象,这时候临界区线程竞争激烈,如果想要保证数据完整性,就要采用更重量级别的锁,从偏向锁到轻量级锁,再到...

2020-11-23 17:49:05 773

原创 JVM中的锁(上):对象头和锁

目录Java对象头Mark WordJVM中的锁偏向锁轻量级锁 以前的日志里总结过Java中锁的应用,在多线程编程专栏里,JVM内部对锁进行了一些优化,所以在Java程序中使用锁很方便,接下来的日志就总结下锁在虚拟机里的实现和优化。锁的作用简单来说是为了保护多线程访问同一内容,也就是临界区内容时,因多个线程同时读,写入操作导致数据一致性出现问题,为了保证事务执行前和执行后数据的完整性没有遭到破坏,可以通过给对象加锁来让多线程按顺序逐一访问临界区,这样大家访问到的资源总是正确...

2020-11-16 17:41:33 827

原创 JVM性能:堆的参数配置

目录初始堆和最大堆偏差问题新生代配置指定绝对大小 Java程序中的最重要的内存空间就是堆了,基本上所有的对象都分配在堆中,这些堆空间根据不同功能和GC回收分配成几种的结构,例如存放新创建对象的新生代,经过多次GC后仍然存活的老年对象则存放在老年代中,新生代区域又分为eden区和from区,to区,通风常在eden区中的新生代经历了一次GC后仍然存活的话,便会进入from区或to区,每一次GC都会让对象的年龄增加1,达到进入老年对象的值后,便会转入老年代中。如果堆空间的使用不恰当...

2020-11-09 17:47:49 791

原创 String字符串导致的JVM内存泄漏

目录被定义为final类不可改变常量池优化String造成的内存泄漏String结构 String类存在于java.lang包中,在程序里使用挺广泛的,用来创建一个字符串对象变量,Java内部对String类做了一些特殊的处理,例如把String类声明成final类型,也就是说不能有子类,String类型对象一旦创建后就不可改变(你可能会想不是可以拼接字符串吗,怎么不可以改变String类对象了,别急,下面慢慢看),以及一些针对JVM的优化等,先来简单看看String类在J...

2020-11-02 17:58:17 2173

原创 总结Java程序内存溢出原因

目录内存溢出和内存泄漏直接内存溢出堆溢出方法区溢出 这篇日志总结下Java程序中的发生内存溢出的一些原因,我们知道JVM堆空间十分重要,大部分对象在创建时都是放在堆中(除了一些逃逸对象是栈上分配),例如新生代存放在eden区中。随着对象的不断创建和老年代对象的不断产生,如果垃圾回收不能及时释放内存,最终堆内存被耗尽,新对象创建时由于内存不足,申请空间失败,导致内存溢出,在Java程序中内存溢出分几种,直接内存溢出,堆溢出和永久区溢出,在总结这几种内存溢出情况前,先分清内存溢出和...

2020-10-26 17:45:04 1378

原创 在TLAB(线程本地分配缓存)上分配对象

目录使用TLAB性能差异示例分配策略Java对象分配过程 JVM的Thread Local Allocation Buffer,即TLAB线程本地分配缓存,作用是加速分配对象空间,以前的日志里说到对于一些线程私有的对象,由于不会发生对象逃逸,所以JVM会以栈上分配的方式将对象空间分配到栈空间中,这样当方法调用完成后对象就会因离开了作用域而跟着一起被销毁,不需要等待GC来回收,而对于一些会发生逃逸的对象,例如类的成员变量,因为它们可能被其他线程访问,所以JVM会将其分配在堆空间中...

2020-10-19 17:48:33 601

调用ACLLib库+MVC设计模式的单人版贪吃蛇小游戏(C语言实现)

C语言编写的调用ACLLib函数库单人版贪吃蛇小游戏,运用MVC设计模式(三部分Model,View, Control),代码可重用,修改为双人版甚至多人版,附有有设计思路文档,代码注释。

2018-09-21

空空如也

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

TA关注的人

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