Java
文章平均质量分 88
豆奶快攻
这个作者很懒,什么都没留下…
展开
-
JVM基础与相关案例
我使用 jmap 命令,导出了一份线上堆栈,然后使用 MAT 进行分析,通过对 GC Roots 的分析,发现了一个非常大的 HashMap 对象,这个原本是其他同事做缓存用的,但是做了一个无界缓存,没有设置超时时间或者 LRU 策略,在使用上又没有重写key类对象的hashcode和equals方法,对象无法取出也直接造成了堆内存占用一直上升,后来,将这个缓存改成 guava 的 Cache,并设置了弱引用,故障就消失了。第三,由于缓存的使用,有大量的弱引用,拿一次长达 10 秒的 GC 来说。原创 2024-07-17 00:01:42 · 642 阅读 · 0 评论 -
JVM运行期的几种优化手段
在之前的文章中我们谈到过,相比 C/C++ 语言,Java 语言在运行效率方面要稍逊一些,因为 Java 应用程序是在虚拟机上运行,而 C/C++ 程序是直接编译成平台相应的机器码来运行程序。从虚拟机对外发布开始,开发团队一直在努力试图缩小 Java 与 C/C++ 语言在运行效率上的差距。从实际的结果来看,确实成果显著。本文就来聊聊 HotSpot 虚拟机为了提升 Java 程序的执行效率,都实现了哪些激动人心的优化技术。转载 2024-07-12 21:23:44 · 37 阅读 · 0 评论 -
高并发架构设计
高并发是指系统或应用程序在同一时间段内接收到大量并发请求的能力。具体来说,高并发环境下系统需要能够同时处理大量的请求,而不会出现性能问题或响应延迟。原创 2024-07-04 18:55:22 · 1974 阅读 · 0 评论 -
多线程基础
并且这种循环是链表的循环,相当于 A 节点指向 B 节点,B 节点又指回到 A 节点,这样一来,在下一次想要获取该 key 所对应的 value 的时候,便会在遍历链表的时候发生永远无法遍历结束的情况,也就发生 CPU 100% 的情况。如果需要同步的操作执行速度非常快,并且线程竞争并不激烈,这时候使用cas效率会更高,因为加锁会导致线程的上下文切换,如果上下文切换的耗时比同步操作本身更耗时,且线程对资源的竞争不激烈,使用volatiled+cas操作会是非常高效的选择;乐观锁体现的是悲观锁的反面。原创 2024-07-02 17:17:59 · 843 阅读 · 0 评论 -
常见 Java 代码缺陷及规避方式
问题列表NPE 或许是编程语言中最常见的问题,被 Null 的发明者托尼·霍尔(Tony Hoare)称之为十亿美元的错误。在 Java 中并没有内置的处理 Null 值的语法,但仍然存在一些相对优雅的方式能够帮助我们的规避 NPE。原创 2024-07-01 01:54:45 · 833 阅读 · 0 评论 -
工作中最常见的OOM问题
我们在写递归代码时,一定要考虑递归深度。很多时候,excel一次导出大量的数据,获取在程序中一次性查询的数据太多,都可能会出现这种OOM问题。如果实际工作中,出现这个问题,一般是由于创建的线程太多,或者设置的单个线程占用内存空间太大导致的。调用,如果递归的深度超过了JVM允许的最大深度,可能会出现栈内存溢出问题。是由于JVM在GC时,对象过多,导致内存溢出,建议调整GC的策略。有时候,我们的业务系统创建了太多的线程,可能会导致栈内存OOM。这个问题一般是由于加载到内存中的类太多,或者类的体积太大导致的。原创 2024-06-24 19:51:10 · 838 阅读 · 0 评论 -
实用 Java Streams API
它是一种特殊的收集器,允许您对另一个收集器的结果执行特殊类型的转换。该方法是在 Java 9 中引入的,有助于过滤集合中的所有空值,从而可能使我们避免空指针异常。在下面的示例中,我们的收集器通过首先使用索引到大写操作进行映射,然后使该映射成为不可修改的。在下面的示例中,有一个包含 null 的List。在下面的例子中,我们的种子是0,一元运算函数是 n -> n+2。在下面的示例中,我们删除小于3的元素,然后返回元素小于6的元素流。在下面的示例中,我们根据元素的字符串长度分为两个不同的组。原创 2024-06-24 01:24:58 · 438 阅读 · 0 评论 -
线程池若干问题
线程池中线程异常后,销毁还是复用?线程池在提交任务前,可以提前创建线程吗?原创 2024-06-17 14:56:43 · 435 阅读 · 0 评论 -
限流神器Sentinel
这篇文章介绍一下阿里开源的流量防卫兵Sentinel,一款非常优秀的开源项目,经过近10年的双十一的考验,非常成熟的一款产品。sentinel顾名思义:卫兵;在Redis中叫做哨兵,用于监控主从切换,但是在微服务中叫做流量防卫兵。Sentinel 以流量为切入点,从流量控制熔断降级系统负载保护等多个维度保护服务的稳定性。丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一。原创 2024-06-12 16:18:29 · 1016 阅读 · 0 评论 -
lambda 之美
并且返回一个Optional对象,该对象是java8新增的类,专门为了防止null引发的空指针异常。本篇主要从实际使用讲述了常用的方法及流,使用java8可以很清晰表达你要做什么,代码也很简洁。本篇例子主要是为了讲解较为简单,大家可以去使用java8重构自己现有的代码,自行领会lambda的奥妙。本文说的Stream要组合使用才会发挥更大的功能,链式调用很迷人,根据自己的业务去做吧。我们看得reduce接收了一个初始值为0的累加器,依次取出值与累加器相加,最后累加器的值就是最终的结果。原创 2024-05-25 18:36:09 · 317 阅读 · 0 评论 -
ThreadLocal 搭配线程池使用造成内存泄漏的原因和解决方案
主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景。和HashMap的最大的不同在于,ThreadLocalMap结构非常简单,没有next引用,也就是说ThreadLocalMap中解决Hash冲突的方式并非链表的方式,而是采用线性探测的方式。ThreadLocalMap是ThreadLocal的内部类,没有实现Map接口,用独立的方式实现了Map的功能,其内部的Entry也独立实现。转载 2024-05-25 02:19:52 · 158 阅读 · 0 评论 -
性能优化思路及常用工具及手段
性能优化是降低成本的手段之一,每年大促前业务平台都会组织核心链路上的应用做性能优化,一方面提升系统性能,另外一方面对腐化的代码进行清理。现结合业务平台性能优化的经验,探讨一下性能优化的思路及常用工具及手段。性能优化本质上是对资源的合理利用,将更珍贵的资源用在更重要的业务上,从而实现资源的充分利用,资源的合理利用。性能优化的对象包括业务运行的容器、业务依赖的中间件、业务依赖的数据库存储的优化,性能优化包括两部分:一、发现需要性能优化的点;二、改造代码设计实现性能优化;原创 2024-05-23 14:56:01 · 582 阅读 · 0 评论 -
线程池相关故障梳理&总结
1、线程池设置的队列过长容易造成阻塞影响吞吐。2、future.get,默认没有超时时间,需显式传入。原创 2024-05-20 15:12:44 · 813 阅读 · 0 评论 -
@Async注解没起效果的场景
而在类中直接进行方法的内部调用,在test()方法中调用async()方法,调用的是该类原对象的async方法,相当于调用了this.async()方法,而并非UserService代理类的async()方法。而@Async注解的异步功能,需要使用Spring的AOP生成UserService类的代理对象,该代理对象没法访问UserService类的private方法,因此会出现@Async注解失效的问题。有时候,我们的方法会使用static修饰,这样在调用的地方,可以直接使用类名.方法名,访问该方法了。原创 2024-05-11 20:24:38 · 825 阅读 · 0 评论 -
如何保证分布式情况下的幂等性
幂等(idempotent、idempotence)是⼀个数学与计算机学概念,常⻅于抽象代数中。在编程中⼀个幂等操作的特点是其任意多次执⾏所产⽣的影响均与⼀次执⾏的影响相同。幂等函数,或 幂等⽅法,是指可以使⽤相同参数重复执⾏,并能获得相同结果的函数。这些函数不会影响系统状态, 也不⽤担⼼重复执⾏会对系统造成改变。例如,“setTrue()”函数就是⼀个幂等函数,⽆论多次执⾏,其结 果都是⼀样的,更复杂的操作幂等保证是利⽤唯⼀交易号(流⽔号)实现.原创 2023-12-19 11:13:29 · 479 阅读 · 0 评论 -
模板模式实操分享
一、介绍模板模式,顾名思义,定义一个模板,将部分逻辑以具体方法或者具体构造函数的形式实现,在抽象类中声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现,这就是模板方法模式的用意。模板模式涉及到三个角色: 抽象类(AbstractClass):实现了模板方法,定义了算法的骨架; 具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法; 客户角色:客户类提出使用具体类的请求; 二、示原创 2020-10-19 17:40:09 · 229 阅读 · 0 评论 -
java应用性能优化
1. 代码相关遇到性能问题,首先应该做的是检查否与业务代码相关——不是通过阅读代码解决问题,而是通过日志或代码,排除掉一些与业务代码相关的低级错误。性能优化的最佳位置,是应用内部。譬如,查看业务日志,检查日志内容里是否有大量的报错产生,应用层、框架层的一些性能问题,大多数都能从日志里找到端倪(日志级别设置不合理,导致线上疯狂打日志);再者,检查代码的主要逻辑,如 for 循环的...原创 2020-03-02 02:17:11 · 360 阅读 · 0 评论 -
性能优化
性能问题和Bug不同,后者的分析和解决思路更清晰,很多时候从应用日志(文中的应用指分布式服务下的单个节点)即可直接找到问题根源,而性能问题,其排查思路更为复杂一些。对应用进行性能优化,是一个系统性的工程,对工程师的技术广度和技术深度都有所要求。一个简单的应用,它不仅包含了应用代码本身,还和容器(虚拟机)、操作系统、存储、网络、文件系统等紧密相关,线上应用一旦出现了性能问题,需要我们从多方...原创 2020-02-29 01:10:03 · 2420 阅读 · 0 评论 -
Java 面试知识点(不断更新)
Java 基础知识01. 面向对象的特性有哪些?答:封装、继承和多态。02. Java 中覆盖和重载是什么意思?解析:覆盖和重载是比较重要的基础知识点,并且容易混淆,所以面试中常见。答:覆盖(Override)是指子类对父类方法的一种重写,只能比父类抛出更少的异常,访问权限不能比父类的小。被覆盖的方法不能是 private 的,否则只是在子类中重新定义了一个方法;重载(Ov...原创 2020-02-17 01:41:58 · 363 阅读 · 0 评论 -
怎么对Java服务进行调优
Java 应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢、接口超时,服务器负载高、并发数低,数据库频繁死锁等。尤其是在“糙快猛”的互联网开发模式大行其道的今天,随着系统访问量的日益增加和代码的臃肿,各种性能问题开始纷至沓来。Java 应用性能的瓶颈点非常多,比如磁盘、内存、网络 I/O 等系统因素,Java 应用代码,JVM GC,数据库,缓存等。笔者根据个人经验...原创 2020-02-15 16:47:00 · 312 阅读 · 0 评论 -
SnowFlake 分布式 id 生成器
在高并发或者分表分库情况下怎么保证数据id的幂等性呢?经常用到的解决方案有以下几种。微软公司通用唯一识别码(UUID)Twitter公司雪花算法(SnowFlake)基于数据库的id自增对id进行缓存这里我们要谈到snowflake算法了snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10...原创 2020-02-05 20:48:11 · 2234 阅读 · 0 评论 -
Java 中的异常和处理详解
简介程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言风格:用函数返回值作为执行状态?。Java提供了更加优秀的解决办法:异常处理机制。异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽原创 2017-09-20 13:59:59 · 262 阅读 · 0 评论 -
Java反射机制应用实践
Java反射机制应用实践引言Java反射机制是一个非常强大的功能,在很多大型项目比如Spring, Mybatis中都可以看见反射的身影。通过反射机制我们可以在运行期间获取对象的类型信息,利用这一特性我们可以实现工厂模式和代理模式等设计模式,同时也可以解决Java泛型擦除等令人苦恼的问题。本文我们就从实际应用的角度出发,来应用一下Java的反射机制。原创 2017-08-25 17:33:50 · 229 阅读 · 0 评论 -
关于Java的反射机制
关于Java的反射机制反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。【翻译于 官方文档】本篇将从以下几个方面讲述反射的知识:class 的使用方法的反射构造函数的反射原创 2017-07-18 10:35:36 · 192 阅读 · 0 评论