jvm概述

ops/2024/10/22 16:23:13/

de0657411e554df480ea5af7bd8d118c.jpgJVM(Java Virtual Machine,Java虚拟机)是Java程序运行的核心组件,它是一个运行时环境,负责将Java字节码(bytecode)转换为机器码并执行。JVM是平台相关的,这意味着不同的操作系统需要不同的JVM实现。Java程序(.class文件)在JVM上运行,而JVM则在操作系统之上运行,这样就实现了Java的跨平台特性(Write Once, Run Anywhere)。

 

 

JVM主要组成部分包括:

 

1. 字节码指令集:Java源代码先被编译成字节码,然后由JVM中的字节码解释器解释执行。

2. 一组寄存器:JVM内部有一组虚拟的寄存器,用于存储程序运行过程中的中间结果。

3. 栈:每个线程在JVM中都有一个私有的Java栈,用于存储局部变量、操作数栈、动态链接、方法返回值等信息。

4. 垃圾回收堆:JVM自动管理内存分配和回收,堆是Java对象实例的主要存储区域。

5. 方法区(Method Area):又称为静态区,是JVM的一个共享区域,用于存储已加载的类的信息(如类的结构、常量池、字段、方法等)。

 

Java 8虚拟机相较于之前的版本有以下变化和更新:

1. 对于HotSpot虚拟机,引入了G1(Garbage First)垃圾回收器作为生产环境可用的垃圾回收器,它旨在解决大规模Java应用的内存管理和性能问题。

2. 模块化:Java 8引入了模块化系统,即Project Jigsaw,其目的是为了提高Java平台的安全性和可维护性,并且使得开发者更容易构建、测试和部署应用程序。

3. 默认方法:在接口中可以定义带有实现的默认方法,这使得接口可以在不破坏现有实现的情况下进行扩展。

4. 时间API的改进:引入了新的时间日期API(java.time),以更直观和高效的方式来处理时间日期。

 

常见的JVM调优参数包括:

- `-Xms` 和 `-Xmx`:设置JVM堆内存的最小和最大大小。

- `-XX:NewSize` 和 `-XX:MaxNewSize`:设置年轻代(Young Generation)的最小和最大大小。

- `-XX:SurvivorRatio`:设置年轻代中Eden区与Survivor区的比例。

- `-XX:MaxTenuringThreshold`:设置对象从年轻代晋升到老年代的最大年龄。

- `-XX:PretenureSizeThreshold`:直接在老年代分配对象的阈值,超过该大小的对象会直接在老年代分配。

- `-XX:+PrintGCDetails`:打印详细的垃圾回收信息。

 

当Java程序出现内存溢出(OOM,Out-of-Memory)或栈溢出(StackOverFlowError)时,可以通过以下方式进行分析:

1. 使用JVM提供的工具,如jstat、jmap、jstack等,来监控和分析JVM内存使用情况和线程状态。

2. 生成堆dump文件(使用`jmap -dump:format=b,file=filename.hprof [pid]`),然后使用MAT(Memory Analyzer Tool)或VisualVM等工具分析内存泄漏。

3. 分析GC日志,查看垃圾回收的频率和耗时,确定是否存在内存分配过多或回收不及时的问题。

 

类加载器(Class Loader)是JVM的一个组件,负责将.class文件加载到内存中。类加载器分为:

1. 启动类加载器(Bootstrap Class Loader):负责加载Java的核心库,如rt.jar。

2. 扩展类加载器(Extension Class Loader):负责加载Java的扩展目录中的类和jar包。

3. 应用程序类加载器(Application Class Loader):负责加载用户类路径(CLASSPATH)上的类和jar包。

4. 自定义类加载器(Custom Class Loader):由应用程序开发者自定义,用于满足特定需求,如加载网络上的类或加密保护的类。

 

类加载器在JVM中的作用非常重要,它们不仅负责加载类,还参与类的卸载和替换,是JVM内存管理和类动态加载的关键部分。


http://www.ppmy.cn/ops/5505.html

相关文章

leetcode748-Shortest Completing Word

题目 给你一个字符串 licensePlate 和一个字符串数组 words ,请你找出 words 中的 最短补全词 。 补全词 是一个包含 licensePlate 中所有字母的单词。忽略 licensePlate 中的 数字和空格 。不区分大小写。如果某个字母在 licensePlate 中出现不止一次&#xff0c…

git工具简单使用

文章目录 git上传克隆README.gitignore常用指令冲突 git 进行版本控制的版本控制器。安装git yum install -y git 配置git git config --global user.email "youexample.com" 告诉git你的邮箱是什么?最好输入你的gitee的注册邮箱git config --global …

记录PS学习查漏补缺

PS学习 PS学习调色抠图PS专属多软件通用快捷键 技巧画笔工具的用法参考线取消蒙版的效果将当前图层只作用于下面的图层透视效果实现调色的时候不想让某些部分被调色,比如说调花的时候不想让天空和房子被改变颜色 PS学习 JPEG (不带透明通道)…

汽车笔记-保险

保险 1.交强险 上路必须买的, 国家规定必须要买。交强险不管你是有责还是无责,它都是可以赔偿的。交强险还有一个18000的垫付功能,比如说我们出了交通事故后,对方住院治疗需要你垫付钱,那么这个时候就可以用到交强险…

R version 4.1.0 安装ggplot2,options(pkgType=“binary“) install.packages(“ggplot2“)

R version 4.1.0 安装ggplot2 R version 4.1.0 安装ggplot21. 报错信息2. 成功安装3. 参考资料 R version 4.1.0 安装ggplot2 # 直接安装报错 install.packages("ggplot2")# 安装成功 options(pkgType"binary") install.packages("ggplot2")1. …

4.2 OpenCV-人体/脸检测、OpenCV-边缘检测类、OpenCV-结构分析类(冰达机器人摄像头与图像使用)

4.2摄像头与图像 4.2.1摄像头的驱动与图像查看 在移动机器人端使用启动摄像头: roslaunch robot_vision robot_camera.launch 正常启动后摄像头上的红色指示灯会亮起来 打开虚拟机在PC端运行rqt工具查看图像 rqt_image_view 启动工具后即可弹出下图窗口&#…

基于CppHttpLib的Httpserver

1 背景 大多数嵌入式设备由于没有屏幕输出,只能通过Web页面来配置。这里利用CPPHttpLib来实现HttpServer。 2 HttpServer HttpServer是利用CPPHttpLib开源库实现的Http服务器CppHttpLib是基于C11的HTTP开源库,开源协议是MIT. CppHttpLib下载地址 2.1 …

C语言扫雷游戏完整版、标记、取消标记、自动拓展

文章目录 前言一、扫雷完整代码总结 前言 用C语言实现扫雷游戏,标记功能,取消标记功能,自动拓展功能,标记只是雷,并且数量等于雷的数量,自动获胜。 一、扫雷完整代码 // test.c 源文件 #define _CRT_SECU…