JVM相关学习

news2024/11/18 7:33:11

一、了解JVM

  1. JVM就是Java虚拟机。
  2. 好处:
  • 一次编写,到处运行;
  • 自动内存管理,垃圾回收功能;
  • 数组下标越界越界检查;
  • 多态。

二、学习JVM

1.程序计数器(寄存器): 

  • 作用:记住下一条jvm指令的执行地址;
  • 特点:

          (1)线程私有;

          (2)不会存在内存溢出(唯一一个不会内存溢出的区域);

2.栈和栈帧:

  • 栈:线程运行时需要的内存空间;
  • 栈帧:每个方法运行时需要的内存(包括参数,局部变量,返回地址等);
  • 一个栈由多个栈帧组成,对应着每次方法调用时所占用的内存,遵循先进后出的方法;
  • 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法。
  • 注意:

                (1)垃圾回收不涉及栈内存,涉及堆内存;

                (2)栈内存的分配并不是越大越好;

                (3)方法内的局部变量是否线程安全?

                                a.如果方法内局部变量没有逃离方法的作用范围,它是线程安全的;

                                b.如果是局部变量引用了对象,并逃离方法的作用范围,需要考虑线程安全。

2.2栈内存溢出:

  •  栈帧过多导致栈内存溢出(例如方法的递归调用,没有设置正确的终止条件);
  • 栈帧多大导致栈内存溢出;

2.3线程运行诊断:

  • CPU占用过高:
  1. 定位:用top定位哪个进程对CPU占用过高;
  2. ps H -eo pid, tid, &cup | grep 进程id(用ps命令进一步定位是哪个线程引起的cpu占用过高);
  3. jstack 进程id,可以根据线程id找到有问题的线程,进一步定位到问题代码的源码行号;
  • 程序运行很长时间没有结果:
  1. 可能原因是线程死锁,可以用jstack 进程id定位到出问题的线程行数和原因,进行修改。

3.本地方法栈:

版权声明:本文为CSDN博主「情迷IntelliJ IDEA」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/phg739436146/article/details/108412116

4.堆:

  • 通过new关键字,创建对象都会使用堆内存;
  • 特点:
  1. 它是线程共享的,堆中对象都需要考虑线程安全的问题;
  2. 它有垃圾回收机制;

4.1 堆内存溢出:

  • java.lang.OutOfMemoryError:Java heap space
  • 在判断是否存在堆内存溢出的问题的时候,可以将堆内存相对设置的小一点。

4.2 堆内存诊断:

5.方法区:

  • 定义:

    版权声明:本文为CSDN博主「敏叔V587」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/zhuxuemin1991/article/details/103900190

 5.2:方法区内存溢出:

  • 1.8之前会导致永久代内存溢出:java.lang.OutOfMemoryError:PermGen space;
  • 1.8之后会导致元空间内存溢出:java.lang.OutOfMemoryError:Metaspace;

6.运行时常量池:

  • 二进制字节码:类的基本信息,常量池,类方法定义(包含虚拟机指令);
  • 常量池:就是一张常量表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量(字符串,基本的整数,布尔类型)等信息;
  • 运行时常量池:常量池是*.class文件中的,当该类被加载,它的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实地址;

6.2 StringTable(串池):

  • public class StringTable {
        public static void main(String[] args) {
            String s1 = "a";
            String s2 = "b";
            String s3 = "a" + "b";//ab
            String s4 = s1 + s2;//new String("ab")
            String s5 = "ab";
            String s6 = s4.intern();
    
    //问
            System.out.println(s3 == s4);//false
            System.out.println(s3 == s5);//true
            System.out.println(s3 == s6);//true
    
            String x2 = new String("c") + new String("d");//new String("cd")
            String x1 = "cd";//"cd"
            x2.intern();
    
    //问,如果调换了 x1,x2的位置呢?如果是jdk1.6呢?
            System.out.println(x1 == x2);//false
    
        }
    }
  • 特性:
  1. 常量池中的字符串仅是符号,第一次用到时才会变为对象;
  2. 利用串池的机制,来避免重复创建字符串对象。创建对象时是延迟(懒惰)模式;
  3. 字符串变量拼接的原理是StringBuilder(1.8);
  4. 字符串常量拼接的原理是编译期优化;
  5. 可以使用intern()方法,主动将串池中还没有的字符串对象放入串池。

                a.1.8 将这个字符串对象尝试放入串池,如果有则不放入,如果没有则放入,并且会把串池中的对象返回;

                b.1.6 将这个字符串对象尝试放入串池,如果有则不放入,如果没有会把此对象复制一份,放入串池,并且会把串池中的对象返回;

  • StringTable位置:
  1. 1.6在永久代中,1.8在堆内存中;
  • StringTable垃圾回收:
  1. 在内存紧张时才会触发垃圾回收;
  • StringTable性能调优:
  1. 底层是用hash表存储数据,所以分配的内存越大,桶越多,存储的数值越分散,链表短,查找和加入数据效率更高。
  2. 考虑将字符串对象是否入池:如果所提供的字符串中存在大量的重复字符串对象,可以考虑将这些重复的字符串对象使用intern()方法入池,以此来节省内存的占用
  • 直接内存(不属于JVM内存,属于系统内存):
  1. 定义:

        a.常见于NIO操作,用于数据缓冲区;

        b.分配回收成本较高,但读写性能高;

        c.不受JVM内存回收管理(调用一个非常底层的unsafe类的freeMemory()来进行内存释放);

     2.分配和回收原理:

         a.使用了Unsafe对象完成直接内存的分配回收,并且回收需要主动调用freeMemory方法;

         b.ByteBuffer的实现类内部,使用了Cleaner(虚引用)来监测ByteBuffer对象,一旦

            ByteBuffer对象被垃圾回收,那么就会由ReferenceHandler线程通过Cleaner的clean方法调

            用freeMemory来释放直接内存;

7.垃圾回收

  • 如何判断对象可以回收:
  1. 引用计数法(java未采用):存在两个对象相互引用,但并没有第三个对象引用这两个对象的情况。
  2. 可达性分析算法:

        a.java虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象;

        b.扫描堆中的对象,看是否能够沿着GC Root对象为起点的引用链找到该对象,找到,保留;

           找不到,表示可以回收;

        c.哪些对象可以作为GC Root?可以用Memory Analyzer(MAT)工具进行可视化查看。

     3.五种引用:

 //实现表示强引用

        a.强引用: 通常我们使用 new 操作符创建一个对象时所返回的引用即为强引用,只有所有GC Root对象都不通过强引用引用该对象,该对象才能被垃圾回收。

        b.软引用: 若一个对象只能通过软引用到达,且没有GC Root指向,那么这个对象在内存不足时会被回收,可用于图片缓存中,内存不足时系统会自动回收不再使用的Bitmap

        c.弱引用: 若一个对象只能通过弱引用到达,且没有GC Root指向,那么它就会被回收(即使内存充足),同样可用于图片缓存中,这时候只要 Bitmap 不再使用就会被回

//软弱引用在没有引用对象的时候,可以配合被放入引用队列中,从而释放掉引用所占用的内存空间

        d.虚引用:必须配合引用队列使用,主要配合ByteBuffer使用,例如,在其本身所指向的ByteBuffer被回收之后,直接内存并不会被回收,这时需要把虚引用的直接内存地址放入引用队列中,从而调用Unsafe.freeMemory()方法回收掉直接内存的空间。 而且虚引用比弱引用还弱的一点是,即使没有垃圾回收,也无法访问虚引用对象。虚引用必须配合引用队列一起使用。
        e.终结器引用: 终结器引用和虚引用的方式很类似,它用以实现对象的finalize()方法。 当一个对象重写了finalize方法,在第一次GC时,对应终结器引用进入引用队列队。由一个优先级很低的Finalizer线程通过终结器引用找到被引用对象并调用它的finalize()方法,第二次GC时才能回收被引用对象。
————————————————
版权声明:本文为CSDN博主「zuiziyoudexiao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zuiziyoudexiao/article/details/89093896

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/72722.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

成为大数据工程师需要具备什么能力?发展前景好么

数据工程工作存在于各个行业,在银行业、医疗保健业、大型科技企业、初创企业和其他行业找到工作机会。许多职位描述要求数据工程师、拥有数学或工程学位,但如果有合适的经验学位往往没那么重要。 **那么如何获得数据开发相关岗位的工作经验?…

Three.js一学就会系列:03 炫酷3D划线

系列文章目录 Three.js一学就会系列:01 第一个3D网站 Three.js一学就会系列:02 画线 文章目录系列文章目录前言一、省略部分二、使用方法创建一个dom元素创建初始化方法线条动起来效果总结前言 最近开始入坑前端3D建站,跟大家一起慢慢深入t…

磨金石教育摄影技能干货分享|曾毅——尘封的故土,难忘的乡愁

乡愁是远离家乡的游子们,内心对故土美好的执念。我曾经在新疆边境县待过一年,异域的风情的新奇,充满了我的眼睛。我一度觉得这里真不错,在这待一辈子也挺好。 后来有一次去了当地一个汉族村,刚进村子就恍然有一种回家…

C# SuperSocket 手把手教你入门 傻瓜教程---7(自定义SuperSocket内置的命令行协议)

C# SuperSocket 手把手教你入门 傻瓜教程系列教程 C# SuperSocket 手把手教你入门 傻瓜教程---1(服务器单向接收客户端发送数据) C# SuperSocket 手把手教你入门 傻瓜教程---2(服务器和客户端双向通信) C# SuperSocket 手把手教…

黑马程序员14套经典IT教程+面试宝典

很多同学对互联网比较感兴趣 ,奈何苦恼不知道如何入门。今天免费给大家分享一波,黑马程序员14套经典IT教程程序员面试宝典!涉及Java、前端、Python、大数据、软件测试、UI设计、新媒体短视频等。从厌学到学嗨,你只差一套黑马教程&…

ADS1120 备忘

ADS1120 是一个小型、低功耗、16-bit、ΔΣ 模数转换器(ADC): 内置 PGA(1~128)内置参考基准(2.048V)内置温度传感器内置 2 个已配对的可编程电流源SPI 通讯接口,使用 模式 1 &#…

BHAR事件研究方法stata代码和案例数据

BHAR事件研究方法stata代码和案例数据 1、方法说明: BHAR (Buy and Hold Abnormal Return),即购入 -持有异常收益法。 无论是短期事件研究,还是长期事件研究,都包含以下六大步骤,即定义事件以及事件研究窗口、选择研究样本、选择望收益模型…

web安全之Webshell管理工具

目录 漏洞原理 工具 中国蚁剑(antsword) weevely(kali) godzilla Behinder 漏洞原理 上传PHP一句话木马到服务器 <?phpheader("Content-type:text/html;charsetgb1232");echo "<pre>";eval($_POST[coleak]); ?> 找到上传路径后通过…

PTE考试写作教程

PTE考试写作教程 由经验丰富的母语教师完成准备教程&#xff0c;以在 PTE 考试的写作部分取得成功 课程英文名&#xff1a;PTE Academic Exam Preparation Writing Mastery (Achieve 79) 此视频教程共10.0小时&#xff0c;中英双语字幕&#xff0c;画质清晰无水印&#xff0…

《MySQL实战45讲》——学习笔记21 “加锁规则、加锁案例、死锁示例“

紧接着上篇介绍可重复读隔离级别下的幻读问题及解决幻读引入的间隙锁和next-key lock的概念&#xff0c;本篇介绍了更新记录时加锁的规则&#xff0c;并用几个案例来说明规则&#xff1b; 通过学习本文&#xff0c;可以帮助通过加锁规则去判断语句的加锁范围&#xff1b;在业务…

ABAP学习笔记之——第九章:ABAP对象

一、类 类(Class)可看做是对象的骨骼 (Template) 或者对象的类型。另外&#xff0c;类是抽象化对象的明细表。即可以说是制作对象的设计书。对象属性由描述对象的状态和行为的构成要素Component)决定。 比较结构化程序和面向对象程序 例&#xff1a; *比较结构化程序 和 面向…

Apache+PHP+MariaDB+MQTT重启指令

启动PHP服务 1.启动 systemctl start php-fpm.service Apache服务 1. 启动、终止、重启 systemctl start httpd.service #启动 systemctl stop httpd.service #停止 systemctl restart httpd.service #重启 2. 设置开机启动/关闭 systemctl enable httpd.service #开机…

Spring【日志文件的打印与输出】

Spring【日志文件的打印与输出】&#x1f34e;一.日志文件&#x1f352;1.1 日志的作用&#x1f352;1.2 怎样查看到日志信息&#x1f34e;二. 打印日志&#x1f352;2.1 自定义打印日志&#x1f352;2.2 ⽇志格式说明&#x1f34e;三.日志级别&#x1f352;3.1 日志级别的作用…

SpringMVC的收参方式?

第一种收取参数方式&#xff1a;数据类型收取参数 第二种收取参数的方式&#xff1a;实体类收取参数&#xff08;传参&#xff09; 第三种收取参数的方式&#xff1a;ajax 收取数组/集合 第四种收取参数的方式&#xff1a;ajax 接收json数据 第五种收取参数的方式&#xff1a;…

全网最牛最全Postman接口测试(五): postman设置接口关联,postman实现参数化

Postman(9): postman设置接口关联 postman设置接口关联 在实际的接口测试中&#xff0c;后一个接口经常需要用到前一个接口返回的结果&#xff0c; 从而让后一个接口能正常执行&#xff0c;这个过程的实现称为关联。 在postman中实现关联操作的步骤如下&#xff1a; 1、利用…

怎样避免软件测试中的漏测

什么是测试漏测&#xff1f; 测试漏测是指软件产品在测试结束后出现了在测试过程中没有被发现的bug。我们知道&#xff0c;漏测是每一个软件测试者最头疼的事&#xff0c;一旦出现漏测&#xff0c;首先给客户带来了非常不好的影响&#xff0c;特别是严重的功能性bug被漏测&…

程序员如何创造睡后收入呢?

程序员作为一个互联网行业的职业&#xff0c;在互联网当道的现在是非常吃香的。 作为程序员&#xff0c;一个基础工资的收入就已经是一笔不菲的收益了。 然而&#xff0c;钱总是不够花的&#xff0c;毕竟捂住口袋有点小难。 这时候&#xff0c;我们只好把视线转向另一边&…

算法面试题——删除链表后第N个节点

给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[] 示例 3&#xff…

C语言百日刷题第十三天

前言 今天是刷题第13天&#xff0c;放弃不难&#xff0c;但坚持一定很酷~ 临近期末&#xff0c;再刷一套模拟题 C语言百日刷题第十三天前言选择题判断题编程题选择题 1.若由定义int*p1,*p2,m5,n;以下赋值语句都正确的选项是&#xff08;&#xff09; A、p1&m;p2&n…

signintech/gopdf功能介绍与代码示例

signintech/gopdf功能介绍与代码示例 PDF相关常识以及signintech/gopdf功能概览 代码示例&#xff1a; 参考&#xff1a;https://gitee.com/ixuer/gopdf_example 代码示例包括&#xff1a; 设置页面配置&#xff0c;如宽度和高度。test/font: 添加ttf字体&#xff0c;并设置…