![](https://img-blog.csdnimg.cn/20210507154659135.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JVM
尚硅谷JVM学习笔记
Eistert
文章大部分都是前人总结的知识点,我只是一个搬运工……
展开
-
常用JVM参数
常用JVM参数 https://www.cnblogs.com/xuwenjin/p/13092857.html 十个最常用的JVM 配置参数 https://page.om.qq.com/page/OOjGMeW8-zLbPbsOwac6Du-A0 java启动参数共分为三类 https://www.cnblogs.com/jiataoq/p/9512498.html -XX:+DisableExplicitGC弊端 https://blog.csdn.net/bingxuesiyang/article/原创 2021-12-14 10:25:35 · 81 阅读 · 0 评论 -
JVM垃圾收集器
ParNew与CMS垃圾回收器 https://www.cnblogs.com/nangonghui/p/14108570.html原创 2021-12-14 10:20:40 · 179 阅读 · 0 评论 -
JDK内置工具-jmap命令(Java Memory Map)
基础知识 jdk安装后会自带一些小工具,jmap命令(Java Memory Map)是其中之一。主要用于打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。 jmap命令可以获得运行中的jvm的堆的快照,从而可以离线分析堆,以检查内存泄漏,检查一些严重影响性能的大对象的创建,检查系统中什么对象最多,各种对象所占内存的大小等等。可以使用jmap生成Heap Dump。 java memory = direct memory(直接内存) + jvm memory(MaxPermS转载 2021-12-09 11:13:58 · 843 阅读 · 0 评论 -
JVM-多态原理(难度有点大,先放下)
/** * 演示多态原理,注意加上下面的 JVM 参数,禁用指针压缩 * -XX:-UseCompressedOops -XX:-UseCompressedClassPointers */ public class Demo3_10 { public static void test(Animal animal) { animal.eat(); System.out.println(animal.toString()); } public s转载 2021-08-07 13:34:19 · 181 阅读 · 0 评论 -
JVM-构造方法的原理
1 cinit()V 整个类的构造方法 public class Demo3_8_1 { static int i = 10; static { i = 20; } static { i = 30; } public static void main(String[] args) { System.out.println(Demo3_8_1.i); } } 编译器会按从上至下的顺序,收集转载 2021-08-06 15:58:35 · 253 阅读 · 0 评论 -
JVM-条件判断指令&&循环控制指令
条件判断指令 例子: public class Demo3_3 { public static void main(String[] args) { int a = 0; if(a == 0) { a = 10; } else { a = 20; } } } -1到5之间的数用iconst表示 思考 细心的同学应当注意到,以上比较指令中没有 long,float,doub转载 2021-08-06 15:21:52 · 149 阅读 · 0 评论 -
JVM-类文件结构与字节码指令
类文件结构 字节码指令 1、类文件结构 一个简单的 HelloWorld.java // 二进制字节码(类基本信息,常量池,类方法定义,包含了虚拟机指令) public class HelloWorld { public static void main(String[] args) { System.out.println("hello world"); } } 执行 javac -parameters -d . HellowWorld.java 编译为 HelloWo转载 2021-08-06 14:48:43 · 153 阅读 · 0 评论 -
JVM-垃圾回收调优
预备知识 - 掌握 GC 相关的 VM 参数,会基本的空间调整 - 掌握相关工具 - 明白一点:调优跟应用、环境有关,没有放之四海而皆准的法则 查看虚拟机参数命令 D:\JavaJDK1.8\bin\java -XX:+PrintFlagsFinal -version | findstr "GC" 1)调优领域 内存 锁竞争 cpu 占用 io gc 2)确定目标 低延迟/高吞吐量? 选择合适的GC CMS G1 ZGC ParallelGC Zing 3)最快的 GC 答案是不发生 GC转载 2021-08-06 11:38:31 · 97 阅读 · 0 评论 -
JVM-垃圾回收器
相关概念: 并行收集:指多条垃圾收集线程并行工作,但此时用户线程仍处于等待状态。 并发收集:指用户线程与垃圾收集线程同时工作(不一定是并行的可能会交替执行)。用户程序在继续运行,而垃圾收集程序运行在另一个 CPU 上 吞吐量:即 CPU 用于运行用户代码的时间与 CPU 总消耗时间的比值(吞吐量 = 运行用户代码时间 / ( 运行用户代码时间 + 垃圾收集时间 )),也就是。例如:虚拟机共运行 100 分钟,垃圾收集器花掉 1 分钟,那么吞吐量就是 99% 。 串行 单线程 堆内存较小,适合个人电转载 2021-08-06 10:58:36 · 124 阅读 · 0 评论 -
JVM-GC_分析
// -Xms20M -Xmx20M -Xmn10M -XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc -XX:-ScavengeBeforeFullGC原创 2021-08-05 23:03:14 · 67 阅读 · 0 评论 -
JVM-垃圾回收算法学习笔记
2、垃圾回收算法 1)标记清除 定义:Mark Sweep 速度较快 会产生内存碎片 2)标记整理 Mark Compact 速度慢 没有内存碎片 3)复制 Copy 不会有内存碎片 需要占用两倍内存空间 3、分代垃圾回收 新创建的对象首先分配在 eden 区 新生代空间不足时,触发 minor gc ,eden 区 和 from 区存活的对象使用 - copy 复制到 to 中,存活的对象年龄加一,然后交换 from to minor gc 会引发 stop the world,暂停其他线程,等垃原创 2021-08-03 16:19:23 · 118 阅读 · 0 评论 -
JVM 学习笔记-如果判断对象可以回收
三、垃圾回收 1、如果判断对象可以回收 1)引用计数法 当一个对象被引用时,就当引用对象的值加一,当值为 0 时,就表示该对象不被引用,可以被垃圾收集器回收。 这个引用计数法听起来不错,但是有一个弊端,如下图所示,循环引用时,两个对象的计数都为1,导致两个对象都无法被释放。 2)可达性分析算法 JVM 中的垃圾回收器通过可达性分析来探索所有存活的对象。 扫描堆中的对象,看能否沿着 GC Root 对象为起点的引用链找到该对象,如果找不到,则表示可以回收。 可以作为 GC Root 的对象 虚拟机栈(栈帧中原创 2021-08-03 13:53:24 · 137 阅读 · 0 评论 -
JVM-StringTable调优学习笔记
/** * 演示串池大小对性能的影响 * -Xms500m -Xmx500m -XX:+PrintStringTableStatistics -XX:StringTableSize=1009 */ public class Demo1_24 { public static void main(String[] args) throws IOException { try (BufferedReader reader = new BufferedReader(new Input原创 2021-08-03 10:47:08 · 204 阅读 · 0 评论 -
JVM-演示StringTable 的位置
jdk1.6 StringTable 位置是在永久代中,1.7、 1.8 StringTable 位置是在堆中。 永久代回收效率比较低,只有FGC的时候才会被回收。因为StringTable存在大量的字符串变量和常量。应该经常被回收。 堆中的对象MGC的时候,会被回收。 增加的回收效率。 /** * 演示 StringTable 位置 * 在jdk8下设置 -Xmx10m -XX:-UseGCOverheadLimit * 在jdk6下设置 -XX:MaxPermSize=10m */ public原创 2021-08-03 10:05:14 · 396 阅读 · 0 评论 -
JVM-StringTable面试题
StringTable面试题: String s1 = "a"; String s2 = "b"; String s3 = "a" + "b"; String s4 = s1 + s2; String s5 = "ab"; String s6 = s4.intern(); // 问 System.out.println(s3 == s4); System.out.println(s3 == s5); System.out.println(s3 == s6); String x2 =原创 2021-08-02 23:51:21 · 148 阅读 · 0 评论 -
方法区-演示元空间内存溢出
JDK1.8版本 /** * 演示元空间内存溢出 java.lang.OutOfMemoryError: Metaspace * -XX:MaxMetaspaceSize=8m */ public class Demo1_8 extends ClassLoader { // 可以用来加载类的二进制字节码 public static void main(String[] args) { int j = 0; try { Demo1_8 t原创 2021-08-02 22:48:12 · 727 阅读 · 0 评论 -
JVM-堆内存诊断-jvirsualvm的使用
案例: 垃圾回收后,内存占用仍然很高。 执行GC之后,堆内存只释放了30M左右。 查看代码发现错误: /** * 演示查看对象个数 堆转储 dump */ public class Demo1_13 { public static void main(String[] args) throws InterruptedException { List<Student> students = new ArrayList<>(); fo原创 2021-08-02 22:24:21 · 125 阅读 · 0 评论 -
代码中逻辑的循环引用
/** * json 数据转换 */ public class Demo1_19 { public static void main(String[] args) throws JsonProcessingException { Dept d = new Dept(); d.setName("Market"); Emp e1 = new Emp(); e1.setName("zhang"); e1.setDept转载 2021-08-01 18:36:00 · 249 阅读 · 0 评论 -
JVM 学习笔记一(HM)
一、前言 1、什么是 JVM ? 1)定义 Java Virtual Machine ,Java 程序的运行环境(Java 二进制字节码的运行环境)。 2)好处 一次编译,处处执行 自动的内存管理,垃圾回收机制 数组下标越界检查 多态 3)比较 JVM、JRE、JDK 的关系如下图所示 2、学习 JVM 有什么用? 面试必备 中高级程序员必备 想走的长远,就需要懂原理,比如:自动装箱、自动拆箱是怎么实现的,反射是怎么实现的、foreach增强是怎么做到了、动态代理是怎么做到了、垃圾回收机制是怎么回事等转载 2021-08-01 16:34:27 · 326 阅读 · 0 评论 -
52-操作数栈的特点
操作数 栈:可以使用数组或链表来实现。 每一个独立的栈帧中除了包含局部变量表以外,还包含一个后进先出(Last-In-First-Out)的操作数栈,也可以称之为表达式栈(Expression Stack)。 操作数栈,在方法执行过程中,根据字节码指令,往栈中写入数据或提取数据,即入栈(push)/出栈(pop)。 某些字节码指令将值压入操作数栈,其余的字节码指令将操作数取出栈。使用他们后再把结果压入栈。 比如:执行复制、交换、求和等操作。 ...转载 2021-05-07 18:50:46 · 80 阅读 · 0 评论 -
51-静态变量与局部变量的对比及小结
变量的分类: 按照数据类型分: ① 基本数据类型 ② 引用数据类型 按照在类中声明的位置分: ① 成员变量:在使用前,都经历过默认初始化赋值 类变量 :linking的prepare阶段:给类变量默认赋值 ---> initial阶段:给类变量显式赋值即静态代码块赋值。 实例变量:随着对象的创建,会在堆空间中分配实例变量空间,并进行默认赋值。 ② 局部变量:在使用前,必须要进行显式赋值的!否则,编译不通过 补充说明 在栈帧中,与性能调优关系最为密切的部分就是前面提到的局部变量表。在方法执行原创 2021-05-07 18:26:46 · 158 阅读 · 0 评论