
JVM
尚硅谷JVM学习笔记
Eistert
文章大部分都是前人总结的知识点,我只是一个搬运工……
展开
-
常用JVM参数
常用JVM参数https://www.cnblogs.com/xuwenjin/p/13092857.html十个最常用的JVM 配置参数https://page.om.qq.com/page/OOjGMeW8-zLbPbsOwac6Du-A0java启动参数共分为三类https://www.cnblogs.com/jiataoq/p/9512498.html-XX:+DisableExplicitGC弊端https://blog.csdn.net/bingxuesiyang/article/原创 2021-12-14 10:25:35 · 107 阅读 · 0 评论 -
JVM垃圾收集器
ParNew与CMS垃圾回收器https://www.cnblogs.com/nangonghui/p/14108570.html原创 2021-12-14 10:20:40 · 212 阅读 · 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 · 949 阅读 · 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 · 241 阅读 · 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 · 310 阅读 · 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 · 182 阅读 · 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 · 206 阅读 · 0 评论 -
JVM-垃圾回收调优
预备知识- 掌握 GC 相关的 VM 参数,会基本的空间调整- 掌握相关工具- 明白一点:调优跟应用、环境有关,没有放之四海而皆准的法则查看虚拟机参数命令 D:\JavaJDK1.8\bin\java -XX:+PrintFlagsFinal -version | findstr "GC"1)调优领域内存锁竞争cpu 占用iogc2)确定目标低延迟/高吞吐量? 选择合适的GCCMS G1 ZGCParallelGCZing3)最快的 GC答案是不发生 GC转载 2021-08-06 11:38:31 · 150 阅读 · 0 评论 -
JVM-垃圾回收器
相关概念:并行收集:指多条垃圾收集线程并行工作,但此时用户线程仍处于等待状态。并发收集:指用户线程与垃圾收集线程同时工作(不一定是并行的可能会交替执行)。用户程序在继续运行,而垃圾收集程序运行在另一个 CPU 上吞吐量:即 CPU 用于运行用户代码的时间与 CPU 总消耗时间的比值(吞吐量 = 运行用户代码时间 / ( 运行用户代码时间 + 垃圾收集时间 )),也就是。例如:虚拟机共运行 100 分钟,垃圾收集器花掉 1 分钟,那么吞吐量就是 99% 。串行 单线程 堆内存较小,适合个人电转载 2021-08-06 10:58:36 · 160 阅读 · 0 评论 -
JVM-GC_分析
// -Xms20M -Xmx20M -Xmn10M -XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc -XX:-ScavengeBeforeFullGC原创 2021-08-05 23:03:14 · 87 阅读 · 0 评论 -
JVM-垃圾回收算法学习笔记
2、垃圾回收算法1)标记清除定义:Mark Sweep速度较快会产生内存碎片2)标记整理Mark Compact速度慢没有内存碎片3)复制Copy不会有内存碎片需要占用两倍内存空间3、分代垃圾回收新创建的对象首先分配在 eden 区新生代空间不足时,触发 minor gc ,eden 区 和 from 区存活的对象使用 - copy 复制到 to 中,存活的对象年龄加一,然后交换 from tominor gc 会引发 stop the world,暂停其他线程,等垃原创 2021-08-03 16:19:23 · 137 阅读 · 0 评论 -
JVM 学习笔记-如果判断对象可以回收
三、垃圾回收1、如果判断对象可以回收1)引用计数法当一个对象被引用时,就当引用对象的值加一,当值为 0 时,就表示该对象不被引用,可以被垃圾收集器回收。这个引用计数法听起来不错,但是有一个弊端,如下图所示,循环引用时,两个对象的计数都为1,导致两个对象都无法被释放。2)可达性分析算法JVM 中的垃圾回收器通过可达性分析来探索所有存活的对象。扫描堆中的对象,看能否沿着 GC Root 对象为起点的引用链找到该对象,如果找不到,则表示可以回收。可以作为 GC Root 的对象虚拟机栈(栈帧中原创 2021-08-03 13:53:24 · 172 阅读 · 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 · 264 阅读 · 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 · 479 阅读 · 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 · 184 阅读 · 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 · 805 阅读 · 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 · 165 阅读 · 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 · 317 阅读 · 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 · 397 阅读 · 0 评论 -
52-操作数栈的特点
操作数栈:可以使用数组或链表来实现。每一个独立的栈帧中除了包含局部变量表以外,还包含一个后进先出(Last-In-First-Out)的操作数栈,也可以称之为表达式栈(Expression Stack)。操作数栈,在方法执行过程中,根据字节码指令,往栈中写入数据或提取数据,即入栈(push)/出栈(pop)。某些字节码指令将值压入操作数栈,其余的字节码指令将操作数取出栈。使用他们后再把结果压入栈。比如:执行复制、交换、求和等操作。...转载 2021-05-07 18:50:46 · 109 阅读 · 0 评论 -
51-静态变量与局部变量的对比及小结
变量的分类:按照数据类型分:① 基本数据类型 ② 引用数据类型按照在类中声明的位置分:① 成员变量:在使用前,都经历过默认初始化赋值 类变量 :linking的prepare阶段:给类变量默认赋值 ---> initial阶段:给类变量显式赋值即静态代码块赋值。 实例变量:随着对象的创建,会在堆空间中分配实例变量空间,并进行默认赋值。② 局部变量:在使用前,必须要进行显式赋值的!否则,编译不通过补充说明在栈帧中,与性能调优关系最为密切的部分就是前面提到的局部变量表。在方法执行原创 2021-05-07 18:26:46 · 198 阅读 · 0 评论