JVM
文章平均质量分 88
程序新视界
个人公众号【程序新视界】,一个硬技术,软实力同步提升的平台。《Spring Boo技术内幕:架构设计与实现原理》作者,《深入以太坊智能合约开发》联合作者之一。主要从事于三方支付行业。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
JDK的一个Bug,监听文件变更要小心了
在某些业务场景下,我们需要自己实现文件内容变更监听的功能,比如:监听某个文件是否发生变更,当变更时重新加载文件的内容。看似比较简单的一个功能,但如果在某些JDK版本下,可能会出现意想不到的Bug。本篇文章就带大家简单实现一个对应的功能,并分析一下对应的Bug和优缺点。监听文件变动并读取文件,简单的思路如下:这里写一个简单功能实现(不包含定时任务部分)的demo:在上述代码中,先创建一个文件(方便测试),然后两次读取文件的修改时间,并用LAST_TIME记录上次修改时间。如果文件的最新更改时间与上一次不一致原创 2022-07-06 17:34:45 · 6043 阅读 · 5 评论 -
各大框架都在使用的Unsafe类,到底有多神奇?
前言几乎每个使用 Java开发的工具、软件基础设施、高性能开发库都在底层使用了sun.misc.Unsafe,比如Netty、Cassandra、Hadoop、Kafka等。Unsafe类在提升Java运行效率,增强Java语言底层操作能力方面起了很大的作用。但Unsafe类在sun.misc包下,不属于Java标准。很早之前,在阅读并发编程相关类的源码时,看到Unsafe类,产生了一个疑惑:既然是并发编程中用到的类,为什么命名为Unsafe呢?深入了解之后才知道,这里的Unsafe并不是说线程安全原创 2022-03-28 21:05:27 · 1062 阅读 · 0 评论 -
99%的人没弄懂volatile的设计原理,更别说灵活运用了
写volatile的文章非常多,本人也看过许多相关文章,但始终感觉有哪里不太明白,但又说不上来说为什么。可能是过于追求底层实现原理,老想问一个为什么吧。而写这篇文章的目的很简单,就是突然之间明白了volatile为什么要这样设计了。好东西当然要拿出来分享了,于是就有了这篇文章。我们就从硬件到软件,再到具体的案例来聊聊volatile的底层原理,文章比较长,可收藏之后阅读。CPU缓存的出现最初的CPU是没有缓存区的,CPU直接读写内存。但这就存在一个问题,CPU的运行效率与读写内存的效率差距百倍以上。原创 2021-10-08 09:05:56 · 3379 阅读 · 6 评论 -
VisualVM导入dump提示“不是有效的核心dump”
通过VisualVM导入dump时提示“不是有效的核心dump”:导致错误的原因是:尝试打开的文件是Head Dump,而不是Core Dump。解决方法依次选择文件、装入:在装入页面选择文件格式为:“堆Dump(*.hprof,*.*)”此时再选择对应的文件,即可正常显示了。程序新视界公众号“程序新视界”,一个让你软实力、硬技术同步提升的平台,提供海量资料博主简介:《SpringBoot技术内幕》技术图书作者,酷爱钻研技术,写技术干货文章。公众号:「程序新视界」,博主的公原创 2021-07-13 13:55:24 · 4435 阅读 · 0 评论 -
String拼接出现null?你看到的分析可是错的
前言String类型真是个神奇的存在,动不动就会出现一些迷惑人的错误。今天看到一篇文中提到当String的值为null时,进行字符串相加拼接,会出现把null当做字符串拼接的现象。比如下面这段代码:String s = null;s = s + "hello";System.out.println(s + " world");你预期的结果可能是“hello world”,但实际的结果是“nullhello world”,神奇吧。其实这倒没什么,实践一下就可以看到结果。但当你好奇心作祟,在网上原创 2021-05-12 09:16:06 · 7120 阅读 · 5 评论 -
Nacos源码中为什么使用了String.intern方法?
前言面试的时候经常被问到String的intern方法的调用及内存结构发生的变化。但在实际生产中真正用到过了吗,看到过别人如何使用了吗?最近阅读Nacos的源码,还真看到代码中使用String类的intern方法,NamingUtils类中有这样一个方法: public static String getGroupedName(final String serviceName, final String groupName) { // ...省略参数校验部分 final String原创 2021-04-28 07:16:03 · 717 阅读 · 0 评论 -
ThreadLocal全攻略:使用实战,源码分析,内存泄露分析
前言说起ThreadLocal即便你没有直接用到过,它也间接的出现在你使用过的框架里,比如Spring的事物管理,Hibernate的Session管理、logback(和log4j)中的MDC功能实现等。而在项目开发中,比如用到的一些分页功能的实现往往也会借助于ThreadLocal。正是因为ThreadLocal的无处不在,所以在面试的时候也经常会被问到它的实现原理、核心API使用以及内存泄露的问题。而且基于这些问题还可以拓展到线程安全方面、JVM内存管理与分析、Hash算法等等知识点。可见Thr原创 2021-04-24 08:33:27 · 1455 阅读 · 3 评论 -
来来来,聊聊7种内存泄露场景和13种解决方案
前言Java通过垃圾回收机制,可以自动的管理内存,这对开发人员来说是多么美好的事啊。但垃圾回收器并不是万能的,它能够处理大部分场景下的内存清理、内存泄露以及内存优化。但它也并不是万能的。不然,我们在实践的过程中也不会出现那么多因内存泄露导致的生产事件了。但很多内存泄露时间也是因为开发人员使用不当导致的。本篇文章我们就来聊聊内存泄露的原因是什么,如何识别内存泄露,以及如果在应用程序中进行处理。什么是内存泄露什么是内存泄露,通俗的来说就是堆中的一些对象已经不会再被使用了,但垃圾收集器却无法将它们从内存原创 2021-04-22 07:51:14 · 2279 阅读 · 5 评论 -
通过这一篇文章,可以把Java中的类加载器了解的七七八八了
对于每个开发人员来说,java.lang.ClassNotFoundExcetpion这个异常几乎都遇到过,而追求其该异常的来源的话,就免不了谈一谈Java的类加载器了。本文就基于启动类加载器、扩展类加载器、系统类加载器和自定义类加载器来为大家补充一下这方面的知识。类加载器简介Java程序被编译器编译之后成为字节码文件(.class文件),当程序需要某个类时,虚拟机便会将对应的class文件进行加载,创建出对应的Class对象。而这个将class文件加载到虚拟机内存的过程,便是类加载。类加载器负责在原创 2021-04-20 07:29:22 · 1308 阅读 · 3 评论 -
没有监控过JVM内存的职场生涯,是不完美的
前言如果你从事Java开发多年,还没用过JVM分析工具,还没尝试着通过对JVM的dump日志来进行故障定位和性能调优,那么可以说是你职场生涯中的一大遗憾,也是一种能力的缺失。这篇文章就基于一款JDK自带的工具(VisualVM),然后编写内存溢出的案例,带大家体验一下JVM分析的入门。文中涉及到多个知识点的融合与实战经验分享,读者可留意一下。VisualVM简介VisualVM是Netbeans的profile子项目,在JDK6.0 update 7 中自带,能够监控线程,内存情况,查看方法的CPU原创 2021-04-17 18:20:30 · 1559 阅读 · 7 评论 -
GC时对象地址变了,hashCode如何保持不变?
前言前几天跟朋友交流,引出了一篇文章《GC复制存活对象,它内存地址变了么?》,我们得知在Hotspot虚拟机下,当GC发生时,对象的地址是会发生变化的。同时我们也知道,无论何时调用同一对象的hashCode方法,都必须返回相同的值,也就是说一个对象的hashCode值要在生命周期中保持不变。同时,网传“hashCode是根据对象地址生成的”。那么,问题来了,当对象地址变化了,hashCode如何保持不变呢?HashCode的约定在继续研究之前,我们先来看一下对hashCode方法的一些约定和说明。原创 2021-04-07 22:22:05 · 2097 阅读 · 4 评论 -
GC复制存活对象,它内存地址变了么?
前些天与一位朋友技术交流,朋友在招人面试时想到一个问题,JVM垃圾回收时,会复制存活的对象到不同的区域。比如从新生代复制到老年代,在此过程中,被复制的对象的地址是否变了呢?对他提出的这个问题很感兴趣,深入研究了一下,便有了这篇文章。更新引用是JVM的职责任何一款JVM的设计,采用任何一种GC算法进行对象的移动操作时,如何更新对象引用都是JVM的基本职责。也就是说,当移动对象时,必然会涉及到对象引用的变更,只不过这部分操作JVM已经帮我们做了。作为开发者来说,可以将引用理解为存储对象的抽象句柄,而不必担原创 2021-04-07 06:19:49 · 8385 阅读 · 2 评论 -
深入浅出了解Java即时编译器原理及实战
学习JVM相关的知识,必然绕不开即时编译器,因为它太重要了。了解了它的基本原理及优化手段,在编程过程中可以让我们有种打开任督二脉的感觉。比如,很多朋友在面试当中还会遇到这样的问题:Java是基于编译执行还是基于解释执行?当你了解了Java的即时编译器,不仅能够轻松回答上述问题,还能如数家珍的讲出JVM在即时编译器上采用的优化技术,而且在实践过程中更深刻的理解代码背后的原理。本文便带大家全面的了解Java即时编译器。即时编译器在部分的商用虚拟机中,比如HotSpot中,Java程序先通过解释器(Inter原创 2020-12-29 07:41:12 · 899 阅读 · 0 评论
分享