JVM详解

一、JVM的位置及体系结构

JVM作用在操作系统之上,而Java程序作用在jvm之上,其他的程序则与jvm并列

JVM详解

JVM详解

JVM详解

二、类加载器,及双亲委派机制

1.类加载器

作用:加载Class文件 -> new Student();实例的引用放在栈里,具体的对象放在堆里

JVM详解

点击查看代码

package com.Tang.jvm;

public class Car {
    public static void main(String[] args) {
        Car car1 = new Car();
        Car car2 = new Car();
        Car car3 = new Car();

        System.out.println(car1.hashCode());
        System.out.println(car2.hashCode());
        System.out.println(car3.hashCode());
        System.out.println("=======");

        Class<? extends Car> aClass = car1.getClass();
        System.out.println(car1.getClass().hashCode());
        System.out.println(car2.getClass().hashCode());
        System.out.println(car3.getClass().hashCode());
        System.out.println("=======");

        ClassLoader classLoader = aClass.getClassLoader();
        System.out.println(classLoader);//jak1.8java.lang&#x4E0B;&#x6709;&#x672C;&#x5730;&#x7684;ClassLoader&#x7C7B;&#xFF0C;&#x56E0;&#x6B64;AppClassLoader&#x5728;&#x5176;&#x4E2D;
        System.out.println(classLoader.getParent());//PlatformClassLoader &#x5B58;&#x5728;&#x4E0E;jre&#x4E2D;&#x7684;ext&#x6587;&#x4EF6;&#x4E0B;
        System.out.println(classLoader.getParent().getParent());//Bootstrap&#x4E2D;(rt.jar)&#x4E2D;&#x6CA1;&#x6709;&#x627E;&#x5230;Car&#x7C7B;&#x6240;&#x4EE5;&#x8FD4;&#x56DE;&#x7684;&#x662F;null

    }
}

运行结果图

JVM详解

2.双亲委派机制

原理:在一个类运行之前会在当前加载器类型往上找(bootStrap > PlatformClassLoader >AppClassLoader),然后运行程序之后如果在最顶层没有找到该类,则又会逐层往下找,直到AppClassLoader 点击查看代码

package java.lang;

public class String {
    //&#x867D;&#x7136;&#x5728;AppClassLoader&#x4E2D;&#x4E5F;&#x5C31;&#x662F;&#x672C;&#x4EE3;&#x7801;&#x4E2D;&#x6709;String&#x7C7B;&#xFF0C;&#x4F46;&#x662F;&#x5728;&#x7C7B;&#x8FD0;&#x884C;&#x4E4B;&#x524D;&#x8FD8;&#x4F1A;&#x5F80;&#x4E0A;&#x627E;&#x8BE5;&#x7C7B;&#x662F;&#x5426;&#x5B58;&#x5728;&#xFF0C;&#x6700;&#x540E;&#x5728;bootStrap&#x4E2D;&#x4E5F;&#x627E;&#x5230;&#x4E86;&#x5B98;&#x65B9;&#x7684;String&#xFF0C;&#x6700;&#x540E;&#x5728;&#x8FD9;&#x91CC;&#x8FD0;&#x884C;
    public String toString() {
        return "hello";
    }

    public static void main(String[] args) {
        String s = new String();
        s.toString();
    }
}

运行结果图

JVM详解

点击查看代码

package com.Tang.jvm;

public class Student {
    @Override
    public String toString() {
        return "hello";
    }

    public static void main(String[] args) {
        Student student = new Student();//&#x5728;new Student &#x4E4B;&#x540E;&#x4F1A;&#x73B0;&#x5728;bootstrap&#x4E2D;&#x627E;&#xFF0C;&#x53D1;&#x73B0;&#x6CA1;&#x6709;&#x8FD9;&#x4E2A;&#x7C7B;&#xFF0C;&#x7136;&#x540E;&#x53BB;ext&#x4E2D;&#x53BB;&#x627E;&#xFF0C;&#x53D1;&#x73B0;&#x4E5F;&#x6CA1;&#x6709;&#xFF0C;&#x6700;&#x540E;&#x53EA;&#x80FD;&#x5728;&#x5F53;&#x524D;&#x5E94;&#x7528;&#x4E0B;&#x8FD0;&#x884C;
        System.out.println(student.toString());
    }
}

JVM详解

三、Native、方法区

1.Native

凡是带native关键字的,说明Java的作用范围达不到了,==回去调用底层c语言的库!==会进入本地方法栈,调用本地接口 JNI。 JNI作用:扩展Java的使用,融合不同的编程语言为Java所用!最初:C、C++。java诞生的时候c、C++横行,想要立足,必须要有调用C、C++的程序,于是它在内存区域中专门开辟了一块标记区域:Native Method Stack ,登记native方法,在最终执行的时候,加载本地方法库中的方法通过JNI

JVM详解

四、堆

1.堆的基本概念

Heap,一个JVM只有一个堆内存,堆内存的大小是可以调节的。 类加载器读取了类之后,一般会把类,方法,常量,变量,放到堆中。类,方法,常量,变量,保存我们所有引用类型的真实对象。 垃圾的产生:比如Test test = new Test();存放在栈中的test若一次调用之后很久不会用到,那么该引用的值比如对应的年龄和姓名的值都存放在堆中,此时这些信息都会在堆中产生垃圾 堆内存中还要细分为三个区域: (1)新生区(伊甸园区) (2)养老区 (3)永久区

JVM详解
GC垃圾回收,主要是在伊甸园区和养老区,如果内存满了,就会报堆内存不够!如下图:

JVM详解
在jdk8以后,永久存储区改了个名字叫元空间

2.新生区

类:诞生和成长的地方,甚至死亡 所有对象都是在这里new出来的,若此地方对象数量已经达到该区容量的最大值,则会触发一次轻GC,也就是垃圾回收,在这过程中可能会有一些引用还会继续使用,所以会存活下来,活下来的进程就会进入幸存者区(属于新生区下的一个区),若幸存区也满了又会进入养老区,若养老区还新生区都满了就会触发一次重GC

2.永久区

这个区域常驻内存的,用来存放JDK自身携带的Class对象,Interface元数据,存储的是Java运行时的一些环境或类信息,这个区域不存在垃圾回收!关闭VM虚拟就会释放这个区域的内存。 在永久区蹦的情况:一个启动类加载了大量的第三方jar包,Tomcat部署了太多的应用,大量动态生成的反射类,如果不断的被加载,直到内存满,就会出现OOM异常 jdk1.6之前:永久代,车行两次是在方法区 jdk1.7:永久代,但是慢慢的退化了,去永久代,常量池在堆中 jdk1.8之后:无永久代,常量池在元空间

JVM详解

点击查看代码

public static void main(String[] args) {

        //&#x8FD4;&#x56DE;&#x865A;&#x62DF;&#x673A;&#x8BD5;&#x56FE;&#x4F7F;&#x7528;&#x7684;&#x6700;&#x5927;&#x5185;&#x5B58;
        long max = Runtime.getRuntime().maxMemory();
        //&#x8FD4;&#x56DE;jvm&#x7684;&#x521D;&#x59CB;&#x5316;&#x603B;&#x5185;&#x5B58;
        long total = Runtime.getRuntime().totalMemory();
        System.out.println("max="+max+"&#x5B57;&#x8282;\t"+(max/(double)1024/1024)+"MB");
        System.out.println("total="+total+"&#x5B57;&#x8282;\t"+(total/(double)1024/1024)+"MB");
        //&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF1A;&#x5206;&#x914D;&#x7684;&#x603B;&#x5185;&#x5B58;(&#x6700;&#x5927;&#x5185;&#x5B58;)&#x662F;&#x7535;&#x8111;&#x5185;&#x5B58;&#x7684;1/4,&#x800C;&#x521D;&#x59CB;&#x5316;&#x7684;&#x5185;&#x5B58;&#x4E3A;1/64
    }

运行结果图

JVM详解
当遇到OOM(也就是内存溢出)时,解决方法如下:
(1)尝试扩大内存,看是否还会继续报错
(2)若继续报错,分析内存,看一下哪个地方出现了问题(可能是死循环造成空间的无限占用)

Original: https://www.cnblogs.com/twq46/p/16471554.html
Author: 剑断青丝ii
Title: JVM详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/620608/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 史上最全Mysql规范

    1 整体规约 1)【强制】数据库所有对象必须要有注释,包括:表、字段、索引等,并且要保持最新; 1)【强制】默认使用utf8字符集,无乱码风险,除一些需要存储特殊符号的字段,可以采…

    数据库 2023年5月24日
    081
  • 记录下在阿里云linux上安装与配置Mysql

    环境:阿里云ECS服务器,系统为centos7.2 用户:root 参考博客: https://blog.csdn.net/kunzai6/article/details/8193…

    数据库 2023年6月16日
    0115
  • 重返MySQL之MySQL基础

    重返MySQL之MySQL基础 本章详细介绍了,什么是数据库,常见的关系型数据库有哪些,什么是MySQL,及MySQL中DDL操作表,DML操作表记录。 1.0 数据库概述 1.1…

    数据库 2023年6月9日
    0141
  • Jenkins2.350配置gitee

    一、下载JenKins 以War包举例演示 JenKins下载地址JenKins中文文档 二、启动Jenkins 需要配置好jdk,不做多阐述。 java -jar jenkins…

    数据库 2023年6月6日
    091
  • Git命令列表–git-config

    git config 查看、编辑Git的配置文件 配置文件的范围和语法 $ git config usage: it config [] Config file location …

    数据库 2023年6月11日
    084
  • Mysql 一主一从

    1. 主从原理 1.1 主从介绍 所谓 mysql 主从就是建立两个完全一样的数据库,其中一个为主要使用的数据库,另一个为次要的数据库,一般在企业中,存放比较重要的数据的数据库服务…

    数据库 2023年6月14日
    078
  • tomcat加载启动过程

    流程图 posted @2022-08-19 17:43 默念x 阅读(9 ) 评论() 编辑 Original: https://www.cnblogs.com/monianxd…

    数据库 2023年6月16日
    089
  • LeetCode 27. 移除元素

    给你一个数组nums和一个值val,你需要 原地 移除所有数值等于val的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用O(1)额外空间并 原地 修改输入数…

    数据库 2023年6月11日
    081
  • [javaweb]监听器统计网页在线人数

    监听器 1.配置监听器 package com.javaweb.controller; import javax.servlet.ServletContext; import ja…

    数据库 2023年6月16日
    097
  • 加班整理出来的MySQL数据库基本操作送给大家,非常详细!

    哈喽兄弟们,中秋闲着没事,整理了一些数据库的基本操作,分享给大家,希望对大家有所帮助~ ; 一、SQL语句 (mysql 数据库中的语言) show databases;查看数据库…

    数据库 2023年6月14日
    0104
  • 重构

    参数过长 影响: 方法不易被理解、使用,方法签名容易不稳定,不易维护 解决方法:反复使用提炼方法+内联方法,消除多余参数 ​ 尽量把方法移进相关的类中 ​ 如实体类中的get方法在…

    数据库 2023年6月16日
    0211
  • MySQL的FIND_IN_SET函数

    语法:FIND_IN_SET(str,strlist) https://www.cnblogs.com/xiaoxi/p/5889486.html Original: https:…

    数据库 2023年6月16日
    056
  • java读写锁

    工作遇到了金钱计算,需要用到读写锁保证数据安全。记录一下。 单纯读没有限制,读写、写写的时候会有安全问题。 _hashMap_存在并发线程安全问题,而 _hashtable_线程安…

    数据库 2023年6月16日
    081
  • Pod控制器类型

    Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类: 自主式pod:kubernetes直接创建出来的Pod,这种pod删除…

    数据库 2023年6月14日
    078
  • 2022CNAS能力验证-存在性

    背景 警方接到报案称有人利用无人机投放非法宣传材料,根据线索找到一处住宅,搜查发现无人机、智能电视机、小型网络设备等电子设备,提取了电子设备数据并对网络设备进行了抓包分析。现委托你…

    数据库 2023年6月11日
    074
  • 精心整理16条MySQL使用规范,减少80%问题,推荐分享给团队

    上篇文章介绍了如何创建合适的MySQL索引,今天再一块学一下如何更规范、更合理的使用MySQL? 合理规范的使用MySQL,可以大大减少开发工作量和线上问题,并提升SQL查询性能。…

    数据库 2023年5月24日
    091
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球