java byte 释放内存_java java.nio.ByteBuffer.allocateDirect 导致内存泄露
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 导致内存泄露相关推荐
- Classloader、NIO ByteBuffer.allocateDirect的回收 、一致性Hash
比较多的东西,写的比较杂乱,以后会写一些自己复习到的内容,或者新学习到的东西,尽量让自己写的东西有价值,对一天学习的内容有一个总结. 一.Classloader 1.过程 1)加载:查找并加载类的二进 ...
- java 数据保存内存_java中的各种数据类型在内存中存储的方式 一
1.java是如何管理内存的 java的内存管理就是对象的分配和释放问题.(其中包括两部分) 分配:内存的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对 ...
- java byte转文件大小_java上传文件大小转换(字节转kb/mb/gb)
/** * 字节转kb/mb/gb * @param size * @return */ public String getPrintSize(long size) { //如果字节数少于1024,则 ...
- java非堆内存_java – 监视JVM的非堆内存使用情况
我们通常处理OutOfMemoryError问题,因为堆或permgen大小配置问题. 但是所有的JVM内存不是permgen或者heap. 据我所知,它也可以与Threads / Stacks,本地 ...
- java 抛出空指针_java - Java ServerSocket抛出空指针异常 - 堆栈内存溢出
我正在尝试通过Android中的Java套接字实现文件传输. 它工作正常,但当我关闭应用程序时,它崩溃,控制台显示nullPointerException. 我已经尝试了一切,但无法找到问题! 我已经 ...
- java byte 字面量_Java中的字面量
在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(natation).几乎所有计算机编程语言都具有对基本值的字面量表示,诸如:整数.浮点数以及字符串:而有很多也对布尔类型和 ...
- java 字符串 内存_java – 字符串文字和永久生成内存区域
当我们说实际的字符串存储在永久生成区域中时,同样适用于字符串文字?或者只是被inter()所拘留的字符串? 实际上,博客文章通常表示,字符串池包含对字符串对象的引用,而实际的字符串对象是堆中的某个位置 ...
- java byte 赋值 原码,Java基础第二天学习笔记
02.01_Java语言基础(常量的概述和使用)(掌握) * A:什么是常量 * 在程序执行的过程中其值不可以发生改变 * B:Java中常量的分类 * 字面值常量 * 自定义常量(面向对象部分讲) ...
- linux中非法内存,Linux下数组非法访问导致内存破坏 —— 引发segmentation fault的原因...
2012-02-05 wcdj 1, 调试时必需的栈知识 2, 数组非法访问导致内存破坏 调试时必需的栈知识 栈(stack)是程序存放数据的内存区域之一,其特征是LIFO(Last In First ...
最新文章
- RabbitMQ 入门系列(11)— RabbitMQ 常用的工作模式(simple模式、work模式、publish/subscribe模式、routing模式、topic模式)
- Android adb.exe程序启动不起来处理方法
- Java 单测 回滚
- VCHECK(每日报告)
- 开课吧Java课堂:如何运用equals( )和 equalsIgnoreCase( )
- activiti 解压zip java.lang.IllegalArgumentException: MALFORMED 错误
- ElasticSearch - 聚合 aggs
- 让ProgressPar动起来
- Timesten安装
- ADC参数中的SNR、SNDR与SFDR的区别是什么
- Android ActivityManager类
- 小猫钓鱼纸牌游戏java_C语言实现纸牌游戏(小猫钓鱼)
- 瑞利-贝纳尔对流(Rayleigh–Bénard convection)
- mysql分组取最新
- 逻辑智力测试-----让你怀疑人生!!
- ntfs格式分区是什么意思
- 【蓝桥杯每日一练:北斗七星数】
- simulink他励直流电动机降压调速仿真
- 四位数码管IIC-TM1637
- HTTP Cache(缓存)