直接内存、死锁、方法句柄

直接内存

1. 不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域
2. 直接内存是在Java堆外、直接向系统申请的内存区间
3. 来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存
4. 通常,访问直接内存的速度会优于Java堆,即读写性能高
5. 处于性能考虑,读写操作频繁的场合会考虑使用直接内存
6. Java的NIO库允许Java程序使用直接内存,用于数据缓冲区
7. 由于直接内存在Java堆外,因此它的大小不会直接受限于-Xmx指定的最大堆大小,但是系统内存是有限的,Java堆和直接内存的总和依然受限于操作系统能给出的最大内存。
8. 直接内存的大小可以通过MaxDirectMemorySize设置,如果不指定,则默认于堆的最大值-Xmx参数值一致

 缺点:

  分配回收成本较高

  不受JVM内存回收管理

public class BufferTest {private static final int BUFFER=1024*1024*1024;//1GBpublic static void main(String[] args) {
//        直接分配内存空间ByteBuffer byteBuffer = ByteBuffer.allocateDirect(BUFFER);System.out.println("直接内存分配完毕,请求指示!");Scanner scanner=new Scanner(System.in);scanner.next();System.out.println("直接内存开始释放");byteBuffer =null;System.gc();scanner.next();}
}

死锁

public class TestDeadLock implements Runnable {    public int flag = 1;    static Object o1 = new Object(), o2 = new Object();public void run() {    System.out.println("flag=" + flag);  if (flag == 1) {    synchronized (o1) {    try {    Thread.sleep(500);    } catch (Exception e) {    e.printStackTrace();    }    synchronized (o2) {    System.out.println("1");  }    }    }    if (flag == 0) {    synchronized (o2) {    try {    Thread.sleep(500);    } catch (Exception e) {    e.printStackTrace();    }    synchronized (o1) {    System.out.println("0");  }    }    }    
}

当flag为1时,线程首选获取o1锁,休眠500毫秒,然后尝试获取o2的锁,如果成功过,则打印"1".

当flag为2时,线程首选获取o2锁,休眠500毫秒,然后尝试获取o1的锁,如果成功过,则打印"0".

由于td1和flag为1,它首先获取了o1的锁,并休眠500毫秒。在td1休眠期间,td2开始执行并获取了o2的锁。当td1醒来兵尝试获取o2的锁时,它会被阻塞,因为o2的锁已经被td2持有,同样地,当td2醒来兵尝试获取o1的锁时,因为o1的锁已经被td1持有,这样,两个线程都陷入了等待状态,形成了死锁

为了避免死锁,可以采取以下策略:

方法句柄

 静态方法句柄
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;public class MethodHandleExample {public static void staticMethod(){System.out.println("static method called");}public static void main(String[] args) throws Throwable {
//        获取当前类的查找器MethodHandles.Lookup lookup=MethodHandles.lookup();
//        创建静态方法句柄MethodHandle methodHandle=lookup.findStatic(MethodHandleExample.class,"staticMethod", MethodType.methodType(void.class));
//        调用方法句柄methodHandle.invoke(); // static method called}
}
实例方法句柄
import java.lang.invoke.MethodHandle;  
import java.lang.invoke.MethodHandles;  
import java.lang.invoke.MethodType;  public class MethodHandleExample {  public void instanceMethod() {  System.out.println("Instance method called");  }  public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException {  // 创建类的实例  MethodHandleExample example = new MethodHandleExample();  // 获取当前类的查找器  MethodHandles.Lookup lookup = MethodHandles.lookup();  // 创建实例方法句柄  MethodHandle methodHandle = lookup.findVirtual(MethodHandleExample.class, "instanceMethod", MethodType.methodType(void.class));  // 绑定实例并调用方法句柄  methodHandle.bindTo(example).invoke();  }  
}

构造函数句柄
import java.lang.invoke.MethodHandle;  
import java.lang.invoke.MethodHandles;  
import java.lang.invoke.MethodType;  public class MethodHandleExample {  public MethodHandleExample() {  System.out.println("Constructor called");  }  public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InstantiationException {  // 获取当前类的查找器  MethodHandles.Lookup lookup = MethodHandles.lookup();  // 创建构造函数句柄  MethodHandle constructorHandle = lookup.findConstructor(MethodHandleExample.class, MethodType.methodType(void.class));  // 调用构造函数句柄创建实例  MethodHandleExample example = (MethodHandleExample) constructorHandle.invoke();  }  
}
方法句柄优势

方法句柄比传统的Java反射API更快,因为他们直接利用了JVM内部机制

方法句柄可以绑定到各种类型的方法上,包括私有方法和构造函数

方法句柄的访问控制更加细粒度,可以在运行时动态调整权限

public class Test {class GrandFather{void thinking(){System.out.println("GrandFather ");}}class Father extends GrandFather{void thinking(){System.out.println("Father");}}class Son extends Father{void thinking(){try {MethodType mt=MethodType.methodType(void.class);//            获取当前类的查找器MethodHandles.Lookup lookup=MethodHandles.lookup();
//            创建句柄MethodHandle mh=lookup.findSpecial(GrandFather.class,"thinking",mt,getClass());mh.invoke(this);} catch (NoSuchMethodException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);} catch (Throwable e) {throw new RuntimeException(e);}}}public static void main(String[] args) {(new Test().new Son()).thinking();}
}
public class Test {class GrandFather{void thinking(){System.out.println("GrandFather ");}}class Father extends GrandFather{void thinking(){System.out.println("Father");}}class Son extends Father{void thinking(){try {MethodType mt=MethodType.methodType(void.class);// 反射,绕过保护机制Field lookupImpl =MethodHandles.Lookup.class.getDeclaredField("IMPL_LOOKUP");lookupImpl.setAccessible(true);
//            获取当前类的查找器
//                MethodHandles.Lookup lookup=MethodHandles.lookup();
//            创建句柄MethodHandle mh=((MethodHandles.Lookup)lookupImpl.get(null)).findSpecial(GrandFather.class,"thinking",mt,GrandFather.class);mh.invoke(this);  //GrandFather} catch (NoSuchMethodException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);} catch (Throwable e) {throw new RuntimeException(e);}}}public static void main(String[] args) {(new Test().new Son()).thinking();}
}

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

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

相关文章

C++《list》

在本篇当中我们将学习STL中的list,在此list就是我们之前在数据结构学习过的链表,在本篇中我们要来了解list当中的成员函数该如何使用,由于list各个函数的接口和之前学习过的vector类型,因此在学习list的使用就较为轻松。在lis篇章…

【牛客刷题实战】二叉树遍历

大家好,我是小卡皮巴拉 文章目录 目录 牛客题目: 二叉树遍历 题目描述 输入描述: 输出描述: 示例1 解题思路 问题理解 算法选择 具体思路 解题要点 完整代码(C语言) 兄弟们共勉 !&…

vmvare启动freebsd操作系统密码忘记了怎么办?

本章教程,主要介绍,通过vmvare安装的freebsd操作系统,密码忘记了,如何重置密码。 一、重启虚拟机 在重启过程中,按键盘中是数字2,进入单用户模式。 二、进入到shell界面 在出现“Enter full pathname of shell or RETURN for /bin/sh:”直接按回车键。 三、输入命令 mou…

【设计模式系列】代理模式(八)

一、什么是代理模式 代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理模式在不直接访问实际对象的情况下,提供了对目标对象的间接访问。通过引入一个代理对象来间接操作实际对…

WPS查询函数VLOOKUP,匹配寻找值自动带入值

想实现在下表输入物料名称后,把上表中的单位自动带入 那就要用到VLOOKUP函数,获取第2个表第1列的值后去第1个表的第1列匹配,匹配到后得到行数值,把第1个表的第2列赋值给第2个表的第2列。 Vlookup函数参数为Vlookup(查找值&#…

sqoop问题汇总记录

此篇博客仅记录在使用sqoop时遇到的各种问题。持续更新,有问题评论区一起探讨,写得有不足之处见谅。 Oracle_to_hive 1. main ERROR Could not register mbeans java.security.AccessControlException: access denied ("javax.management.MBeanTr…

简单说明vuex

vuex 知识结构配置调用 知识结构 vue用于管理公共数据的仓库 配置 state:所有公共数据的初始状态(初始值) export default {state: {count: 0,} };mutations:修改state内容的方法(必须为同步方法) export …

分类算法——决策树 详解

决策树的底层原理 决策树是一种常用的分类和回归算法,其基本原理是通过一系列的简单决策,将数据集划分为多个子集,从而实现分类。决策树的核心思想是通过树形结构表示决策过程,节点代表特征,边代表决策,叶子…

Nature Electronics 用于语音识别的液体声传感器,基于悬浮在载液的钕-铁-硼磁性纳米颗粒

近年来,工程师们开发了一系列越来越复杂的传感器,用于机器人、便携式、可穿戴甚至植入式监测。然后,可以使用最先进的机器学习来分析这些传感器收集的数据,使设备能够识别音频中的特定声音、图像中的对象或其他信息。加州大学洛杉…

NVR批量管理软件/平台EasyNVR多个NVR同时管理支持视频投放在电视墙上

在当今智能化、数字化的时代,视频监控已经成为各行各业不可或缺的一部分,无论是公共安全、交通管理、企业监控还是智慧城市建设,都离不开高效、稳定的视频监控系统的支持。而在这些应用场景中,将监控视频实时投放到大屏幕电视墙上…

【GeoJSON在线编辑平台】(0)项目启动与前言

前言 事情是这样的…… 有这么一个项目,需要开发一个在线的标注平台。以天地图为底图,在天地图上标注出一些特征地物,比如描出农田耕地房屋建筑之类的要素。 这个需求简化一下其实就是一个在线的矢量编辑平台,通过绘制多边形功能…

豆包,攻克数字是个什么工具?《GKData-挖掘数据的无限可能》(数据爬虫采集工具)

豆包,攻克数字是个什么工具? “攻克数字” 指的是 “攻克数字(GKData)” 这样一款工具。是一款针对网页、APP中数据自动解析转表存入数据库的软件,为数据工作者而生。它是一个不会编程也能用的可视化数据解析为标准二…

【成都新篇】龙信科技电子取证实验室,引领科技取证新时代

文章关键词:电子数据取证实验室、手机取证、介质取证、云取证、现场勘查、电子物证 在科技创新的浪潮中,龙信科技成都实验室以其卓越的电子数据取证服务,成为了中西部地区一颗璀璨的明珠。随着新址的搬迁,我们不仅扩大了业务范围…

【C/C++】字符/字符串函数(1)——由string.h提供

零.导言 什么是字符/字符串函数呢? 其实就是一类用于处理字符和字符串的函数。 而其中一部分函数包含在头文件 string.h 中,有 strlen strcpy strcat strcmp strncpy strncat strncmp strstr strtok strerror 等等 接下来我将逐个讲解这些函数。 一.str…

硅谷甄选(11)角色管理

角色管理模块 10.1 角色管理模块静态搭建 还是熟悉的组件&#xff1a;el-card、el-table 、el-pagination、el-form <template><el-card><el-form :inline"true" class"form"><el-form-item label"职位搜索"><el-…

鸿蒙UI开发——基于全屏方案实现沉浸式界面

1、概 述 典型应用全屏窗口UI元素包括状态栏、应用界面和底部导航条。 其中状态栏和导航条&#xff0c;通常在沉浸式布局下称为避让区&#xff0c;避让区之外的区域称为安全区。 开发应用沉浸式效果主要指&#xff1a;通过调整状态栏、应用界面和导航条的显示效果来减少状态…

规划误差降低27%,碰撞率降低33%Senna: 大规模视觉-语言模型与端到端自动驾驶相结合

Abstract 端到端自动驾驶在大规模数据中展示了强大的规划能力&#xff0c;但在复杂、罕见的场景中仍然因常识有限而表现不佳。相比之下&#xff0c;大型视觉语言模型&#xff08;LVLMs&#xff09;在场景理解和推理方面表现出色。前进的方向在于融合两者的优势。以往利用LVLMs…

openpnp - 手工修改配置文件(元件高度,size,吸嘴)

文章目录 openpnp - 手工修改配置文件(元件高度,size,吸嘴)概述笔记parts.xmlpackages.xml 手工将已经存在的NT1,NT2拷贝出来改名备注END openpnp - 手工修改配置文件(元件高度,size,吸嘴) 概述 载入新板子贴片准备时&#xff0c;除了引入Named CSV文件&#xff0c;还要在ope…

硬件电子器件学习笔记

系列文章目录 文章目录 系列文章目录电阻碳质电阻器线绕电阻 变压器自耦变压器隔离变压器 电阻 碳质电阻器 CCR&#xff1a; 优点&#xff1a;体积大&#xff0c;吸收脉冲电流、防浪涌。缺点&#xff1a;温度系数、稳定性差、吸水后也会变化、随着使用会变化。 医用除颤仪可…

推荐一款射频与微波电路设计软件:Keysight Genesys

Keysight PathWave RF Synthesis Genesys是一款专为射频 (RF) 和微波电路设计与仿真而开发的软件解决方案&#xff0c;属于 Keysight Technologies 的 PathWave 软件平台。此平台为无线通信系统的设计、仿真和验证提供了全面的工具支持。Genesys 在电路设计方面具备高度专业性&…