使用Java堆外内存(自己管理内存)的一些方法

HugeCollections-OLD:使用高效堆外存储的 Java 巨大集合 SharedHashMap 已弃用 SharedHashMap 已重新设计并移至新 GitHub 项目下的 ChronicleMap SharedHashMap 的所有新开发都将在 ChronicleMap 项目上完成,旧的 ShareHashMap 代码将保留在这里,所有新的增强功能都将添加到 ChronicleMap 中。 如果您在生产中运行它并希望获得专业支持的代码,请参阅 巨大的收藏 使用高效堆外存储的 Java 巨大集合 HugeHashMap 支持并发访问非常大的堆外键/值对。 来自 HugeHashMapTest HugeConfig config = HugeConfig.DEFAULT.clone() .setSegments(128) .setSmallEntrySize(128) .setCapacity(cou 立即下载

背景

      使用Java的一大好处就是自动内存管理,程序员不用太关心内存的是否,JVM的Garbage Collector(GC)帮我们找到不被引用的垃圾对象并清除掉。但是有得必有失,我们也失去了自己管理内存的可能性。【个人观点:大多数程序员的内存管理水平都比不上JVM,虽然程序员可能更了解业务逻辑,知道某个对象已经死掉,可以回收。但是回收的内存什么时候应该compact,内存分配使用什么算法,这样不是简单的问题。所以如果不是逼不得已,最好的办法还是优化代码,优化JVM的GC参数】

      但是可能还是存在一些应用场景,如果能够自己管理内存的话,性能可能更优(或者说代码写得好的话可能更优)。比如一些非常简单的业务逻辑或者算法,需要使用大量内存,尤其是像Cache,会在内存里呆很久。但是如果放到堆里,那么会影响Full GC的Pause Time

问题

      但是Java的设计者并不允许我们这么做(可能设计者的理念是:一旦留了个后门,那么就会有各种“优化秘笈”,各种水平的程序员都会附庸风雅一番,结果导致更差的性能,然后就会得出结论:Java语言很差。这就像我们印象中的Firefox很慢,其实很大一部分原因可能是我们使用了憋足的插件,但是我们不会管那么多,我们只会把罪名归到Firefox身上)       

救星------ByteBuffer

      在NIO出现之前应该没有什么办法可以自己申请堆外内存,但是NIO为了高效,“不得不”提供了ByteBuffer。但是它还是把ByteBuffer纳入了管理的范畴,你没有办法显示“释放”ByteBuffer,就像你调用System.gc()不能保证调用GC一样,你只能祈祷上天保佑马上会有GC。不过如果不考虑JVM的移植和版本的升级,Sun的DirectBuffer接口提供了Cleaner对象(sun.misc.Cleaner)。这是有风险的,比如你不使用Sun或者OpenJDK,或者等到以后的某个JDK版本,这些方法可能木有了。我们使用的ByteBuffer.allocateDirect得到的就是DirectByteBuffer,它实现了DirectBuffer接口。

等等------问题还没解决

      给我一个ByteBuffer有什么用?我可以把它变成一个byte[]。那照样没有什么用,难道我必须这样修改代码?

class Person{
    long id;
    int age;
    boolean gender;

    public int getAge(){
       return age;
    }
    public void setAge(int age){
       this.age=age;
    }
    .....
}

class PersonWrapper{
    ByteBuffer buf;

    public int getAge(){//假设我们的内存布局是上面的顺序
        return buf.getInt(8);
    }
    public PersonWrapper(){
        buf=ByteBuffer.allocateDirect(13);
    }

    public free(){
        ((DirectBuffer) buffer).cleaner().clean();
    }
}

     这样的代码看起来很像c的malloc和free,但是尽量别这么用。这里有个问题就是我们只能使用原始类型,如果你使用了对象,那么还是在Heap里由GC管理。

     如果你真的这么写Java代码那么我建议你直接使用C/C++。我们使用Java很大一部分是使用Java的类库,包括JRE里语言规定的和各种第三方的。我们的代码需要使用它们提供的对象。我们需要传递参数给它,这些参数可能就是对象,返回值也是。

     当然如果你从头开始必须用Java实现一个基础模块,它不需要使用任何其它对象,那么也许你可以考虑这种方法。这种方法的对象回收有两种方式,一种就是显示调用free方法,像我们写c一样,另外就是不管它,等PersonWrapper被回收的适合,buf也自动变成垃圾了。但正如GC的不确定性,可能等到GC再回收的话,可能Heap+DirectMemory把内存都用爆了,甚至连JVM都没有内存做GC!!

      我们可能更喜欢使用Java的对象编码(虽然使用Wrapper的方法可能更节省空间),字节数组实在太难用了。解决这个问题有下面两种方法:

序列化/反序列化

      对于Cache这样的应用,我们可以把它存到堆外,写的时候把对象序列化成byte[],保存至DirectBuffer,使用时把byte[] 反序列化回来。这个方法的缺点是序列化和反序列化会消耗CPU,另外如果对象很大的话,使用时反序列化出来的对象还是会占用Heap空间。

      这种方法可以参考或者使用http://incubator.apache.org/directmemory/  这是一个Apache的孵化项目,使用风险自负,呵呵。

      淘宝的一些测试:http://rdc.taobao.com/team/jm/archives/1539

字节码修改

      和前面的wrapper类似,不过提供更友好的方式,自己少些那么多代码,不用记住某个字段的指针偏移。

      参考项目:https://code.google.com/p/vanilla-java/wiki/HugeCollections

      缺点,和wrapper一样,只能使用原生类型,如果使用对象,那么这个对象还是在堆里。因为我们不可能写所有的代码,比如要使用别人写好的对象。

      可能的解决办法和序列化类似,把需要用的对象拷贝到ByteBuffer,就像C++的拷贝构造函数,而不是传递指针或者引用。

有没有更好的解决办法?

      或许有,比如想淘宝他们自己修改定制JVM,当然这就完全修改了Java的语法,或者不能叫Java语言了。

      有兴趣的可以看看http://www.infoq.com/cn/presentations/ms-jvm-taobao 作者的博客:http://rednaxelafx.iteye.com/

结论 
      在某些特殊场景(比如没有任何办法能够优化GC的Pause Time了,老大还不让加机器,呵呵),而且业务相对简单,那么也许可以尝试一下。
从零开始学习信号完整性(SIPI)--1 简介 信号完整性就是研究如何让驱动芯片发出的信号经过传输通道被接收芯片正确接收的学问。 信号完整性包含了三个要素: 信号:是被传输的主体,我们首先要了解、熟悉信号的特性。 芯片:分为驱动芯片和接收芯片,信号完整性工程师就是要实现信号在驱动芯片和接收芯片之间的正确传输。 传输通道:是传输信号的介质,是信号所走的“路”。如何实现信号的正确传输呢?那就要信号完整性工程师为信号“修路”、“搭桥”。 阅读详情

相关推荐

手把手教你离线部署Jupyter Notebook及高效插件配置

本文详细介绍了如何在离线环境中部署Jupyter Notebook及配置高效插件,包括离线安装步骤、依赖管理、核心扩展安装及常见问题排查。特别针对金融、科研等封闭网络场景,提供完整的whls包和requirements.txt解决方案,帮助开发者和数据分析师突破网络限制,提升工作效率。

weixin_28839549的博客 583

Java 堆外内存管理

目录 1.什么是堆外内存? 2.堆外内存有什么优势? 3.堆外内存的使用 3.1堆外内存的设置 3.2堆外内存的创建 3.3堆外内存的回收 3.3.1自动回收 3.3.2手动回收 1.什么是堆外内存? 堆外内存和堆内内存是两个相对的概念,其中堆内内存(on-heap memory)是我们平常工作中接触比较多的。Java中分配的非空对象都是由Java虚拟机的垃圾收集器管理的,都是...

时光钟摆 1327

TMS320F280049C 学习笔记4 Led_ex1_blinky 初始化函数及系统时钟

承接上一篇学习笔记,这次开始实际运行例程。本文概述了280049C的第一个实验 Led灯闪烁。同时也总结了系统的初始化函数和时钟配置。

whyorwhnt的专栏 7029

Java 堆内存优化

Java堆的唯一目的就是创建实例对象,几乎所有的对象都在堆上分配内存,如果堆空间分配内存出现问题可见是非常严重的。当Java 堆内存出现问题时,我们应该怎么去优化呢?在学习堆内存优化之前,我们要先了解一下有关堆内存优化的参数。堆在实现时,既可以实现成固定大小的,也可以是可扩展的,当前主流的虚拟机都是按照可扩展来实现的(通过-Xmx和-Xms控制)。     在这里通过程序测试一下:public c

点滴记录 1595

手把手教你在Keil/IAR中移植SEGGER_RTT组件(避坑指南+性能对比)

本文详细介绍了在Keil/IAR开发环境中移植SEGGER RTT调试组件的完整流程与优化技巧。通过对比传统串口调试,SEGGER RTT凭借零硬件占用、高速传输和双向交互等优势,显著提升嵌入式开发效率。文章包含配置步骤、性能调优方案及常见问题解决方案,是嵌入式开发者必备的实用指南。

y7z8a的博客 242

Win10系统VS2019+Cmake+qhull_8.0.0环境配置

1 qhull 1.1 简要介绍 qhull是一个强大的计算几何库,可以用于计算高维的convex hull, Delaunay triangulation, Voronoi diagram等。 1.2 依赖库 qhull不依赖其他库。 1.3 源码包下载 qhull源码地址:github:https://github.com/qhull/qhull.git 2 Cmake构建项目 2.1 路径 源代码路径:D:/ThirdParty/qhull/qhull_8.0.0构建项目路径:D:/Thi.

wangchenxue的博客 2489

选择您的收藏库

这真的是您应该烦恼的吗? java.util.ArrayList和java.util.HashMap从根本上有问题吗? 对于大多数源代码,答案是–不; 这些实现完全可以。 但是,一如既往,细节决定成败。 并存在情况下,当是内置到功能设置集合API不够充分,或者您找到标准的集合设置成开销太高了您的喜好。 在过去的几年中,我们不断地发现了同样的问题。 并且认为分享经验会很好–希望它可以...

最佳 Java 编程 129

士兰微SC7A20H三轴加速度计在智能穿戴设备中的运动检测实践

本文详细介绍了士兰微SC7A20H三轴加速度计在智能穿戴设备中的运动检测实践,包括其工作原理、硬件设计避坑指南、运动检测算法优化、低功耗设计及校准测试技巧。SC7A20H凭借±16g超宽量程和0.004g高精度,成为智能穿戴设备的运动感知核心,适用于计步、6D方向检测等场景,显著提升用户体验。

weixin_29168153的博客 735

Java堆外内存的使用

最近经常有人问我在Java中使用堆外(off heap)内存的好处与用途何在。我想其他面临几样选择的人应该也会对这个答案感兴趣吧。 堆外内存其实并无特别之处。线程栈,应用程序代码,NIO缓存用的都是堆外内存。事实上在C或者C++中,你只能使用未托管内存,因为它们默认是没有托管堆(managed heap)的。在Java中使用托管内存或者“堆”内存是这门语言的一个特性。注意:Java并非唯一这

来啊 快活啊 7863

word多级列表为什么会变成黑块解决思路

今天在写文档时,发现WORD5级的标题都变黑块了,找了度娘的资料,终于解决了。 第一种 1、光标bai放在黑快的右边,按向左的箭头,然后ctrl+shift+s,点击重新应用。 2、点击“定义新的多级列表”(不知道从哪儿找这个按钮的百度下),直接点确定。 3、这里很重要!!!不要直接保存,而是直接关掉word,会提示保存还是不保存,这个地方再点击保存。 第二种 Word2016 使用宏代码修复方法 1.找到视图-宏,打开 查看宏 2.创建宏 3.贴...

霍力强的专栏 8580

单稳态触发器Multisim电路仿真——硬件工程师笔记

本文系统介绍了单稳态触发器的基础知识及其实现方式。主要内容包括:1)单稳态触发器的工作原理、电路结构、特点及应用;2)555定时器实现单稳态触发器的配置及工作过程;3)使用反相器和与非门实现积分型和微分型单稳态触发器的电路结构及工作原理。文章详细阐述了各种实现方式的特性、应用场景及设计考虑,为硬件工程师提供了实用的电路设计参考。最后还附有相关笔试面试题链接,便于读者进一步学习扩展。

XU157303764的博客 1875

java 堆外内存是什么意思_Java堆外内存之二:堆外内存使用总结

目录:有时候对内存进行大对象的读写,会引起JVM长时间的停顿,有时候则是希望最大程度地提高JVM的效率,我们需要自己来管理内存(看起来很像是Java像C++祖宗的妥协吧)。据我所知,很多缓存框架都会使用它,比如我以前使用过的EhCache(给它包装了个酷一点的名字,叫BigMemory),以及现在项目中的Memcached等。使用堆外内存,就是为了能直接分配和释放内存,提高效率。JDK5.0之后,...

weixin_29847829的博客 498

【SAP ME 3】JAVA 调用SAP PO WebService

Java调用SAP PO/PI WebService接口

探索 Java 编程的技巧、最佳实践和解决方案。本博客提供针对 Java 开发者的实用指南,涵盖从基础到高级话题,旨在提升编程效率和技能。 847

JVM——堆外内存详解

从这里看原文: JVM——堆外内存详解 内存是好东西,我们常听堆内存,很多人却不知道还有一个堆外内存。 那这两个都是个啥玩意呢?且让本帅博主今天给你好好说道说道。 一、堆内内存 那什么东西是堆内存呢?我们来看看官方的说法。 “Java 虚拟机具有一个堆(Heap),堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。” 也就是说,平常我们老遇见的那位,JVM启动时分配的,就叫作堆内存(即堆内内存)。 对象的堆内存由称为垃圾回收器的自动内存管理系统回收。 此外,

积累与备忘 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java中使用堆外内存,关于内存回收需要注意的事和没有解决的遗留问题(等大神解答)

JVM可以使用的内存分外2种:堆内存和堆外内存,堆内存完全由JVM负责分配和释放,如果程序没有缺陷代码导致内存泄露,那么就不会遇到java.lang.OutOfMemoryError这个错误。使用堆外内存,就是为了能直接分配和释放内存,提高效率。JDK5.0之后,代码中能直接操作本地内存的方式有2种:使用未公开的Unsafe和NIO包下ByteBuffer。C语言的内存分配和释放函数malloc/free,必须要一一对应,否则就会出现内存泄露或者是野指针的非法访问。java中我们需要手动释放获取的堆外内存吗

aty 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

java 堆外内存_Java堆外内存之二:堆外内存使用总结

目录:有时候对内存进行大对象的读写,会引起JVM长时间的停顿,有时候则是希望最大程度地提高JVM的效率,我们需要自己来管理内存(看起来很像是Java像C++祖宗的妥协吧)。据我所知,很多缓存框架都会使用它,比如我以前使用过的EhCache(给它包装了个酷一点的名字,叫BigMemory),以及现在项目中的Memcached等。使用堆外内存,就是为了能直接分配和释放内存,提高效率。JDK5.0之后,...

weixin_39703773的博客 337

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

一文搞懂堆外内存(模拟内存泄漏)

平时编程时,在Java中创建对象,实际上是在堆上划分了一块区域,这个区域叫堆内内存。使用这-Xms -Xmx来指定新生代和老年代空间大小的初始值和最大值,这初始值和最大值也被称为 Java堆的大小,即堆内内存大小。这个堆内内存完全受 JVM管理,JVM有垃圾回收机制,所以我们一般不必关系对象的内存如何回收。剖开JVM内存模型,来看下其堆划分:由图可知Java8使用元空间替代永久代且元空间放在堆外内存上,这是为啥?类的元数据信息常用到,在GC时回收效率偏低。类的元数据信息。

jcc4261的博客 766

堆外内存的介绍及释放

热爱美好的事物,是一种追求 介绍 ____堆外内存意味着把内存对象分配在 Java 虚拟机的堆以外的内存,这些内存直接受操作系统管理(而不是虚拟机), 作用:能缩短垃圾回收时间 ​ 适合生命期中等或较长的对象 特点: 对于大内存有良好的伸缩性,可以自行扩展 对垃圾回收停顿的改善可以明显感觉到,不影响用户线程 在进程间可以共享,减少虚拟机间的复制 如果使用的多,那么你可能会考虑硬盘的速度会有影响 堆外内存的回收 堆外内存的分配很简单,比如如下 ByteBuffer buffer = ByteBuffer

洛雪 1907

Java中的堆外内存具体是怎么实现的

当没有任何引用指向堆外内存时,GC会清理与堆外内存相关联的Cleaner对象,进而释放内存。使用ByteBuffer.allocateDirect()方法,Java的ByteBuffer类提供了allocateDirect()方法,用于在堆外内存中分配内存。由于堆外内存直接操作系统内存,因此它可以避免Java堆内存的限制,并且可以提高内存分配和访问的性能。在使用完堆外内存后,可以通过调用ByteBuffer的clear()或compact()方法来重置缓冲区,但这并不会释放内存。

怀揣梦想,一颗执着于技术的心从未磨灭,内心住着一颗顽强的小强时刻提醒自己层层突破自我,同时也成就他人 591

Java堆外内存之突破JVM枷锁

对于有Java开发经验的朋友都知道,Java中不需要手动的申请和释放内存,JVM会自动进行垃圾回收;而使用的内存是由JVM控制的。 那么,什么时机会进行垃圾回收,如何避免过度频繁的垃圾回收?如果JVM给的内存不够用,怎么办? 此时,堆外内存登场!利用堆外内存,不仅可以随意操控内存,还能提高网络交互的速度。 背景1:JVM内存的分配   对于JVM的内存规则,应该是老生常谈的东西了,这里我就简单的说下:   新生代:一般来说新创建的对象都分配在这里。   年老代:经过几次垃圾回收,新生代的对象.

Java_may的博客 158

java allocatememory_Java堆外内存之四:直接使用Unsafe类操作堆外内存

在nio以前,是没有光明正大的做法的,有一个work around的办法是直接访问Unsafe类。如果你使用Eclipse,默认是不允许访问sun.misc下面的类的,你需要稍微修改一下,给Type Access Rules里面添加一条所有类都可以访问的规则:在使用Unsafe类的时候:Unsafe f = Unsafe.getUnsafe();发现还是被拒绝了,抛出异常:java.lang.Se...

weixin_42316933的博客 1711

java visualvm远程监控_如何监控和诊断堆外内存使用

如何监控和诊断堆外内存使用可以使用综合性的图形化工具,如 JConsole、VisualVM ,这些工具比较直观,直接连接到 Java 进程,图形化界面。可以使用命令工具进行查询,如 jstat 和jmap 工具,查看堆、方法区等使用数据。使用 jmap 提供的命令, 生产 Heap Dump 文件,然后利用 Jhat 和 Eclipse MAT 进行分析。GC 日志输出,也能包含很多有用的信息。...

weixin_39796533的博客 812

jvm 堆外内存_如何监控和诊断堆外内存使用

如何监控和诊断堆外内存使用可以使用综合性的图形化工具,如 JConsole、VisualVM ,这些工具比较直观,直接连接到 Java 进程,图形化界面。可以使用命令工具进行查询,如 jstat 和jmap 工具,查看堆、方法区等使用数据。使用 jmap 提供的命令, 生产 Heap Dump 文件,然后利用 Jhat 和 Eclipse MAT 进行分析。GC 日志输出,也能包含很多有...

weixin_39592315的博客 875

使用堆外内存

使用堆外内存 有时候对内存进行大对象的读写,会引起JVM长时间的停顿,有时候则是希望最大程度地提高JVM的效率,我们需要自己来管理内存(看起来很像是Java像C++祖宗的妥协吧)。据我所知,很多缓存框架都会使用它,比如我以前使用过的EhCache(给它包装了个酷一点的名字,叫BigMemory),以及现在项目中的Memcached。在nio以前,是没有光明正大的做法的,有一个wo

lantian0802的专栏 1259

Java堆外内存之二:堆外内存使用总结

目录: 《堆外内存操作类ByteBuffer》 《DirectBuffer》 《Unsafe(java可直接操作内存(),挂起与恢复,CAS操作)》     有时候对内存进行大对象的读写,会引起JVM长时间的停顿,有时候则是希望最大程度地提高JVM的效率,我们需要自己来管理内存(看起来很像是Java像C++祖宗的妥协吧)。据我所知,很多缓存框架都会使用它,比如我以前使用过的EhCache...

weixin_33889245的博客 348

什么是堆内内存和堆外内存?

虽然第3种情况的ObjectInHeap存在内存泄露,但是这个类的设计是合理的,它很好的封装了直接内存,这个类的调用者感受不到直接内存的存在。这是因为ObjectInHeap对象是在堆内存中分配的,当该对象被垃圾回收的时候,并不会释放堆外内存,因为使用Unsafe获取的堆外内存,必须由程序显示的释放,JVM不会帮助我们做这件事情。java中我们需要手动释放获取的堆外内存吗?也即是说,使用ByteBuffer不用担心堆外内存的释放问题,除非堆内存中的 ByteBuffer对象由于错误编码而出现内存泄露。

Dc253061007的博客 263
上一篇: Linux的swappiness的配置
下一篇: pgAdmin在打开查询构造工具(Query Builder)时死掉的解决办法
fancyerII
博客等级 码龄23年 48粉丝 164原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值