java能够经过java.nio.ByteBuffer.allocateDirect(capacity)直接运用non java heap(java堆外)的内存 。

一.运用意图:

1。拓荒数据缓冲区

2。能够打破jvm内存约束,操作更多的物理内存(不一样的jvm完成不一样,sun jvm会被约束,但能添加jvm能够操作的一倍内存,而jrockit基本上能够将物理内存悉数耗光)

二.运用难题:

经过ByteBuffer.allocateDirect()运用的内存不能够经过jvm关联内存东西:VisualVM等检查heap的内存占用,所以内存走漏也较难查找。

三. 测验如下:

Java代码

 

public class ByteBufferTest {

public static void main(String[] args) throws InterruptedException {

System.out.println(SystemRuntimeInfo.getMemoryInfo());

List list = new ArrayList();

for(int i = 0; i

list.add(ByteBuffer.allocateDirect(Integer.MAX_VALUE / 100));

System.out.println(i + " " + SystemRuntimeInfo.getMemoryInfo()); // 个人写的内存占用东西类

}

System.out.println("start sleep,list.size() 唐山票​:"+list.size());

Thread.sleep(100000);

System.out.println(list.size());

// java.nio.ByteBuffer.allocate(capacity) 运用 java heap(java堆)分配内存: 能够直接经过东西检查出内存占用

// java.nio.ByteBuffer.allocateDirect(capacity) 运用non java heap(非java堆)经过操作系统直接分配内存: 会招致检查不出java heap的内存占用,招致走漏看不出来

}

}

打印成果:

Java代码

 

----------------------

totalHeapMemory:15MB  freeHeapMemory:14MB  maxHeapMemory:247MB totalPhysicalMemorySize:2047MB freePhysicalMemorySize:1285MB usedPhysicalMemory:762MB

0 totalHeapMemory:15MB  freeHeapMemory:14MB  maxHeapMemory:247MB totalPhysicalMemorySize:2047MB freePhysicalMemorySize:1264MB usedPhysicalMemory:783MB

1 totalHeapMemory:15MB  freeHeapMemory:14MB  maxHeapMemory:247MB totalPhysicalMemorySize:2047MB freePhysicalMemorySize:1244MB usedPhysicalMemory:803MB

2 totalHeapMemory:15MB  freeHeapMemory:14MB  maxHeapMemory:247MB totalPhysicalMemorySize:2047MB freePhysicalMemorySize:1223MB usedPhysicalMemory:824MB

3 totalHeapMemory:15MB  freeHeapMemory:14MB  maxHeapMemory:247MB totalPhysicalMemorySize:2047MB freePhysicalMemorySize:1203MB usedPhysicalMemory:844MB

4 totalHeapMemory:15MB  freeHeapMemory:14MB  maxHeapMemory:247MB totalPhysicalMemorySize:2047MB freePhysicalMemorySize:1182MB usedPhysicalMemory:865MB

5 totalHeapMemory:15MB  freeHeapMemory:14MB  maxHeapMemory:247MB totalPhysicalMemorySize:2047MB freePhysicalMemorySize:1162MB usedPhysicalMemory:885MB

6 totalHeapMemory:15MB  freeHeapMemory:14MB  maxHeapMemory:247MB totalPhysicalMemorySize:2047MB freePhysicalMemorySize:1141MB usedPhysicalMemory:906MB

7 totalHeapMemory:15MB  freeHeapMemory:14MB  maxHeapMemory:247MB totalPhysicalMemorySize:2047MB freePhysicalMemorySize:1121MB usedPhysicalMemory:926MB

8 totalHeapMemory:15MB  freeHeapMemory:14MB  maxHeapMemory:247MB totalPhysicalMemorySize:2047MB freePhysicalMemorySize:1100MB usedPhysicalMemory:947MB

9 totalHeapMemory:15MB  freeHeapMemory:14MB  maxHeapMemory:247MB totalPhysicalMemorySize:2047MB freePhysicalMemorySize:1079MB usedPhysicalMemory:968MB

VisualVM内存检查:

Heap内存分配

实践java进程内存占用:

经过VisualVM能够发现,java heap底子没有运用,但java进程的物理内存现已运用400MB+

四.测验定论:

1. 运用ByteBuffer.allocateDirect()分配出去的内存无法经过Heap检查

2. ByteBuffer.allocateDirect()分配的内容能够被GC收回,但走漏的话较难查找

java byte 释放内存_java java.nio.ByteBuffer.allocateDirect 导致内存泄露相关推荐

  1. Classloader、NIO ByteBuffer.allocateDirect的回收 、一致性Hash

    比较多的东西,写的比较杂乱,以后会写一些自己复习到的内容,或者新学习到的东西,尽量让自己写的东西有价值,对一天学习的内容有一个总结. 一.Classloader 1.过程 1)加载:查找并加载类的二进 ...

  2. java 数据保存内存_java中的各种数据类型在内存中存储的方式 一

    1.java是如何管理内存的 java的内存管理就是对象的分配和释放问题.(其中包括两部分) 分配:内存的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对 ...

  3. java byte转文件大小_java上传文件大小转换(字节转kb/mb/gb)

    /** * 字节转kb/mb/gb * @param size * @return */ public String getPrintSize(long size) { //如果字节数少于1024,则 ...

  4. java非堆内存_java – 监视JVM的非堆内存使用情况

    我们通常处理OutOfMemoryError问题,因为堆或permgen大小配置问题. 但是所有的JVM内存不是permgen或者heap. 据我所知,它也可以与Threads / Stacks,本地 ...

  5. java 抛出空指针_java - Java ServerSocket抛出空指针异常 - 堆栈内存溢出

    我正在尝试通过Android中的Java套接字实现文件传输. 它工作正常,但当我关闭应用程序时,它崩溃,控制台显示nullPointerException. 我已经尝试了一切,但无法找到问题! 我已经 ...

  6. java byte 字面量_Java中的字面量

    在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(natation).几乎所有计算机编程语言都具有对基本值的字面量表示,诸如:整数.浮点数以及字符串:而有很多也对布尔类型和 ...

  7. java 字符串 内存_java – 字符串文字和永久生成内存区域

    当我们说实际的字符串存储在永久生成区域中时,同样适用于字符串文字?或者只是被inter()所拘留的字符串? 实际上,博客文章通常表示,字符串池包含对字符串对象的引用,而实际的字符串对象是堆中的某个位置 ...

  8. java byte 赋值 原码,Java基础第二天学习笔记

    02.01_Java语言基础(常量的概述和使用)(掌握) * A:什么是常量 * 在程序执行的过程中其值不可以发生改变 * B:Java中常量的分类 * 字面值常量 * 自定义常量(面向对象部分讲) ...

  9. linux中非法内存,Linux下数组非法访问导致内存破坏 —— 引发segmentation fault的原因...

    2012-02-05 wcdj 1, 调试时必需的栈知识 2, 数组非法访问导致内存破坏 调试时必需的栈知识 栈(stack)是程序存放数据的内存区域之一,其特征是LIFO(Last In First ...

最新文章

  1. RabbitMQ 入门系列(11)— RabbitMQ 常用的工作模式(simple模式、work模式、publish/subscribe模式、routing模式、topic模式)
  2. Android adb.exe程序启动不起来处理方法
  3. Java 单测 回滚
  4. VCHECK(每日报告)
  5. 开课吧Java课堂:如何运用equals( )和 equalsIgnoreCase( )
  6. activiti 解压zip java.lang.IllegalArgumentException: MALFORMED 错误
  7. ElasticSearch - 聚合 aggs
  8. 让ProgressPar动起来
  9. Timesten安装
  10. ADC参数中的SNR、SNDR与SFDR的区别是什么
  11. Android ActivityManager类
  12. 小猫钓鱼纸牌游戏java_C语言实现纸牌游戏(小猫钓鱼)
  13. 瑞利-贝纳尔对流(Rayleigh–Bénard convection)
  14. mysql分组取最新
  15. 逻辑智力测试-----让你怀疑人生!!
  16. ntfs格式分区是什么意思
  17. 【蓝桥杯每日一练:北斗七星数】
  18. simulink他励直流电动机降压调速仿真
  19. 四位数码管IIC-TM1637
  20. HTTP Cache(缓存)

热门文章

  1. 谈谈过去十五年身处教师家庭是什么感受
  2. PS6套索工具组(抠图强化),PS7快速选择和魔棒(快速抠图)
  3. dell服务器论坛(dell论坛网址)
  4. mysql 1118_MySQL ERROR1118报错详解 Row size too large
  5. 视频直播APP开发解决方案
  6. DELL INSPIRON 1501键盘响应速度慢及最终解决
  7. 你若在患难之日胆怯,你的力量便微小
  8. window10 Qt 中使用boost库
  9. 用Delphi实现动态代理(2):设计说明
  10. Revit二次开发-【EG01】构件工程量提取