首页 > 系统相关 >java内存管理 美好的期望与现实的残酷

java内存管理 美好的期望与现实的残酷

时间:2023-08-25 11:37:31浏览次数:134  
标签:java 管理 回收 --- 内存 jvm 美好

美好的期望---看山是山,看水是水

犹记得当年刚入门学Java课时;99%的java基础性书籍和带领入门的老师都会介绍java的一项优点;即:Java 语言不使用指针,它加入了垃圾回收机制,解决了程序员需要管理内存的问题,使编程变得更加简单。

刚开始接触这段话时,心理感觉java语言太优秀了,尤其是在大一学过C语言的指针而被它搅的东南西北都摸不到方向后;自然而然的认可 java是一门懂程序员的语言:在编写业务代码实现业务功能的时候,还要花掉大部分的脑细胞来管理内存,想想就头大。可以用一句当年在编程界争论了无数次,日后很有可能还会引起无数programmer 争论的:“XXX是世界上最好的编程语言” 来代表当时内心的激动和对他的期望。

闯入迷雾---看山不是山,看水不是水

别了校园,入了江湖。亲身经历了多个java实战项目后;让我对之前java 内存管理和回收机制产生了疑惑: 这种疑惑来自于多个java项目在上线后,或多或少都有点内存问题,从而引发jvm GC频繁执行,导致后端接口的TPS急剧下降,并且响应时间陡峭的上升。 内存不是由jvm 管理吗?jvm 有垃圾回收机制,那么执行了垃圾回收后,为什么内存还不能释放了?

走出困境---看山还是山,看水还是水

也是经过系统学习和个人总结,外加实战后,才貌似明白最初看到的那句话。java 语言确实提供了垃圾回收机制,并且管理了内存。但如果使用的姿势有问题,仍然会有内存泄漏问题,并且还会引起jvm的垃圾回收机制失效,内存无法回收。具体如何失效或者错误的使用,可以另外写一篇反例 《让jvm宕机的n种编程习惯》这里就暂不展开了。

完全颠覆---看出了另外一片天空

再后来解读kafka生产端源码和netty框架时,完全颠覆了对这句话的理解。java有内存管理,但是这些优秀的高手们不用,他们要在java语言里,用java代码来管理java内存(很有点用自身的魔法来打败自身的味道)。原因就在于 这些优秀的三方框架或者中间件,为了追求极致的性能,又或者为了避免上层应用因使用自身功能带来的内存和性能而引发的业务问题。

他们认为jvm的GC过程是个重型操作,费时又费力,还会引起stop the word,在STW这段时期上层业务是临时中断的,而这种频繁的临时性中断 汇聚起来后,对业务是巨大的伤害和阻碍;而减少JVM的STW的时间和减少对业务的影响,也是Java GC优化大师现在和未来的目标之一,从PS,CMS,G1,ZGC都在往这个目标上努力。

总结

在对java内存管理的看法上,又回到了起点;如果用一句话来表达这种转变。我想借用 《深入理解java虚拟机》的作者周志明老师的总结:在java和C++程序员之间有一堵内存的墙;墙外的人想进去;墙内的人想出来

原创不易,请 点赞,关注,留言,转载 4暴击^^

标签:java,管理,回收,---,内存,jvm,美好
From: https://blog.51cto.com/u_16205794/7228001

相关文章

  • 基于java极速WEB+ORM 框架:jfinal2.0开发的通用后台管理系统及源码
    final2-common-admin1、基于java极速web开发框架:jfinal2.0开发的通用后台管理系统,包括完整的登录、注册、菜谱管理、厨师管理、餐厅管理等功能2、开发时是基于jdk1.8、tomcat7.0,utf8编码3、运行时请修改配置文件:a_little_config.txt及相应的运行环境:JavaBuildPath、TargetedR......
  • 【Java】SM2Utils(国密 SM2 工具类)
    基于bouncycastle实现国密SM2<!--引入bouncycastle--><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.70</version></dependency>importlom......
  • 解放双手!ChatGPT助力编写JAVA框架
    亲爱的Javaer们,在平时编码的过程中,你是否曾想过编写一个Java框架去为开发提效?但是要么编写框架时感觉无从下手,不知道从哪开始。要么有思路了后对某个功能实现的技术细节不了解,空有想法而无法实现。如果你遇到了这些问题,看完这篇文章你也能用ChatGPT编写一个简单的JAVA框架。构思......
  • java基础
    一、数据类型1、数据类型 2、数据类型的转换自动转换:取值范围小的类型  自动提升为  取值范围大的类型。    三元运算符 ......
  • java Object转String的4种实现方式
    1.情景展示在实际开发过程中,经常会遇到将Object类型强转成String类型。Object转String一共有几种实现方式?2.具体分析共有三种实现方式。3.解决方案以Map<String,Object>进行举例说明。Map<String,Object>map=newHashMap<>(3);map.put("k1","v1");map.put("k2",......
  • 【校招VIP】java语言考点之双亲委派模型
    考点介绍:双亲委派是校招面试中的高频考点之一。双亲委派机制定义:当一个类加载器收到了类加载的请求的时候,他不会直接去加载指定的类,而是把这个请求委托给自己的父加载器去加载。只有父加载器无法加载这个类的时候,才会由当前这个加载器来负责类的加载......一、考点题目1、为什......
  • IDEA 生成的 JAVA 接口允许跨域访问的配置
    1.新建一个基类,在类上方添加 @CrossOrigin属性importorg.springframework.web.bind.annotation.CrossOrigin;@CrossOriginpublicclassBaseController{}2.在其他controller中继承这个基类,其他接口就可以跨域访问了publicclassElseControllerextendsBaseContr......
  • 5.JAVA数组
     数组声明创建 内存的使用 定义数组时数组并不存在;只有创建数组是才存在           ......
  • 【Java】SM4Utils(国密 SM4 工具类)
    基于bouncycastle实现国密SM4<!--引入bouncycastle--><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.70</version></dependency>importlom......
  • LeetCode-21. 合并两个有序链表(Java)
    这是我在51CTO博客开启的写作之路,第一次正式写博客记录我在LeetCode的刷题日,希望能帮助更多的小伙伴攻面自己心仪的公司offer。如下对于 LeetCode-21.合并两个有序链表,进行全面解析并小结解题思路,同学们请参考:1.题目描述将两个升序链表合并为一个新的 升序 链表并返回。新链表......