
jvm & jdk
文章平均质量分 68
Dongguabai
这个作者很懒,什么都没留下…
展开
-
结合 Java Swing 实现 Java 文件和 JAR 包的拖拽执行
本文实现了一个简单的工具,用户可以通过拖拽的方式执行 Java 文件和 JAR 包。同时,通过使用胖 JAR 来解决依赖类的加载问题;通过自定义类加载器打破双亲委派机制,从而解决了类冲突问题。源码地址:https://gitee.com/dongguabai/blog/tree/master/others。原创 2024-01-05 18:02:57 · 1009 阅读 · 0 评论 -
记一次半夜蹲守异常请求(半夜频繁 FullGC)
防御性编程:我们应始终考虑到各种可能的异常情况,并在编程时采取预防措施一次彻底解决因数据库全表扫描引发系统卡顿问题的实践线上问题排查的关键在于“现场”:这就像破案一样,如果现场没有保存好,破案的难度会大大提升。原创 2023-12-09 17:37:09 · 1470 阅读 · 0 评论 -
服务监控与优化之一次对服务内存占用过高的排查
本次对系统内存进行了一次粗粒度的优化,但仔细看系统仍然有很大的优化空间,如果有进一步的优化进展,将分享并与大家进行讨论。实际上,在网上有很多关于内存持续升高问题的分析,尽管原因不尽相同,但它们为我们提供了宝贵的思路,尤其当我们自己遇到困惑时,这些分享能够为我们提供新的启发。而这正是经验分享的真正价值所在。原创 2023-09-19 23:53:13 · 293 阅读 · 0 评论 -
由 System.gc() 频繁引起 Full GC 的问题排查
早上服务频繁出现 Full GC 报警(由于昨晚下掉了参数,其实会有 Full GC 产生已经在意料之中,但属实没想到会触发的这么频繁),这里 JVM 总共运行了 4531.278 s,可以看到差不多半分钟一次 Full GC,单次 Full GC 大概耗时 1.5s。根据经验可以判断出是由于被调用引起的,(在网上最著名的案例之一是由 JXL API 框架引发的)。原创 2023-09-13 23:12:46 · 657 阅读 · 0 评论 -
java old gen_Java查看Old代对象具体信息
开启 GC 日志java -XX:+PrintGCDetails -XX:+HeapDumpBeforeFullGC -XX:+PrintHeapAtGC得如如下类似日志[PSYoungGen: 611840K->992K(612352K)] 1260846K->650606K(1308672K), 0.0047655 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]Heap after GC invocations=30667转载 2022-03-11 14:58:58 · 2050 阅读 · 0 评论 -
不同GC下ParallelGCThreads和ConcGCThreads的计算公式
目录前面的文章(JVM认知的常见10个误区 - kimmking的文章 - 知乎JVM认知的常见10个误区 - 知乎)里,我们提到了CMS下的这两个参数的关系。其实我们可以全面的看一下Parallel/CMS/G1 GC下的这个关系。计算公式结论这里先总结一下,具体的验证过程见下面的步骤:三种GC下,ParallelGCThreads默认值都是CPU线程数(想想为什么?) 并行Parallel GC下:ConcGCThreads = 0 CMS GC下,ConcGCThreads.转载 2021-11-25 22:07:39 · 3282 阅读 · 0 评论 -
JVM中MemoryUsage中init,committed,used,max的含义
以下摘抄自JDK1.7 * <table> * <tr> * <td valign=top> <tt>init</tt> </td> * <td valign=top> represents the initial amount of memory (in bytes) that * the Java virtual machine requests from the operating system转载 2021-11-24 17:34:22 · 3330 阅读 · 0 评论 -
java -jar 和 -cp详解
命令行执行程序假如我们有一个程序,把它打包成Test.jar,如何运行才能成功输出Hello Worldpackage com.test;public class Test { public static void main(String[] args) { System.out.println("Hello World"); }}我们有以下两种方法1. java -jar Test.jar2. java -cp com.test.Test Test转载 2021-11-23 08:37:44 · 4220 阅读 · 0 评论 -
小议 ThreadLocal 中的 remove() 和 set(null)
相关文章:ThreadLocal 系列之 ThreadLocal 会内存泄漏吗?今天组内同学总结处理 Sonar 扫描经验的时候提到了一点:“ThreadLocal 没有调用 remove() 方法,存在内存泄漏的风险” 。Sonar 完整描述如下:Call “remove()” on “goodsImgMapThreadLocal”.“ThreadLocal” variables should be cleaned up when no longer usedThreadLocal var原创 2021-11-11 14:09:39 · 4539 阅读 · 1 评论 -
一次线上的 G1 优化实践
e个人觉得想要优化一个系统首先就要对这个系统的特点有所了解。目前我们这个系统的特点是可能会出现短时间内对象产生速度过快,从而造成系统会在某段时间内 STW 时间过长,触发容器的健康检查从而导致容器重启。注:该系统生产环境使用的机器配置为 4C16G。我们最初将 CMS 换成 G1 后的参数如下:-Xms11g -Xmx11g -Xmn8g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/java_heapdump.原创 2021-10-15 17:17:33 · 772 阅读 · 0 评论 -
给 GC 日志增加时间戳防止服务重启日志覆盖
可以加上%t参数,比如:java -server -Xms1g -Xmx1g -Xmn100m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/dongguabai/Desktop/temp/ -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -Xloggc:/Users/dongguabai/Desktop/temp/gc_%t.log -XX:+PrintGCDetails -XX:+PrintGC..原创 2021-09-22 12:56:01 · 883 阅读 · 0 评论 -
再理解 Java 中的引用传递
相关文章:用最简单的方式解释 Java 是值传递还是引用传递关于 Java 的值传递和引用传递非常容易搞混,今天又因为这个问题跟一个朋友讨论了一下先看这么一段代码: public static void main(String[] args) { ListNode head = new ListNode(-1); ListNode tail = new ListNode(0); head.next = tail; tail原创 2021-05-03 21:38:15 · 211 阅读 · 0 评论 -
关于 JDK 1.7 HashMap 并发情况下可能发生的死循环与数据丢失
这是一个老生常谈的内容了,最近复习发现博客中居然没有记录这块,今天特地记录下。HashMap 本身是线程不安全的,如果线程并行插入元素,可能会同时触发扩容。这里会新建一个更大的数组,并调用 transfer 方法对元素进行转移,转移的逻辑也很很好理解,就是遍历原来 table 中每个位置的节点,并对每个元素进行重新 hash,在新的 newTable 找到位置,并插入。transfer 方法如下: /** * Transfers all entries from current t.原创 2021-04-11 21:31:38 · 882 阅读 · 0 评论 -
subList 序列化问题:Can not construct instance of java.util.ArrayList$SubList: no default no-argume
ArrayList 的 subList 方法返回的不是 ArrayList:SubList 没有实现序列化。所以之前的代码(伪代码):redis.set(key,list.subList(0,1))可以改成:redis.set(key,new ArrayList(list.subList(0,1)))原创 2021-03-26 17:00:47 · 823 阅读 · 0 评论 -
String中创建字符串常量用new和不用new的区别
String实质是字符数组,两个特点:1、该类不可被继承;2、不可变性(immutable)例如 String s1 = new String(“myString”);和 String s1 = “myString”;第一种方式通过关键字new定义过程:1.在程序编译期,编译程序先去字符串常量池检查,是否存在“myString”,如果不存在,则在常量池中开辟一个内存空间存放“myString”;如果存在的话,则不用重新开辟空间,保证常量池中只有一个“myString”常量,节省内存空间。转载 2021-03-21 16:56:19 · 534 阅读 · 0 评论 -
jprofiler 查看程序内存泄露
在最近的工作中,通过JProfiler解决了一个内存泄漏的问题,现将检测的步骤和一些分析记录下来,已备今后遇到相似问题时可以作为参考。运行环境:Tomcat6,jdk6,JProfiler8内存泄漏的现象:1. 在服务器中执行某些批量操作的时候,发现内存只升不降;就算gc后,内存也不能被完全释放;2. 除非重启tomcat服务器,内存永远不会被释放,反复执行这些操作,会导致无可用内存,tomcat死掉;使用JProfiler检查内存泄漏的步骤:1. 初始化检验环...转载 2021-03-21 06:40:18 · 1837 阅读 · 0 评论 -
Java1.8-WeakHashMap源码解析
概述 在学习WeakHashMap之前,先简单来说一下Java中的4种引用类型,它们分别是:强引用(Strong Reference),软引用(Soft Reference),弱引用(Weak Reference),幽灵引用或者翻译为虚引用(Phantom Reference)。强引用:强引用是Java中最普遍的应用,比如new Object,新建的object对象就属于强引用类型。如果一个对象是强引用类型,那么即使是Java虚拟机内存空间不足时,GC也不会回收该对象,而是内存溢出,比如我们常见转载 2021-03-06 23:55:27 · 348 阅读 · 0 评论 -
关于 JDK 中引用队列使用的两个 Bug
可能涉及到 JDK的两个 Bug,但也是一个几乎不会遇到的场景,记录一下,只能说一入 Java 深似海,大周末的,图个乐呵。关于 Java 弱引用和引用队列,我们一般是这么认为的,这里引用网上一篇博客的说明:弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。https://www.cnblogs.com/daxin/archive/2013/06/03/3114679.html但是经过一些原创 2021-03-06 23:36:17 · 191 阅读 · 0 评论 -
关于Java中的WeakReference
一. 简介在看ThreadLocal源码的时候,其中嵌套类ThreadLocalMap中的Entry继承了WeakReferenc,为了能搞清楚ThreadLocal,只能先了解下了WeakReferenc(是的,很多时候为了搞清楚一个东西,不得不往上追好几层,先搞清楚其所依赖的东西。)下面进入正题,WeakReference如字面意思,弱引用, 当一个对象仅仅被weak reference(弱引用)指向, 而没有任何其他strong reference(强引用)指向的时候, 如果这时GC运行, 那么转载 2021-03-06 20:53:50 · 391 阅读 · 0 评论 -
CMS GC:CMS 废弃了,该怎么办呢?
流行的 CMS( Concurrent Mark Sweep) GC 算法在 JDK 9 中被废弃了。根据 JEP-291 中的说明,为了减轻 GC 代码的维护负担以及加速新功能开发,决定在 JDK9 中废弃CMS GC。因此,从 Java 9 开始,如果您使用 -XX:+UseConcMarkSweepGC(激活 CMS GC 算法的参数)参数启动应用程序,则会在下面显示警告消息:Java HotSpot(TM) 64-Bit Server VM warning: Option UseConcM转载 2021-03-06 15:14:33 · 324 阅读 · 0 评论 -
[讨论] 并发垃圾收集器(CMS)为什么没有采用标记-整理算法来实现?
并发垃圾收集器(CMS)为什么没有采用标记整理-算法来实现,而是采用的标记-清除算法?分代式GC里,年老代常用mark-sweep;或者是mark-sweep/mark-compact的混合方式,一般情况下用mark-sweep,统计估算碎片量达到一定程度时用mark-compact。这是因为传统上大家认为年老代的对象可能会长时间存活且存活率高,或者是比较大,这样拷贝起来不划算,还不如采用就地收集的方式。Mark-sweep、mark-compact、copying这三种基本算法里,只有mark-swe转载 2021-03-05 20:20:18 · 552 阅读 · 0 评论 -
OutOfMemoryError内存溢出相关的JVM参数
JVM提供了很多处理内存溢出的相关参数,本文主要来讲解下这些参数,当你遇到内存溢出的时候可能会对你非常有帮助,这些参数主要有:1.-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath2.-XX:OnOutOfMemoryError3.-XX:+ExitOnOutOfMemoryError4.-XX:+CrashOnOutOfMemoryError下面我们来详细的看下每个参数的意义和用法。1.-XX:+HeapDumpOnOutOfMemor转载 2021-03-05 13:13:48 · 551 阅读 · 0 评论 -
开启String去重XX:+UseStringDeduplication的利与弊
首先来看下由JDK开发组研究得出的一组有趣的统计数据:1.java应用内存里面的字符串占比大概是25%。2.java应用内存里面的字符串有13.5%是重复的。3.字符串的平均长度是45。由于存在重复字符串导致高达13.5%的内存被浪费了!你可以用HeapHero来分析看下你的应用中有多少内存是因为重复字符串被浪费掉的。什么是重复字符串呢?看下面的代码:String string1 = new String("Hello World");String string2 = new转载 2021-03-05 13:11:48 · 2334 阅读 · 1 评论 -
为什么不推荐启用UseGCLogFileRotation来记录GC日志?
很多小伙伴在记录GC日志的时候都喜欢使用UseGCLogFileRotation这个参数,比如:-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/home/GCEASY/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20M上面的例子中,JVM的一个日志文件达到了20M以后,就会写入另一个新的文件,最多会有5个日志文件,他们的名字分转载 2021-03-05 13:09:14 · 468 阅读 · 0 评论 -
获取 Unsafe 对象的方法
package dongguabai.unsafe;import sun.misc.Unsafe;/** * @author Dongguabai * @description * @date 2021-02-21 19:38 */public class Main { public static void main(String[] args) { Unsafe unsafe = UnsafeUtils.getUnsafe(); int and.原创 2021-02-21 19:40:18 · 407 阅读 · 0 评论 -
@CallerSensitive 注解的作用
在java的 Class类forName方法上,有个CallerSensitive注解。@CallerSensitivepublic static Class<?> forName(String className) throws ClassNotFoundException { Class<?> caller = Reflection.getCallerClass(); return forName0(className, true,转载 2021-02-21 17:16:11 · 7066 阅读 · 0 评论 -
剖析 Reflection.getCallerClass
/** * 不推荐使用:http://www.oracle.com/technetwork/java/faq-sun-packages-142232.html * Reflection的getCallerClass的使用:可以得到调用者的类.这个方法是很好用的. 0 和小于0 - 返回 Reflection类 1 - 返回自己的类 2 - 返回调用者的类 3. 4. ....层层.转载 2021-02-21 17:13:03 · 394 阅读 · 0 评论 -
JDK动态代理,获取动态生成的代理类的class文件
1、定义一个接口public interface IHandlerInterface { public void test();}2、定义实现类public class RealHandlerInterface implements IHandlerInterface { @Override public void test() { ServiLogger.log("RealHandlerInterface: test");转载 2021-01-26 14:37:38 · 1766 阅读 · 0 评论 -
关于 Java 虚引用使用的一个个人想法
关于 Java 虚引用使用的一个个人想法在 Java 四大引用(强、软、弱、虚)中,虚引用应该是平时使用和在各种中间件中最不常见到的,PhantomReference 开头注释是这么描述的:Phantom reference objects, which are enqueued after the collectordetermines that their referents may otherwise be reclaimed. Phantomreferences are mos原创 2021-01-12 18:42:27 · 248 阅读 · 0 评论 -
关于 Java for 循环执行顺序一个要注意的地方
Java 基础,这里记录一下。平时开发中 for 循环使用的非常多,我们都知道 for 循环的顺序如下:// exp2 为条件表达式for(exp1;exp2;exp4){ exp3;}先执行 exp1,再执行 exp2,如果返回 true,则执行 exp3,最后再执行 exp4,然后再到 exp2;如果执行 exp2 为 false,则会跳出循环体;接下来看一个插入排序的例子,实现方式如下:package dongguabai.algorithm;import java.原创 2021-01-06 17:05:41 · 523 阅读 · 0 评论 -
Java8中@Contended和伪共享
Java8中@Contended和伪共享Java8引入了@Contented这个新的注解来减少伪共享(False Sharing)的发生。本文介绍了@Contented注解并解释了为什么False Sharing是如何影响性能的。缓存行CPU读取内存数据时并非一次只读一个字节,而是会读一段64字节长度的连续的内存块(chunks of memory),这些块我们称之为缓存行(Cache line)。假设你有两个线程(Thread1和Thread2)都会修改同一个volatile变量x转载 2020-12-29 16:20:39 · 2056 阅读 · 0 评论 -
一行命令轻松获取 JVM 默认配置
jvm默认有非常多的配置,而这些配置我们可以依据实际场景和情况进行调整与修改,比如UseG1GC、MaxDirectMemorySize、SurvivorRatio等配置都在里面,不同环境下配置也不同,可以通过此方式查看配置环境win10 家庭中文版 4v16GB jdk1.8.0_201 win32配置如果要查看jvm的全部默认配置,使用命令:java -XX:+PrintFlagsFinal -version,没有显示的说明无默认值C:\Users\RX1270.000>.转载 2020-12-18 14:16:29 · 401 阅读 · 0 评论 -
Java 获取当前进程的相关信息(进程 ID,进程启动时间等)
主要是 ManagementFactory 相关的类,翻一翻 API 会有不少收获:package dongguabai.demo.jvm.process;import java.lang.management.ManagementFactory;import java.lang.management.MemoryManagerMXBean;import java.lang.management.RuntimeMXBean;import java.lang.management.ThreadMX原创 2020-11-29 09:32:01 · 4233 阅读 · 0 评论 -
JVM 优化实操 - 内存分配与回收策略
JVM 体系难学的一个地方就是理论一大堆,却难以实践。今天就尝试着在本地实践一把,体会 JVM 内存分配和垃圾回收的过程,尽可能的能够通过本地实际操作感受一下之前学习到的一些理论知识,作为一名初学者,也许很多分析和观点不一定对,但总归是实践了一把,欢迎和大家一起讨论。环境准备首先看下我本地的 JDK 版本和一些默认参数:➜ Contents java -XX:+PrintCommandLineFlags -version-XX:InitialHeapSize=134217728 -XX:MaxHe原创 2020-11-20 01:20:20 · 520 阅读 · 0 评论 -
VisualVM Visual GC 插件 Histogram 直方图显示“不首此 JVM 支持”
现象如下:根据相关说明:daemon must be running on remote hosts). The Histogram view may or may not be displayed by default depending on the application configuration - when the monitored VM uses Parallel Scavenge collection (using Server VM or setting-XX:+UseP.原创 2020-11-18 19:55:32 · 1437 阅读 · 0 评论 -
为什么我的JVM能实际使用的内存比-Xmx指定的少?
你好,你能过来看看帮我解决一个奇怪的问题么。”就是这个技术支持案例使我想起写下这篇帖子。眼前的这个问题就是关于不同工具对于可用内存大小检测的差异。其实就是一个工程师在调查一个应用程序的过高的内存使用情况时发现,尽管该程序已经被指定分配2G堆内存,但是JVM检测工具似乎并不能确定进程实际能用多少内存。例如jconsole显示可用堆内存为1,963M,然而jvisualvm却显示能用2,048M。所以到底哪个工具才是对的,为什么检测结果会出现差异呢?这确实是个挺奇怪的问题,特别是当最常出现的几种解释理.转载 2020-11-17 18:41:13 · 353 阅读 · 0 评论 -
java --Runtime.getRuntime()内存查看
摘自:http://7sunet.iteye.com/blog/285007java.lang.Runtime类中的freeMemory(),totalMemory(),maxMemory ()这几个方法的一些问题,很多人感到很疑惑,为什么,在java程序刚刚启动起来的时候freeMemory()这个方法返回的只有一两兆字节,而随着 java程序往前运行,创建了不少的对象,freeMemory()这个方法的返回有时候不但没有减少,反而会增加。这些人对freeMemory()这 个方法的意义应该有一些误.转载 2020-11-17 18:22:47 · 1919 阅读 · 0 评论 -
Java 中 boolean 类型占用多少个字节
为什么要问这个问题,首先在Java中定义的八种基本数据类型中,除了其它七种类型都有明确的内存占用字节数外,就boolean类型没有给出具体的占用字节数,因为对虚拟机来说根本就不存在 boolean 这个类型,boolean类型在编译后会使用其他数据类型来表示,那boolean类型究竟占用多少个字节?带着疑问,随便网上一搜,答案五花八门,基本有以下几种:1、1个bit理由是boolean类型的值只有true和false两种逻辑值,在编译后会使用1和0来表示,这两个数在内存中只需要1位(bit)即可存储转载 2020-11-11 09:19:37 · 277 阅读 · 0 评论 -
解决IDEA提示JAVA字符串常量过长问题
环境:Intellij IDEA 2018.1.5;在做一个非常长的JSON 转对象的dubug时Intellij IDEA 编译不通过,报”java常量字符串太长”,解决方案如下.IDEA的操作流程:File -> Settings -> Build,Execution,Deployment -> Compiler -> Java Compiler。点击 Use Compiler, 选择Eclipse, 点击确定保存即可。...转载 2020-08-13 12:51:21 · 2341 阅读 · 0 评论 -
自己动手写 Java 虚拟机(二)-查找 Class 文件
相关文章:自己动手写 Java 虚拟机(一)-编写命令行工具我们都知道 Java 类加载有这么几个阶段:加载、验证、准备、解析和初始化。本文就是实现加载阶段的查找 class 文件。《自己动手写 Java 虚拟机》前两章其实并未涉及到很多 JVM 相关的知识,主要是在为后面做准备,一些内容书上过于繁琐,不属于主干内容,这里会简写或者忽略。类路径按照搜索的先后顺序,类路径可以 分为以下3个部分:启动类路径(bootstrap classpath)扩展类路径(extension classpa原创 2020-06-11 17:45:52 · 386 阅读 · 0 评论