jjzjj

unsafe_erase

全部标签

java - 为什么 JNI 调用本地方法比 sun.misc.Unsafe 中的类似方法慢?

我正在开发一个类似于sun.misc.Unsafe但具有扩展内存管理的JNI实现。为什么来自sun.misc.Unsafe和我开发的库的本地方法的调用时间截然不同?一些数字:sun.misc.Unsafe.getInt(address)需要~1ns当我的类似方法需要~10ns两种实现方式大体相同,都沿用了OpenJDK的源码,只是通过指针返回变量。两者的注册方式相同。如何加速JNI调用?是什么让不安全性能如此特别?谢谢,尤里/ 最佳答案 如果您在Unsafe类中寻找native方法的来源,您会发现它不使用JNI实现。相反,不安全的方

java - 为什么 sun.misc.Unsafe 存在,如何在现实世界中使用它?

前几天我遇到了sun.misc.Unsafe包,并对它的功能感到惊讶。当然,这个类没有记录,但我想知道是否有充分的理由使用它。您可能会在哪些情况下需要使用它?在现实场景中如何使用它?此外,如果您确实需要它,这是否表明您的设计可能有问题?为什么Java甚至包含这个类? 最佳答案 例子虚拟机“内在化”。即CAS(Compare-And-Swap)用于Lock-FreeHashTables例如:sun.misc.Unsafe.compareAndSwapInt它可以对包含CAS特殊指令的native代码进行真正的JNI调用在这里阅读更多关

导致虚拟机故障的 Java 映射/nio/NFS 问题 : "a fault occurred in a recent unsafe memory access operation in compiled Java code"

我已经为特定的二进制格式(nfdump如果有人感兴趣)编写了一个解析器类,它使用了java.nio的MappedByteBuffer。读取每个几GB的文件。二进制格式只是一系列header和大部分固定大小的二进制记录,通过调用nextRecord()将其馈送到被调用方,nextRecord()会推送状态机,完成后返回null。它表现良好。它在开发机器上运行。在我的生产主机上,它可以运行几分钟或几小时,但似乎总是抛出“java.lang.InternalError:afaultoccurredinarecentunsafememoryaccessoperationincompiledJa

java - 我可以用 sun.misc.Unsafe 覆盖对象吗?

如果一个对象是同一类的实例,它们的大小相同,我可以使用sun.misc.Unsafe覆盖另一个对象吗?编辑:“覆盖”是指“删除”第一个对象,用第二个对象填充内存。可能吗? 最佳答案 By"override"Imeanto"delete"firstobject,anttofillthememorywiththesecondone.Isitpossible?是也不是。是-如果您使用Unsafe分配一些内存并写入long,然后在其中写入另一个long(例如),那么是的,您已经删除了第一个对象并用第二个对象填充了内存。这类似于您可以使用By

java - 为什么 XX :MaxDirectMemorySize can't limit Unsafe. 分配内存?

下面的代码将分配大量直接内存但不会导致java.lang.OutOfMemoryError:Directbuffermemory://JVMargs:-Xms10m-Xmx10m-XX:MaxDirectMemorySize=10mpublicclassDirectMemoryOOM{publicstaticvoidmain(String[]args)throwsNoSuchFieldException,IllegalAccessException{Fieldf=Unsafe.class.getDeclaredFields()[0];f.setAccessible(true);Unsa

c++ - Erase-remove 习语 : what happens when remove return past-the-end-iterator?

我在阅读ScottMeyers的erase-removeidiom(第32项)时遇到了这个问题"EffectiveSTL”书。vectorv;...v.erase(remove(v.begin(),v.end(),99),v.end());remove基本上返回“新逻辑结束”和原始范围的元素,这些元素从范围的“新逻辑结束”开始并继续直到范围的真正结束是要删除的元素从容器中删除。听起来不错。现在,让我问我的问题:在上面的例子中,如果vectorv中没有找到99,remove可以返回v.end()。它基本上是将past-the-end-iterator传递给erase方法。当past-th

c++ - std::remove_if 和 erase 不从 std::vector 中移除元素

我正在练习leetcodeeasy问题。我想使用lambda从vector中删除_if(这是第一次,太棒了)。我得到一个指向new_end的负指针。#include#include#include#include//std::greaterusingnamespacestd;intmain(){vectora={2,7,11,15};inttarget=9;autonew_end=std::remove_if(a.begin(),a.end(),[&a,target](constintx){returnstd::count(a.begin(),a.end(),x)>target;});

c++ - 缩短字符串时 std::string::resize 和 std::string::erase 之间的区别

当缩短std::string时,基本上有两种可能性:string.resize(length)或string.erase(length).既然我们知道字符串会变小,那两者有什么区别呢? 最佳答案 resize必须检查length>current或length-它的行为取决于比较的结果。erase总是减少字符串的长度在异常安全方面存在差异:resize:强保证:如果抛出异常,则字符串没有变化。(来自here)erase:C++98-等于resize;C++14-函数没有抛出版本(来自here)

git clone失败无错误信息或报penSSL/3.1.1: error:0A000152:SSL routines::unsafe legacy renegotiation disabled

问题出现前景:新笔记本win11系统安装gitclone无任何反应也没有报错信息,尝试各种方式无果,在升级最新版本git拉代码时会报gitclone报OpenSSL/3.1.1:error:0A000152:SSLroutines::unsafelegacyrenegotiationdisabled,也是尝试各种方式无果,解决方法:怀疑是win11系统兼容git的问题,尝试着换了git最稳定版本Git-2.30.2-64-bit:后竟解决折磨我两天的兼容问题。使用win11安装git亲测不能用太旧或最新版本的包,已将这个版本的git安装包上传我的资源,希望可以帮助出现相同问题的人。Git-2.

c++ - 我的 g++ 使用 vector<weak_ptr> erase() 方法生成奇怪的警告

我有以下C++代码:#include#include#include#includevoiderase_from_vector(std::vector>&mvec){for(automvec_it=mvec.begin();mvec_it!=mvec.end();)mvec_it=mvec.erase(mvec_it);}intmain(void){#if0std::vector>mvec;for(automvec_it=mvec.begin();mvec_it!=mvec.end();)mvec_it=mvec.erase(mvec_it);#endif}当我这样编译时,GCC会生成