jvm
要争气
人生来平凡,因奋斗进取而不凡。
展开
-
【无标题】
下图中A支配F,且F占据大量内存,但优化时F的直接支配对象A无法修改。有些情况下可能并没有支配起点对象的RetainedHeap占用很大内存(比如classX有100个对象,每个对象的RetainedHeap是10M,则classX所有对象实际支配的内存是1G,但可能Dominatortree的前20个都是其他class的对象),这时可以按class、package、classloader做聚合,进而定位目标。...转载 2022-07-28 16:48:27 · 838 阅读 · 0 评论 -
JVM 内存分析工具 MAT 的深度讲解与实践——入门篇
MAT(全名MemoryAnalyzerTool),是一款快速便捷且功能强大丰富的JVM堆内存离线分析工具。其通过展现JVM异常时所记录的运行时堆转储快照(Heapdump)状态(正常运行时也可以做堆转储分析),帮助定位内存泄漏问题或优化大内存消耗逻辑。......转载 2022-07-28 15:23:05 · 3566 阅读 · 0 评论 -
JMM内存模型 原子性 可见性
JMM java内存模型,它是在多线程访问共享数据时,提供原子性、可见性有序性的规则和保障。原子性原子性:一个原子性操作可以包含一条或多条指令,一个原子性操作中的所有指令要么都不执行,要么全部执行且不会收到其他线程操作的影响。package com.tech.jmm;/** * @author lw * @since 2021/12/6 */public class A { static int i=0; static Object o=new Object()原创 2021-12-06 11:15:21 · 434 阅读 · 0 评论 -
JIT即时编译器进行的编译优化
解释器逐行将字节码解释成机器码,交由CPU执行。即时编译器,针对与热点代码也就是反复执行的代码进行优化编译,将字节码解释成机器码,保存在codeCache中,当下次执行时直接在codeCache获取,不用再进行编译性能提升。即时编译器分为C1及即时编译器和C2即时编译器,C1即时编译器采集程序的运行状态数据,进行编译优化,C2即时编译器在C1即时编译器上层彻底进行优化,C2即时编译器的优化性能高于C1即时编译器,C1即时编译器性能高于解释器。 即时编译器在优化编译时做出的优...原创 2021-12-04 11:13:23 · 1019 阅读 · 0 评论 -
类加载器的使用及自定义类加载器
package com.tech.load.def;/** * @author lw * @since 2021/12/3 */public class UserImpl { static { System.out.println("UserImpl init ..."); }}package com.tech.load.def;/** * @author lw * @since 2021/12/3 */public class De..原创 2021-12-03 14:21:54 · 1119 阅读 · 0 评论 -
jvm中类加载器分类
类加载器是分级的,自上而下是:BootstrapClassLoader 启动类加载器,加载java_home/jre/lib下的类,由c++编写,不能通过java程序直接获取。 ExtensionClassLoader 扩展类加载器,加载java_home/jre/lib/ext下的类。 ApplicationClassLoader 应用程序类加载器,加载classpath下的类。 自定义类加载器 加载自义定路径下的类。当加载一个类时,先询问直接上级类加载器,是否加载过这个类,如果加载过那么类加原创 2021-12-01 12:14:33 · 824 阅读 · 0 评论 -
类的初始化触发的时机
类加载过程:加载、连接和初始化,类的初始化是调用的类的构造方法cinit来完成的,JVM保证了类的构造方法在执行时的线程安全。类的初始化在一定的条件下会触发,它是懒惰的:触发类的初始化的条件:通过new创建类的对象 通过Class.forName创建类的类型对象 首次访问带static修饰的静态变量或静态方法(static final修饰的string类型或基本类型变量除外) 子类在初始化时先对父类初始化 通过子类访问父类的静态变量(static final修饰的string类型或基本类原创 2021-11-30 11:10:54 · 388 阅读 · 0 评论 -
分代收集算法详解
前提概要这篇文章算是对前一篇文章的一个补充,主要地讲一下涉及知识点较多的分代收集算法。分代收集概念根据对象的存活周期不同将内存划分为新生代和老年代,存活周期短的为新生代,存活周期长的为老年代。这样就可以根据每块内存的特点采用最适当的收集算法。新生代的中每次垃圾收集中会发现有大批对象死区,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。老年代中因为对象的存活率高,没有额外的控件对它进行分...转载 2021-11-17 09:34:23 · 1602 阅读 · 0 评论 -
查询GC回收器及相关JVM设置
# windows环境 查看GC相关的JVM参数设置java -XX:+PrintFlagsFinal -version | findstr "GC" uintx AdaptiveSizeMajorGCDecayTimeScale = 10 {product} uintx AutoGCSelectPauseMillis = 5000 .原创 2021-11-12 09:18:24 · 202 阅读 · 0 评论 -
G1垃圾回收器在JDK8 JDK9中做出的几点优化
JDK8U20 字符串去重 字符串对象在底层是以char数组的形式进行存储,当创建一个字符串对象时,会将字符串对象添加到一个队列中,G1垃圾回收器在进行新生代的回收时会并发的对队列中的字符串进行去重,减少重复字符串对象对内存的占用,但是也略微增加了在对新生代回收时CPU时间的占用。jvm设置:-XX:+UseStringDeduplicationJDK8U40 并发标记类的卸载 在G1垃圾回收器并发标记执行后,如果一个类加载的所有类不在使用,那么它所加载...原创 2021-11-11 16:37:40 · 851 阅读 · 0 评论 -
垃圾回收器分类
垃圾回收器大致分为三类:串行回收器、吞吐量优先回收器和响应时间优先回收器。一 串行回收器串行回收器:采用单线程进行垃圾回收,适合堆内存较小的场景。有Serial回收器和SerialOld回收器,Serial回收器采用复制算法对新生代进行垃圾回收,SerialOld回收器采用标记整理算法对老年代进行回收。串行回收器,在执行GC过程中会造成用户线程阻塞,也就是STW问题。jvm参数配置://-XX:+UseSerialGC = Serial + SerialOl...原创 2021-11-08 16:19:51 · 1352 阅读 · 0 评论 -
新生代内存不足创建的对象直接进入老年代
package com.tech.gc.gc;import java.util.ArrayList;import java.util.List;/** * 阅读GC日志 * -Xms20M -Xmx20M -Xmn10M -XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc * 堆的初始和最大内存为20M,新生代分配10M老年代剩余10M,使用SerialGC垃圾回收器,打印GC日志 * * @author lw * @since 2021.原创 2021-11-07 13:38:09 · 601 阅读 · 0 评论 -
阅读GC日志
package com.tech.gc.gc;/** * 阅读GC日志 * -Xms20M -Xmx20M -Xmn10M -XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc * 堆的初始和最大内存为20M,新生代分配10M老年代剩余10M,使用SerialGC垃圾回收器,打印GC日志 * @author lw * @since 2021/11/7 */public class Demo_1 { private static fina.原创 2021-11-07 11:41:54 · 142 阅读 · 0 评论 -
JVM垃圾回收相关参数
含义 参数 堆初始大小 -Xms 堆最大大小 -Xmx 或 -XX:MaxHeapSize=size 新生代大小 -Xmn 或 (-XX:NewSize=size + -XX:MaxNewSize=size ) 幸存区比例(动态) -XX:InitialSurvivorRatio=ratio 和 -XX:+UseAdaptiveSizePolicy 幸存区比例 -XX:SurvivorRatio=ratio 晋升阈值 -XX:MaxTenur原创 2021-11-07 11:13:04 · 125 阅读 · 0 评论 -
JVM中的五种引用
一 强引用我们平时使用的大多数对象引用,都是强引用,如下obj就是一个强引用,强引用的特点是:如果所有的GC ROOTS对象都没有与某个对象有强引用路径,那么这个对象就可以被垃圾回收了。Object obj=new Object();二 软引用 通过SoftReference引用对象时,这个引用就是软引用。软引用的特点是:如果一个对象仅存在软引用,当进行GC后,如果内存依旧不够使用,则在下次进行GC时,回收软引用引用的对象。软引用自身也是一个对象(Sof...原创 2021-11-04 17:46:30 · 819 阅读 · 0 评论 -
使用Mat内存分析工具分析GC Roots对象
首先编写一段测试代码package com.tech.gc.root;import java.io.IOException;import java.util.ArrayList;import java.util.List;/** * @author lw * @since 2021/11/3 */public class Demo_1 { public static void main(String[] args) throws IOException {原创 2021-11-03 11:17:11 · 839 阅读 · 1 评论 -
直接内存及内存分配与释放
直接内存使用的是操作系统内存,不受JVM管理,读写速度快,内存的分配与释放代价高,常用作NIO的数据缓冲区,如 ByteBuffer。使用传统IO与NIO(使用直接内存)拷贝文件性能对比package com.tech.direct;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.nio.ByteBuffer;im...原创 2021-11-01 11:26:52 · 524 阅读 · 0 评论 -
使用StringTable节省堆内存
如果应用中有大量的字面量字符串,使用intern方法将这些字符串放入串池中比直接放入堆中要节省内存。package com.tech.constantpool;import java.io.BufferedReader;import java.io.FileInputStream;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.List;/** * 字符串入池与不...原创 2021-10-29 15:37:16 · 140 阅读 · 0 评论 -
StringTable优化
StirngTable进行入池字符串时,先查找StringTable中是否有该字符串,没有才会入池,StringTable是一个hash表,适当增加StringTable中桶的数量,会减少hash碰撞的几率,提升查找效率。package com.tech.constantpool;import java.io.*;/** * 串池中桶的数量对性能的影响 * 设置栈内存500m 堆内存500m 打印串池统计信息 串池中桶的数量 * -Xms500m -Xmx500m -XX:+PrintS原创 2021-10-29 14:55:32 · 141 阅读 · 0 评论 -
StringTable串池垃圾回收
先看一段代码:package com.tech.constantpool;/** * 演示StringTable垃圾回收 * jvm参数:设置堆空间大小为10M;打印串池统计信息;打印GC信息 * -Xmx10m -XX:+PrintStringTableStatistics -XX:+PrintGCDetails -verbose:gc * * @author lw * @since 2021/10/29 */public class Demo_6 { public st原创 2021-10-29 14:03:46 · 268 阅读 · 0 评论 -
在JDK1.8中串池的位置是在堆中
package com.tech.constantpool;import java.util.ArrayList;import java.util.List;/** * @author lw * @since 2021/10/29 */public class Demo_5 { public static void main(String[] args) { List<String> list=new ArrayList<>(); .原创 2021-10-29 10:44:14 · 376 阅读 · 0 评论 -
字符串相等判断
字面量是保存在常量池的串池中,字面量相加会被编译器优化,直接将结果保存在串池中(如果之前已经存在,直接使用不会入池)。如果是变量相加,则会使用stringbuilder进行append,然后调用stringbuilder的toString方法,将结果保存在堆中 在jdk1.8中,intern方法会将堆中字符串进行入池,并返回池中的字符串,如果池中在入池前存在该字符串则原字符串引用不变,如果串池中之前不存在该字符串,则原字符串引用指向池中字符串。package com....原创 2021-10-29 10:17:45 · 312 阅读 · 0 评论 -
字符串拼接
package com.tech.constantpool;/** * @author lw * @since 2021/10/26 */public class Demo_3 { public static void main(String[] args) { String s1="a"; String s2="b"; String s3="ab"; String s4=s1+s2; System.out.原创 2021-10-26 10:46:01 · 75 阅读 · 0 评论 -
串池与常量池的关系
在运行时常量池中,有一块逻辑区域是StringTable(串池),用于存放字面量,串池实际上是一个hash表,不能扩容。当jvm指令在执行时,当执行到字面量信息时,会去串池中查找是否有该字面量,如果没有该字面量将其放入到串池中。package com.tech.constantpool;/** * @author lw * @since 2021/10/26 */public class Demo_2 { public static void m...原创 2021-10-26 10:32:31 · 660 阅读 · 0 评论 -
类的二进制字节码文件
有一段简单的java代码,经过编译器编译后得到类的二进制字节码文件,使用javap反向解析器分析该class文件。package com.tech.constantpool;/** * @author lw * @since 2021/10/26 */public class Demo_1 { public static void main(String[] args) { System.out.println("hello wo...原创 2021-10-26 09:48:07 · 289 阅读 · 0 评论 -
方法区及内存溢出
方法区用于存放类信息、类加载器、常量池等,方法区在jvm启动时创建,方法区是一套规范,不同的jvm厂商对于方法区实现有所不同。比如Oracle的hotspot虚拟机,在jdk1.8之前使用永久代实现方法区,永久代使用的是堆空间;在jdk1.8及之后使用元空间来实现方法区,元空间使用的是直接内存。方法区也存在内存溢出异常,如方法区加载过多类的二进制字节码会出现内存溢出错误。使用jdk1.8版本 演示内存溢出错误package com.tech.metaspace;impor...原创 2021-10-25 10:30:39 · 737 阅读 · 0 评论 -
jvisualvm进行资源监视
package com.tech.heap;import java.util.ArrayList;import java.util.List;/** * @author lw * @since 2021/10/22 */public class HeapDemo_3 { public static void main(String[] args) throws InterruptedException { List<Student> list=new .原创 2021-10-22 17:55:22 · 136 阅读 · 0 评论 -
JVM堆内存诊断 jmap
使用jps查看进程ID; jmap -heap 进程ID;jmap可以详细的打印堆内存使用信息package com.tech.heap;/** * @author lw * @since 2021/10/22 */public class HeapDemo_2 { public static void main(String[] args) throws InterruptedException { System.out.println...原创 2021-10-22 14:19:02 · 406 阅读 · 0 评论 -
堆内存溢出
通过new关键字创建的对象存储在堆中,垃圾收集器会关注堆空间,堆可能会出现堆内存溢出异常。模拟堆内存溢出package com.tech.stack;import java.util.ArrayList;import java.util.List;/** * @author lw * @since 2021/10/22 */public class StackDemo_4 { public static void main(String[] args) {原创 2021-10-22 10:24:38 · 176 阅读 · 0 评论 -
栈内存溢出
虚拟机栈是每个线程运行所需要的内存空间,虚拟机栈是由栈帧组成,栈帧是每个方法运行所需要的内存空间,用于存放参数、局部变量和返回地址等信息,当一个栈中所有栈帧所需要的内存空间超过栈的空间时,会出现栈溢出异常。模拟栈溢出package com.tech.stack;/** * @author lw * @since 2021/10/21 */public class StackDemo { private static int count = 0; pu...原创 2021-10-21 10:04:30 · 226 阅读 · 0 评论 -
java 偏向锁、轻量级锁及重量级锁synchronized原理
Java对象头与Monitorjava对象头是实现synchronized的锁对象的基础,synchronized使用的锁对象是存储在Java对象头里的。对象头包含两部分:Mark Word 和 Class Metadata Address其中Mark Word在默认情况下存储着对象的HashCode、分代年龄、锁标记位等以下是32位JVM的Mark Word默认存储结构由于对象头的信息是与对象自身定义的数据没有关系的额外存储成本,因此考虑到JVM的空间效率,Mark W转载 2021-07-16 09:58:36 · 203 阅读 · 0 评论 -
java中SoftReference与WeakReference应用于高速缓存示例
前言:本文首先介绍强引用StrongReference、软引用SoftReference、弱引用WeakReference与虚引用PhantomReference之间的区别与联系;并通过一个高速缓存的构建方案,来了解SoftReference的应用场景。本文参考书籍Thinking in Java以及多篇博文。一、Reference分类Reference即对象的引用,根据引用的不同类型,对JVM的垃圾回收有不同的影响。1. 强引用StrongReference通常构建对象的引转载 2021-07-13 15:04:21 · 494 阅读 · 0 评论 -
JVM内存Xmx和Xmn设置
原文路径:https://www.dutycode.com/jvm_xmx_xmn_xms_shezhi.html问题:新上线一个java服务,或者是RPC或者是WEB站点, 内存的设置该怎么设置呢?设置成多大比较合适,既不浪费内存,又不影响性能呢?分析:依据的原则是根据Java Performance里面的推荐公式来进行设置。具体来讲:Java...转载 2019-07-26 10:12:25 · 2234 阅读 · 0 评论 -
【转】JVM垃圾收集机制
相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题,有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制中的知识点呢?没时间捋也没关系,因为小编接下来会给你捋一捋。一、 技术背景你要了解吧 按照套路是要先装装X,谈谈JVM垃圾回收的前世今生的。说起垃圾回收(GC),大部分人都把这项技术当做Java语言的伴生产物。事实上,GC的历史比Java久远,早在1960年Lis...转载 2018-10-18 10:50:00 · 203 阅读 · 0 评论 -
jvm内存溢出之jdk命令
jps 查看java应用pidjps -l 列出应用pid 及jar包完整名称。jps -v 列表应用pid 及jvm参数。jmap 获取内存快照jmap -histo:live pid查看内存中对象实例的数量及占据内存大小并排序jmap -dump:format=b,file=文件名 pid导出内存快照,使用mat进行内存溢出分析jstat 查看内存使用jstat -gc pi...原创 2018-10-23 10:48:32 · 681 阅读 · 0 评论 -
jvm内存溢出之Memory Analizer分析内存快照
mat是eclipse的一个插件,可以分析内存快照帮助我们排查内存泄漏的地方。首先下载mat, MemoryAnalyzer-1.8.1.20180910-win32.win32.x86_64.zip解压后:双击 MemoryAnalyzer.exe 打开mat写一段出现内存溢出的代码,设置jvm参数 使其出现内存溢出生成一个内存快照文件package cn.n1.t...原创 2018-10-23 11:15:29 · 3755 阅读 · 0 评论 -
【转】java内存泄漏的定位与分析
1、为什么会发生内存泄漏Java如何检测内在泄漏呢?我们需要一些工具进行检测,并发现内存泄漏问题,不然很容易发生down机问题。编写java程序最为方便的地方就是我们不需要管理内存的分配和释放,一切由jvm来进行处理,当java对象不再被应用时,等到堆内存不够用时,jvm会进行垃圾回收,清除这些对象占用的堆内存空间,如果对象一直被应用,jvm无法对其进行回收,创建新的对象时,无法从Heap...转载 2018-10-23 13:42:05 · 179 阅读 · 0 评论 -
【转】线上内存溢出分析
状况描述:最近项目新打的版本,过不了多长时间,项目就会挂掉。状况就是处于一种假死的状态。索引查询都很慢,几乎进行不了任何操作,慢慢卡死。然后我们再发版时,只能基于之前打好的war包,替换或者增加class文件。情况对比及分析:由于之前代码做过一次大整顿,提交的代码比较多,所以通过回滚版本的方式解决,比较困难。一是因为整顿的成果不能白白抹杀;二是那么多文件,靠人工挨个对比查找,比较困难。...转载 2018-10-23 13:43:44 · 286 阅读 · 0 评论 -
JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)
1.背景2.为什么废弃永久代(PermGen)3.深入理解元空间(Metaspace)4.总结========正文分割线=====一、背景1.1 永久代(PermGen)在哪里?根据,hotspot jvm结构如下(虚拟机栈和本地方法栈合一起了):上图引自网络,但有个问题:方法区和heap堆都是线程共享的内存区域。关于方法区和永久代:在HotSpot J...转载 2019-07-06 11:15:16 · 205 阅读 · 0 评论 -
JVM优化之 -Xss -Xms -Xmx -Xmn 参数设置
版权声明:转载请注明出处 https://blog.csdn.net/yrwan95/article/details/82826519XmnXmsXmxXss有什么区别Xmn、Xms、Xmx、Xss都是JVM对内存的配置参数,我们可以根据不同需要区修改这些参数,以达到运行程序的最好效果。-Xms 堆内存的最小大小,默认为物理内存的1/64-Xmx 堆内存的最大大小,默认为物理内存的1...转载 2019-07-06 11:46:00 · 661 阅读 · 0 评论