JVM之本地方法栈和程序计数器和堆

本地方法栈

本地方法栈是为虚拟机执行本地方法时提供服务的

JNI:Java Native Interface,通过使用 Java 本地接口程序,可以确保代码在不同的平台上方便移植

  • 不需要进行 GC,与虚拟机栈类似,也是线程私有的,有 StackOverFlowError 和 OutOfMemoryError 异常

  • 虚拟机栈执行的是 Java 方法,在 HotSpot JVM 中,直接将本地方法栈和虚拟机栈合二为一

  • 本地方法一般是由其他语言编写,并且被编译为基于本机硬件和操作系统的程序

  • 当某个线程调用一个本地方法时,就进入了不再受虚拟机限制的世界,和虚拟机拥有同样的权限

    • 本地方法可以通过本地方法接口来访问虚拟机内部的运行时数据区

    • 直接从本地内存的堆中分配任意数量的内存

    • 可以直接使用本地处理器中的寄存器

原理:将本地的 C 函数(如 foo)编译到一个共享库(foo.so)中,当正在运行的 Java 程序调用 foo 时,Java 解释器利用 dlopen 接口动态链接和加载 foo.so 后再调用该函数

  • dlopen 函数:Linux 系统加载和链接共享库

  • dlclose 函数:卸载共享库


程序计数器

Program Counter Register 程序计数器(物理上由寄存器实现)

作用:内部保存字节码的行号,用于记录正在执行的字节码指令地址(如果正在执行的是本地方法则为空)

原理:

  • JVM 对于多线程是通过线程轮流切换并且分配线程执行时间,一个处理器只会处理执行一个线程

  • 切换线程需要从程序计数器中来回去到当前的线程上一次执行的行号

特点:

  • 是线程私有的

  • 不会存在内存溢出,是 JVM 规范中唯一一个不出现 OOM 的区域,所以这个空间不会进行 GC

Java 反编译指令:javap -v Test.class

#20:代表去 Constant pool 查看该地址的指令

0: getstatic #20        // PrintStream out = System.out;
3: astore_1             // --
4: aload_1              // out.println(1);
5: iconst_1             // --
6: invokevirtual #26    // --
9: aload_1              // out.println(2);
10: iconst_2            // --
11: invokevirtual #26   // --

Heap 堆:是 JVM 内存中最大的一块,由所有线程共享,由垃圾回收器管理的主要区域,堆中对象大部分都需要考虑线程安全的问题

设置堆内存大小:-Xmx

存放哪些资源:

  • 对象实例:类初始化生成的对象,基本数据类型的数组也是对象实例,new 创建对象都使用堆内存

  • 字符串常量池(底层为hashtable结构,不能扩容):

    • 字符串常量池原本存放于方法区,JDK7 开始放置于堆中

    • 字符串常量池存储的是 String 对象的直接引用或者对象,是一张 string table

  • 静态变量:静态变量是有 static 修饰的变量,JDK8 时从方法区迁移至堆中

  • 线程分配缓冲区 Thread Local Allocation Buffer线程私有但不影响堆的共性,可以提升对象分配的效率

设置堆内存指令:-Xmx Size

内存溢出:new 出对象,循环添加字符数据,当堆中没有内存空间可分配给实例,也无法再扩展时,就会抛出 OutOfMemoryError 异常

堆内存诊断工具:(控制台命令)

  1. jps:查看当前系统中有哪些 Java 进程

  2. jmap:查看堆内存占用情况 jhsdb jmap --heap --pid 进程id

  3. jconsole:图形界面的,多功能的监测工具,可以连续监测

在 Java7 中堆内会存在年轻代、老年代和方法区(永久代)

  • Young 区被划分为三部分,Eden 区和两个大小严格相同的 Survivor 区。Survivor 区某一时刻只有其中一个是被使用的,另外一个留做垃圾回收时复制对象。在 Eden 区变满的时候,GC 就会将存活的对象移到空闲的 Survivor 区间中,根据 JVM 的策略,在经过几次垃圾回收后,仍然存活于 Survivor 的对象将被移动到 Tenured 区间

  • Tenured 区主要保存生命周期长的对象,一般是一些老的对象,当一些对象在 Young 复制转移一定的次数以后,对象就会被转移到 Tenured 区

  • Perm 代主要保存 Class、ClassLoader、静态变量、常量、编译后的代码,在 Java7 中堆内方法区会受到 GC 的管理

分代原因:不同对象的生命周期不同,70%-99% 的对象都是临时对象,优化 GC 性能

public static void main(String[] args) {// 返回Java虚拟机中的堆内存总量long initialMemory = Runtime.getRuntime().totalMemory() / 1024 / 1024;// 返回Java虚拟机使用的最大堆内存量long maxMemory = Runtime.getRuntime().maxMemory() / 1024 / 1024;System.out.println("-Xms : " + initialMemory + "M");//-Xms : 245MSystem.out.println("-Xmx : " + maxMemory + "M");//-Xmx : 3641M
}

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

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

相关文章

OCP Java17 SE Developers 复习题13

答案 D, F. There is no such class within the Java API called ParallelStream, so options A and E are incorrect. The method defined in the Stream class to create a parallel stream from an existing stream is parallel(); therefore, option F is correct, and o…

Spring源码中的抽象工厂模式

Spring 框架中广泛运用了抽象工厂模式来实现其核心组件的创建与管理。以下是源码分析: 源码分析: 1. BeanFactory 与其实现 org.springframework.beans.factory.BeanFactory 是 Spring 中最基础的工厂接口,它代表了抽象工厂模式中的“抽象…

Spring Boot分段处理List集合多线程批量插入数据

项目场景: 大数据量的List集合,需要把List集合中的数据批量插入数据库中。 解决方案: 拆分list集合后,然后使用多线程批量插入数据库 1.实体类 package com.test.entity;import lombok.Data;Data public class TestEntity {priv…

Python入门:使用Python实现简单的猜数字游戏

Python是一种解释型、交互式、面向对象的编程语言,其设计哲学强调代码的可读性,并允许开发者用少量代码表达想法。在本文中,我们将通过编写一个简单的猜数字游戏来展示Python的基础知识和编程逻辑。 游戏描述 游戏开始时,程序会…

数字化转型过程中所面临的挑战以及应对这些挑战的策略

随着信息技术的快速发展,企业为了提升运营效率、优化资源配置,往往会在不同部门建立各自的信息系统。然而,这些系统的孤立性、功能重叠以及数据不一致性等问题逐渐凸显,导致企业业务流程受阻,难以形成高效的协同作战能…

Spring源码中的简单工厂模式

Spring 源码中广泛运用了各种设计模式,其中包括简单工厂模式。简单工厂模式在 Spring 中主要用于简化对象的创建过程,将对象的创建逻辑集中管理,从而使得客户端代码无需关心具体的对象创建细节,只需与工厂交互就能获取所需的对象实例。这种设计有助于提高代码的可读性、可维…

高斯溅射融合之路(一)- webgl渲染3d gaussian splatting

大家好,我是山海鲸的技术负责人。之前已经写了一个GIS融合系列。其实CesiumJS的整合有相当的难度,同时也有很多方面的工作,很难在几篇文章内写完,整个山海鲸团队也是投入了接近两年的时间,才把周边整套工具链进行了完善…

prometheus服务端部署

prometheus 安装 下载 # https://prometheus.io/download/wget https://github.com/prometheus/prometheus/releases/download/v2.34.0/prometheus-2.34.0.linux-amd64.tar.gztar -zxf prometheus-2.34.0.linux-amd64.tar.gz -C /data0/prometheus-2.34.0sudo adduser prome…

Linux中inode号与日志分析

一.inode号 1.inode表结构 元信息:每个文件的属性信息,比如:文件的大小,时间,类型,权限等,称为文件的元数据(meta data 元信息 ) 元数据是存放在inode(index node)表中…

Spring Kafka—— KafkaListenerEndpointRegistry 隐式注册分析

由于我想在项目中实现基于 Spring kafka 动态连接 Kafka 服务,指定监听 Topic 并控制消费程序的启动和停止这样一个功能,所以就大概的了解了一下 Spring Kafka 的几个重要的类的概念,内容如下: ConsumerFactory 作用:…

Opencv_2_ 图像色彩空间转换

ColorInvert.h 内容如下&#xff1a; #pragma once #include <opencv.hpp> using namespace std; #include <opencv.hpp> using namespace cv; using namespace std; class ColorInvert{ public : void colorSpaceInvert(Mat&image); }; ColorInvert.cpp…

使用了Python语言和Flask框架。创建一个区块链网络,允许用户通过HTTP请求进行交互,如包括创建区块链、挖矿、验证区块链等功能。

目录 大概来说&#xff1a; 二、代码注释 1.添加交易方法&#xff08;add_transaction函数&#xff09; 2.添加新的节点&#xff08;add_node 函数&#xff09; 3、替换链的方法&#xff08;replace_chain函数&#xff09; 总结 大概来说&#xff1a; 定义了一个名为Blo…

1、初识Linux系统 shell 脚本

shell脚本组成介绍 1、shell脚本命名规则 必须以.sh文件结尾&#xff0c;类似.txt文件&#xff1b;例如创建一个test.sh文件 2、linux系统中shell脚本开头&#xff0c;必须以如下代码开头 test.sh内容如下&#xff1a; #!/bin/bash# 这是一个注释echo "Hello, World!&…

西安地区调频广播频率一览

FM89.6 陕西人民广播电台经济广播 FM91.6 陕西人民广播电台交通广播 FM93.1 西安人民广播电台音乐广播 FM95.5 中央人民广播电台音乐之声 FM96.4 中央人民广播电台中国之声 FM98.8 陕西人民广播电台音乐广播 FM101.1 陕西人民广播电台戏曲广播 FM101.8 陕西人民广播电台…

高效过滤器检漏方法选择指南及关键注意事项一览

在生物制药企业中&#xff0c;高效过滤器&#xff08;HEPA&#xff09;的检漏工作是确保洁净室能够达到并保持设计的洁净级别的关键步骤。这关系到产品的质量和安全&#xff0c;因此必须遵循相关法规标准和操作流程。 关于北京中邦兴业 北京中邦兴业科技有限公司是一家国家高新…

element中file-upload组件的提示‘按delete键可删除’,怎么去掉?

问题描述 element中file-upload组件会出现这种提示‘按delete键可删除’ 解决方案&#xff1a; 这是因为使用file-upload组件时自带的提示会盖住上传的文件名&#xff0c;修改一下自带的样式即可 ::v-deep .el-upload-list__item.is-success.focusing .el-icon-close-tip {d…

2.微服务技术

微服务技术对比 DubboSpringCloudSpringCloudAlibaba注册中心zookeeper&#xff0c;RedisEureka,ConsulNacos,Eureka服务远程调用Dubbo协议Feign(http协议)Dubbo,Feign配置中心SpringCloudConfigSpringCloudConfig,Nacos服务网关SpringCloudGateway,ZuulSpringCloudGateway,Zu…

css 设置div阴影样式

文章目录 问题描述解决方案代码示例设置阴影样式 问题描述 大家好&#xff01;我是夏小花&#xff0c;今天是2024年4月23日|农历三月十五&#xff0c;今天这篇文章主要以div或者是view添加阴影样式为主题 &#xff0c;详细代码如下 解决方案 这段是vue页面中的 代码&#xff0…

基于SpringBoot的宠物领养网站管理系统

基于SpringBootVue的宠物领养网站管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 宠物领养 宠物救助站 宠物论坛 登录界面 管理员界面 摘要 基于Spr…

1.C++入门

目录 1.C关键字 2.命名空间 作用域方面的优化 a.命名空间定义 b.命名空间使用 3.C 输入&输出 1.C关键字 C有63个关键字&#xff0c;C语言有32个关键字&#xff0c;存在重叠如荧光笔标出 2.命名空间 作用域方面的优化 如果变量&#xff0c;函数和类的名称都存在于全…