JVM基础论述

JVM基础知识 JVM基础知识。 阅读详情

JVM基础概论

程序在JVM中执行的整个过程主要会经过下图的各个区域。

当一个字节码文件进入JVM被类加载器加载之后就会进行重新分配去到不同的各个功能区之中。

在这里插入图片描述

JVM内存结构

被加载的类 —> 方法区

实例对象(new出来的东西都是实例对象) —> 堆

实例对象调用方法时 —> 虚拟机栈,程序计数器,本地方法栈

JVM执行引擎

类在执行的时候的每行代码 —> 解释器

频繁调用的代码 —> 编译器,系统会进行优化和识别为频繁操作的代码,然后执行

堆(实例对象)中不再被引用的对象进行回收 —> GC垃圾回收机制

调用底层操作系统的功能,与其打交道的地方 —> 本地方法接口

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

作用:在执行指令的同时,将下一条的执行号码存入程序计数器,每次执行语句的时候,再不断重复这个过程。如果没有这个计数器,将不会知道下面应该执行什么。cpu中的程序计数器是所有组件中读取速度最快的,这个是属于系统的,但是java在设计的时候就将程序计数器当做了java的寄存器

流程:每条语句都会通过jvm指令进行编译—>被解释器变为二进制字节码 ---->再变为机器码 ---->再由cpu运行

在这里插入图片描述
程序计数器的特点

  1. 线程私有

    由于java是支持多线程运行的,所以每个线程都有一个程序计数器

    在cpu快速不断切换时,各自存储自己的执行号码

  2. 不会存在内存溢出

    在java虚拟机中唯一一个不会存在内存溢出的区,所以每个厂商设计时就不会设计内存溢出的问题

2.栈内存

每个用户访问一次就是一个线程,每个线程运行时所需要的内存,叫做栈,分为虚拟机栈和本地方发栈。

问:栈的数据结果是什么,为什么?

​ 答:栈数据结构的特点 先进后出 。因为在程序执行的时候,都是一个方法(最开始是main方法)调用另一个方法来执行的。所以当方法被执行的时候就会压栈运行,但是当最后面的方法执行结束的时候就会进行弹栈,然后再执行倒数第二个方法,层层弹栈,按照此逻辑,所以最先进的反而是最后出,才会形成先进后出的数据结构。

本地方法栈

本地方法所使用的内存叫做本地方法栈。

native关键字修饰的方法叫做本地方法(用C语言编写的方法),是直接与操作系统底层进行交互。使java代码可以通过本地方法栈来间接的调用操作系统底层的功能。同样对这些方法进行压栈或弹栈。

虚拟机栈

问:虚拟机栈和本地方法栈的区别?

	答:虚拟机栈又叫java栈或者栈,均属于顶层意义的栈,而本地方发栈和虚拟机栈功能是一样的,都是指在执行方法时需要使用内存,对方法进行压栈或者弹栈。

​ 虚拟机栈(java栈)是用户线程所使用的方法进行压栈或者弹栈时的概念

​ 本地方法栈,是JVM用C语言编写的那些方法所使用的栈,同样对这些方法进行压栈或弹栈的概念

​ 每个虚拟机栈(frame)由多个栈帧组成。一个栈帧是由方法的参数,局部变量,返回值组成,每个方法运行时需要的内存就是一 个栈帧,每一个栈帧就表示一次方法的调用,被执行时压栈运行,自动释放。可以简单理解为一个方法。

​ 活动栈帧,意思是对应正在运行执行的那个方法,在方法栈最顶端的栈帧就是活动栈帧

栈内存溢出
  1. 栈帧过多导致内存溢出(递归)

  2. 栈帧过大(不太容易出现)

    异常名:java.lang.StackOverFlowError

    可以进行栈内存的大小设置,默认是1M

在这里插入图片描述

问题:

  1. 垃圾回收机制是否会对栈内存进行回收?

    每次生成的栈帧在被执行时,都压栈,每当结束时就会自动的弹栈,然后被释放掉,所以垃圾回收机制不会对栈进行回收也没有必须

  2. 占内存是分配越大越好嘛?

    栈内存划分越大,线程数就会变得越小。

    占内存划分大,只是可以进行更多次的递归划分调用。不会增强运行效率,且线程数量随之会变小,所以采用默认大小即可。

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

    看一个线程是不是安全的,主要是看这个线程对一个变量的操作是共享的还是私有的

    ​ 比如 两个线程同时有局部基本类型变量a循环5000次的 a++, 是不会产生线程安全问题的,因为普通变量在底层是线程安全的,并且在方法区中多个线程各自有各自的栈,自己独立操作,即使是传递或者被返回那么都是安全的。

    但是如果这个a变量是一个Static的a 那么两个线程会同时对这个变量进行a++ 然后在重新写回公共区,此时就会出现不安全的情况

    ​ 再比如 如果这个两个线程同时有局部引用数据类型变量StringBuilder循环5000次的 +1, 是不会产生线程安全问题的,因为在方法区中多个线程各自有各自的栈,自己独立操作,但是如果当作返回值或者参数值进行传递到其他方法体当中,则在途中就会变得不安全

    结论:如果变量只是在方法内部进行使用,那么该局部变量是安全的。如果该局部变量逃离了方法作用域,基本数据类型的变量仍然安全,引用数据类型变得不安全。

    方法局部变量在方法内使用,一定是安全的。逃离出作用域,基本类型是否还安全有待进一步核实。

3.堆内存

堆和方法区,是线程共享的区,堆中的对象都需要考虑线程安全问题

new 出来的 东西进堆内存

有垃圾回收机制

默认4G,可进行修改

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QLeFH5MT-1592983596442)(D:\Java总结文档\图解\JVM\堆内存修改.png)]

堆内存溢出

什么情况下会出现堆内存溢出?

当垃圾回收机制没有被激活的时候,而新new的对象又不断的出现就会出现堆内存溢出。而垃圾回收机制何时进行回收的先决条件是该对象是否还在被使用,当前面的对象一直在被使用,后面又一直在new的时候就会出现堆内存溢出。

异常名:java.lang.OutOfMemoryError:java heap space

4.方法区

​ 定义:在虚拟机启动时被创建。所有虚拟机线程都可以进行访问的区称之为方法区,仅仅是概念上的单独的一个区,逻辑上是堆的一部分,由不同的JVM厂商(如:oracle)进行实现。

​ 作用:存储与类相关的信息,如:成员方法,构造器,成员变量,运行时常量池等

若方法区内存不足,也会抛异常名:java.lang.OutOfMemoryError的异常

方法区在1.6和1.8版本的区别

JVM1.6版本,单独有方法区地方存储,里面是一个永久代(PermGen),存储着类相关信息。

JVM1.8版本,将该区域去除放到了本地内存中,不再与JVM相关且名字更改为元空间(MetaSpace)。默认情况下运行时使用的是系统内存,且无上限

补充:类加载器classloader的作用是可以加载类的二进制字节码

在这里插入图片描述

运行时常量池
常量池

​ 类字节码中的一张常量表,存放着用于解析代码的符号集合,虚拟机指令通过这张表来对应找到要执行的类的各项信息。如:类名,方法名,参数,字面量信息(用户输入的信息,整数,字符串等)等等等等。每个类都有一个常量池,里面存储的是该类的符号集合(#number…)。

运行时常量池

​ 运行时常量池的意思就是,当某类被加载的时候,会将该类的常量池加载入内存,而放在内存中的位置就叫做运行时常量池,并且会把该类的符号集合(#number…)变为真实的内存地址用来进行查找。

StringTable(串池)

​ 运行时常量池中有一个区域叫做StringTable又叫串池,数据结构是哈希表不能扩容,主要用于加载字符串对象。当代码执行到的时候才会生成对应的字符串对象存入串池,未被加载时仅仅是运行时常量池中的符号,还未变为字符串对象。

常量池与串池的区别

常量池最初存在于类字节码当中,当该类被加载的时候才会被加载到运行时常量池中(内存)

public void TestStringTable(){
    //前提是该类被调用加载入内存中的串池
    //StringTable["a","b","ab"]
    String s1 = "a";  //当读取到此行代码时,最开始串池中不存在a 进行加载
    String s2 = "b";  //当读取到此行代码时,最开始串池中不存在b 进行加载
    String s3 = "ab"; //当读取到此行代码时,最开始串池中不存在ab 进行加载
    
    
    //  new StringBuilder().append("a").append("b").toString();  toString()底层--->new String("ab")
    String s4 = s1+s2;   //注意此处是变量
    //  s5="ab"
    String s5 = "a"+"b";  //注意此处是常量
 
    
    //问题1:此时s3==s4吗?
    System.out.println(s3==s4);
    //问题2:此时s3==s5吗?
     System.out.println(s3==s5);
    
    
 
   
    
   
    //答案是false
    //问题1解析:s3虽然在被执行的时候已经被串池所加载,通过反编译可以知道s4在执行的时候是创建了StringBuilder对象,调用两次append,将串池中的a,b取出进行拼接,再进行toString(),关键在toString,经过看toString的方法可以知道,底层是new了一个String对象,将拼接的结果传入,由于是new出来的东西就一定会进入堆内存当中重新分配一个地址值,所以与串池当中的地址值就不会相同,故false
   
    //答案是true
    //问题2解析:在执行s3的时候,已经把ab加载入串池当中。通过反编译可以知道在执行到s5的时候编译器直接编好了一个a+b的结果ab,而不是在执行的时候对a+b=ab进行字符串拼接,所以会去池子中找到已经存在的ab取出给s5赋值。故答案时true。
    //可是为什么在执行s4的时候是使用的StringBuilder拼接,s5就是直接拼接好了呢?原因是因为虚拟机会判定该常量已经不会有任何的变动,其结果必定为ab(javac命令在编译期的优化),而s4是通过变量进行赋值的,变量是有可能会变化的,所以s4和s5的执行过程会不一致。
    
    
    //问题3:假若串池中为ab,此处的结果是什么,此时串池中有什么?
    //答案:false,["a","b","ab"] 解析:new出来的东西进堆内存
      String s = new String("a")+new String("b");   // new String("ab")
      System.out.println(s=="ab");
    
   
}
StringTable(串池)特性
  1. 常量池中的字符串仅是符号,当第一次被加载到的时候,字符串才会池化
  2. 池化机制,可保证每个字符串在串池中是唯一的。避免重复创建对象。
  3. 字符串变量拼接的原理是 StringBuilder (1.8)
  4. 字符串常量拼接的原理是编译器优化,会提前识别最终拼接结果。
  5. 字符串intern()方法,将池中没有的字符串进行池化

intern特性

1.8和之前是不一样的。

1.8特性:放入成功–>调用者同化, 不成功—>调用者不同化,依然是堆内存的地址值

1.7特性:调用者不管放入成功与否都不会进行同化。

intern方法定义:将调用对象尝试放入池中,判定池中是否存在

若池中没有,返回放入后该值在池中对应的地址值,同化调用者的地址值
有, 返回池中的原有值的地址值,不同化调用者的地址值

String a ="ab"; 
String s = new String ("a")+ new String("b");
String s1 = s.intern(); //intern方法的定义:将字符串尝试放入池中,池中有则返回池中对象,池中没有则添加
System.out.println(s==a);
System.out.println(s1==a);


    //问题4:下来两种情况,结果分别是什么?
	//情况1:池中没有ab
        String s = new String ("a")+ new String("b"); // new String (ab)
        String s1 = s.intern(); //将new String尝试放入池中 
        System.out.println(s=="ab");
        System.out.println(s1=="ab"); 


	//情况2:池中有ab
		String a = "ab"
        String s = new String ("a")+ new String("b"); // new String (ab)
        String s1 = s.intern(); //将new String尝试放入池中 
		System.out.println(s==a);
        System.out.println(s1==a); 

//解析,关键在于看调用者会不会被同化。
//情况1:开始的时候池中是没有值的[],由intern特性,可以成功放入池中,返回ab在池中的地址值给s1且同化自身s的地址值,所以s=="ab" 
	  //由于返回的s1就是池中的地址值,所以也s1=="ab"
//情况2:开始的时候池中值["ab"],,由intern特性,不会成功放入池中,但是依旧返回ab在池中的地址值给s1,但是不会对s进行同化,所以s的地址值依旧是堆内存中的地址值,所以s!=a

面试题

  //[a,b,ab]
String s1="a";
String s2="b";
String s3="a"+"b"; //ab
String s4=s1+s2; // new String (ab)
String s5="ab";  //ab
String s6=s4.intern();  //放不进,不同化

  System.out.println(s3==s4); //f
  System.out.println(s3==s5); //t
  System.out.println(s3==s6); // t

  String x2 =new String("c")+new String("d"); // new String (cd)
  String x1 ="cd";  //[cd]
  x2.intern();

  System.out.println(x1==x2); //f

StringTable位置

从JDK1.7开始,从永久代,改到了堆内存中,因为永久代在使用StringTable的时候效率太低

StringTable垃圾回收机制

当池中存在很多未被引用的字符串,导致内存紧张的时候会触发垃圾回收机制对未被引用的对象进行回收,但是如果在内存不紧张的时候,垃圾回收是不会被触发的。

StringTable性能调优

StringTable是按照哈希表进行排列的,哈希表是由数组+链表组成的,哈希表的性能高低是根据其大小(即桶的多少)来确定的,越大越快,就相当于元素更加分散,链表短。哈希冲突的几率就越小,查找速度就会变快。反之越小就会导致链表的长度越长,根据其特性查找就会越慢。

其他知识点

  1. ​ 有一个三方jar包,提供ObjectMapper类,可以将指定类对象中的成员变量变为JSON格式

    (如果该变量是一个实体类,那么进入该实体类继续转换。有递归的可能性出现内存溢出)

    ​ 提供@JsonIgnore注解,用在成员变量上,不对此变量进行转换

  2. CPU占用过高

    由于后期集成是在Linux中进行,故对Linux进行操作

    • 使用top定位哪个进程对CPU占用过高

    • ps H ep pid,tid,%cpu | grep 进程id(用ps命令进一步定位是哪一个线程导致CPU使用过高)

    • jstack 进程id (根据线程id找到有问题的线程,进一步定位到问题代码的源码行号)

      注:thread开头是用户的线程。

      ​ 线程编号是十六进制,所以要将Linux的线程编号进行转换再查找用户线程中的nid查看是否一致。找到一致的那个线程,他的下方就是状态为runnable,再下方就是出错的代码行数

由于后期集成是在Linux中进行,故对Linux进行操作

  • 使用top定位哪个进程对CPU占用过高

  • ps H ep pid,tid,%cpu | grep 进程id(用ps命令进一步定位是哪一个线程导致CPU使用过高)

  • jstack 进程id (根据线程id找到有问题的线程,进一步定位到问题代码的源码行号)

    注:thread开头是用户的线程。

    ​ 线程编号是十六进制,所以要将Linux的线程编号进行转换再查找用户线程中的nid查看是否一致。找到一致的那个线程,他的下方就是状态为runnable,再下方就是出错的代码行数

uniapp 记录运动轨迹 开发_智能手环穿戴设备APP开发解决方案 智能手环是一种穿戴式智能设备,是目前备受关注的科技产品。目前智能手环具有的功能有记录日常生活中的运动数据、移动轨迹,定位等,有些还可以进行睡眠质量的检测,并将这些数据传送至移动端如手机、平板等,可对数据进行分析,指导健康生活的作用。而智能手环开发方案就是将这些功能实现,将算法烧录到主控板上。智能手环都有哪些功能  1、记录运动数据  对于喜欢健身的用户来说,智能手环记录的运动数据功能... 阅读详情

相关推荐

Python入门基础教程(非常详细)

Python是一门开源免费、通用型的脚本编程语言,它上手简单,功能强大,坚持「极简主义」。Python类库(模块)极其丰富,这使得Python几乎无所不能,不管是传统的Web开发、PC软件开发、Linux运维,还是当下火热的机器学习、大数据分析、网络爬虫,Python都能胜任。这套Python基础教程不是教科书,不会玩弄概念,而是力求口语化和通俗化,让读者尽快入门。如果有小朋友出于兴趣学习Python,请引导他阅读本教程的前半部分,这是基础,可以降低学习成本;...

Yuki1127918的博客 34万+

JVM 栈中的“压栈”和“弹栈”操作

类似地,如果我们将相同类型的元素不断“压栈”,而没有“弹栈”,就会导致类型转换错误,产生ClassCastException异常。最后,当结账完成后,购物车中的商品被全部取完,此时购物车的栈帧也被清空,即已经没有任何商品可以“弹栈”出来了。JVM(Java虚拟机)中的“压栈”和“弹栈”操作,其实是操作栈帧中的操作数栈(Operand Stack),作用是在方法调用过程中,用于存储方法使用的数据和中间计算的结果。再来看看“压栈”操作。在这个过程中,小明又需要重新“压栈”,把新买的商品放入购物车中。

zh1685188342的博客 726

海康VM加密狗无法识别常见问题排查

海康VM加密狗无法识别常见问题排查

视觉人机器视觉的博客 2710

JVM-------栈

早在数据结构的学习中,我们就知道了栈具有先进先出的特点,而数据结构是程序的一部分,那么栈的特点在java中是如何体现的呢?当方法执行完毕后,又会被弹出栈,b—>a---->main的顺序弹出栈,当栈为空时,即代表程序运行结束,这也就是为什么main方法先执行而后结束的原因。接着执行print()方法的调用,将print()压入栈中,当方法体print()被调用完成后,就会立刻马上从栈内弹出,最后,上述实例中,我们的调用次数是很少的,所以不会存在栈溢出这种情况!

m0_64365419的博客 680

ubuntu安装glibc

VSCode 在ubuntu下调试无法打开libc-start.c raise.c等1. 安装glibc2. launch.json中添加路径映射3. 调试 1. 安装glibc apt install glibc-source cd /usr/src/glibc/ sudo tar -xvf glibc-[VERSION].tar.xz 2. launch.json中添加路径映射 "sourceFileMap": { "/build/glibc-S7xCS9": "/usr/src/glib

wq_0708的博客 3万+

【自然语言处理(NLP)实战】LSTM网络实现中文文本情感分析(手把手与教学超详细)

在当今数字化时代,人们在社交媒体、评论平台以及各类在线交流中产生了海量的文本数据。这些数据蕴含着丰富的情感信息,从而成为了深入理解用户态度、市场趋势,甚至社会情绪的宝贵资源。自然语言处理(NLP)的发展为我们提供了强大的工具,使得对文本情感进行分析成为可能。在这个领域中,长短时记忆网络(LSTM)凭借其能够捕捉文本序列中长距离依赖关系的能力,成为了情感分析任务中的一项重要技术。通过详细的步骤和示例代码,深入了解如何处理中文文本数据、构建LSTM模型、进行训练和评估。

halo的博客 2万+

JVM1.8(二):JVM1.8内存模型

1、内存模型概览 本文介绍的是JDK1.8的内存模型。1.8同1.7相比,最大的差别就是元空间取代了永久代。元空间的本职和永久代类似,都是堆JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不存在虚拟机中,而是使用本地内存。 内存模型概览如下: 其中程序计数器、虚拟机栈、本地方法栈是线程私有的。方法区、堆是线程公有的。 2、各区域详细介绍 2.1、程序计数器 程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。 字节码解释器的工作就是通过改

帅过驴的袋鼠的博客 9668

Microchip Studio 7.0 从零开始:下载、安装到首个AVR工程实战

本文为AVR单片机开发新手提供了Microchip Studio 7.0的完整入门指南。从官方下载、避坑安装,到创建首个GCC C工程、编写LED闪烁代码,再到项目配置、仿真调试与程序烧录,手把手带你完成从零到一的实战过程,是掌握AVR开发环境的必备教程。

weixin_29200741的博客 520

【Java基础】JVM详解

JVM是Java Virtual Machine(Java虚拟机)的缩写 JVM内存结构 JVM主要是由堆、栈、方法区、本地方法栈、程序计数器组成 方法区储存类信息,常量。静态变量等数据,是线程共享区域 栈又分为Java栈和本地方法栈,用于方法的执行,属于线程私有区域 ...

weixin_55175040的博客 1300

深信服PT1-AF实验考试

深信服PT1-AF实验考试实验练习可以去深信服的在线实验平台(链接如下):深信服在线实验平台 (sangfor.com.cn)实验考试其实就是把所有的每一部分实验综合了起来以下内容仅做参考,不确保一样。

m0_72019240的博客 7107

网表导入virtuoso后发现pg pin忘记connect_pg_net/globalNetConnect怎么办?

数模混合项目中经常需要一些需要到virtuoso去连接的线,比如IO上的pg和一些信号线,除了在pr工作中设置skip route之外还需要做好net的赋值,告诉工具虽然我没在物理上有连接,但是实际上应该连什么net,这部分提现在网表里。在Default Net Name中也填写net name,因为这个net需要做global操作,即在顶层定义这个net,所以需要在net name后加个!打开schematic,删除指定cell pin所接net的label。

m0_61544122的博客 969

JVM基础知识(个人总结)

    声明: 1. 本文为我的个人复习总结, 并非那种从零基础开始普及知识 内容详细全面, 言辞官方的文章               2. 由于是个人总结, 所以用最精简的话语来写文章            

hellosrc的博客 1707

YOLOv11改进策略【卷积层】| ICCV-2023 引入Dynamic Snake Convolution动态蛇形卷积,改进C3k2

基于拓扑几何约束的动态蛇卷积用于管状结构分割DSConv(Dynamic Snake Convolution,动态蛇形卷积)模块的设计主要是为了更好地处理管状结构的分割任务,解决传统卷积在处理细管状结构时的不足。

Limiiiing的博客 1628

JVM基础和调优

CMS和G1回收器,G1的并发标记周期,为什么要JVM调优? 减少GC,特别是FullGC对象优先在堆的 Eden 区分配大对象直接进入老年代长期存活的对象将直接进入老年代. 当 Eden 区没有足够的空间进行分配时,

分享技术,享受生活 2万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

关于JVM的简单论述及调优

简单初识JVM: 下面我们讲的都是关于:HotSpot JVM JavaDevelopmentKit(JDK)是一款Java语言的软件开发工具包 Java运行环境(Java Runtime Environment,简称JRE),JRE的内部有一个Java虚拟机(Java Virtual Machine,JVM)以及一些标准的函数库lib(Class Library)。 如何发现内存OOM问题:可以在IDEA安装插件JProfiler插件,同时安装客户端; JDK1.8 JVM主要分为.

weixin_44080187的博客 727

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

JVM基础

---继承实现ClassLoader类Tomcat的自定义类加载器。

SuoGG的博客 1841

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

JVM 基础到入门 —— JVM篇

JVM 基础到入门一、JVM 基础1.jdk2.jre3.javac 指令4.Java 指令5.jvm二、从跨平台的语言到跨语言的平台三、常见的虚拟机四、插件安装1.IDEA 插件 Bined2.IDEA 插件 jclasslib Bytecode Viewer ​ Java可以获得如此广泛的认可,除了它拥有一门结构严谨、面向对象的编程语言之外,还有许多不可忽视的优点:它摆脱了硬件平台的束缚,实现了“一次编写,到处运行”的理想;它提供了一种相对安全的内存管理和访问机制,避免了绝大部分内存泄漏和指针越界问题

YING—country的博客 1760

JVM 基础入门 - 基础概念

JVM 基础入门 - 基础概念 怎么说呢作为一个伸手党,第一次写文章,写的不好的地方多多见谅。 好了,攻城狮们,我知道你们都想要干活,那就话不多说开始吧。 基础入门 → 高级特性 → 底层原理 → 优化实战 → 源码解读 什么是JVM 虚拟机 █Java程序运行过程 █ JDK、JRE与JVM JVM 只是一个java 的虚拟机规范。具体的实现其实是有很多的。下面会讲到。 是将Java程序从javac编译成calss文件执行,并运行的一个容器,通过类加载器进行加载,

miluan_ren的博客 444

JVM基础【Java】

Java中JVM的基础知识

amazing2024的博客 2163

JVM基础入门

JVM全称是是一种可以执行Java字节码的虚拟计算机。跨平台兼容性:JVM为Java程序提供了一个与底层硬件和操作系统无关的运行环境。这意味着在任何安装了JVM的设备上,都可以运行相同的Java程序。安全性:JVM提供了一个安全的运行环境,它可以验证字节码以确保它们不会执行任何有害的操作。此外,它还提供了安全管理器来控制对系统资源的访问。自动内存管理:JVM自动管理程序的内存分配和回收,这包括垃圾回收机制,以自动回收不再使用的内存空间,从而减少内存泄漏和提高程序性能。执行Java字节码。

qq_52295468的博客 1251

JVM - JVM基础

JVM基础

qq_43350524的博客 1548

【JVM基础】JVM入门,详讲JVM

JVM 全称是 Java Virtual Machine,中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件。Java源代码执行流程如下:分为三个步骤:1、编写Java源代码文件。2、使用Java编译器(javac命令)将源代码编译成Java字节码文件。3、使用Java虚拟机加载并运行Java字节码文件,此时会启动一个新的进程。针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。

2401_84519929的博客 965

JVM原理-基础篇

Java虚拟机(JVM, Java Virtual Machine)是运行Java应用程序的核心组件,它是一个抽象化的计算机系统模型,为Java字节码提供运行环境。JVM的主要功能包括:类加载机制、内存管理、垃圾回收、指令解释与执行、异常处理与安全检查、性能优化等。

nuist_NJUPT的博客 1587

【JVM】JVM基础知识

JVM知识总结Java的跨平台性JVM概念JDK/JVM/JRE是什么关系JVM生命周期启动和消亡JVM运行的起点:JVM两种线程:JVM工作过程类加载子系统运行时数据区域执行引擎类加载器前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结三级目录 Java的跨平台性 Java的跨平台性,能够实现跨平台的是Java程序,而不是JVM,JVM是用C/C++开发,是编译之后的机器码,无法实现跨平台,不同的平台下需要安装不同的JVM Java程序编译之后会生成字节码文件,即.class文件,JVM

qq_40939454的博客 682

Java基础 之 JVM

JVM基础 JVM JVM是一种规范,基于这套规范的jvm平台可以通过字节码指令集及内存管理来虚构出一台计算机,任何语言符合JVM规范并编译成class文件,即可以在JVM虚拟机上运行。目前常见的JVM实现,常用的有Hotspot,openjdk,也有TaobaoVM,J9,LiquidVM,Jrockit,Microsoft VM,azul zing等,通过java -version 即可查看当前的虚拟机平台。 JVM虚拟机可以加载运行应用程序,在JVM基础上,附加核心库(core lib) ,即构

Ivan Xiang 3172
上一篇: Mybatis总结
下一篇: Json基础
Blanklr
博客等级 码龄6年 12粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值