- 浏览: 466217 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
ty1972873004:
sunwang810812 写道我运行了这个例子,怎么结果是这 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
lgh1992314:
simpleDean 写道请问,Logger.setLevel ...
Java内置Logger详解 -
sunwang810812:
我运行了这个例子,怎么结果是这样的:2号车泊车6号车泊车5号车 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
jp260715007:
nanjiwubing123 写道参考你的用法,用如下方式实现 ...
面试题--三个线程循环打印ABC10次的几种解决方法 -
cb_0312:
SurnameDictionary文章我没看完,现在懂了
中文排序
在Hotspot JVM上,我们能够直接对内存进行读写操作。该类的allocateMemory方法用于申请分配内存,putAddress和getAddress方法用于对直接内存进行读写。
本文将通过sun.misc.Unsafe给出一个直接读写内存的例子。
注意:这只是一个例子,只是用来验证通过sun.misc.Unsafe来实现直接读写内存的可能性。但是,这样做并没有安全保证,而且稍微有点疏忽将可能导致JVM崩溃。
Unsafe类的三个方法:allocateMemory,putAddress和getAddress如下:
1. long allocateMemory(long bytes)
申请分配内存
2. long getAddress(long address) 和void putAddress(long address, long x)
对直接内存进行读写。
因为Unsafe这个类的访问是受限的,只有rt.jar中的类才能使用Unsafe的功能,它的构造方法是私有的,所以,我们不能通过new来创建实例。但是,可以通过反射的方法来获取Unsafe实例。
下面就是一个直接访问内存的一个例子:
输出结果:
Val : 100
如果,想要查阅Unsafe的源代码,请参考下面的链接.
http://www.docjar.com/html/api/sun/misc/Unsafe.java.html
unsafa 应该就是不让jvm管理内存了。
本文将通过sun.misc.Unsafe给出一个直接读写内存的例子。
注意:这只是一个例子,只是用来验证通过sun.misc.Unsafe来实现直接读写内存的可能性。但是,这样做并没有安全保证,而且稍微有点疏忽将可能导致JVM崩溃。
Unsafe类的三个方法:allocateMemory,putAddress和getAddress如下:
/** * Fetches a native pointer from a given memory address. If the address is * zero, or does not point into a block obtained from {@link * #allocateMemory}, the results are undefined. * * <p> If the native pointer is less than bits wide, it is extended as * an unsigned number to a Java long. The pointer may be indexed by any * given byte offset, simply by adding that offset (as a simple integer) to * the long representing the pointer. The number of bytes actually read * from the target address maybe determined by consulting {@link * #addressSize}. * * @see #allocateMemory */ public native long getAddress(long address); /** * Stores a native pointer into a given memory address. If the address is * zero, or does not point into a block obtained from {@link * #allocateMemory}, the results are undefined. * * <p> The number of bytes actually written at the target address maybe * determined by consulting {@link #addressSize}. * * @see #getAddress(long) */ public native void putAddress(long address, long x); /// wrappers for malloc, realloc, free: /** * Allocates a new block of native memory, of the given size in bytes. The * contents of the memory are uninitialized; they will generally be * garbage. The resulting native pointer will never be zero, and will be * aligned for all value types. Dispose of this memory by calling {@link * #freeMemory}, or resize it with {@link #reallocateMemory}. * * @throws IllegalArgumentException if the size is negative or too large * for the native size_t type * * @throws OutOfMemoryError if the allocation is refused by the system * * @see #getByte(long) * @see #putByte(long, byte) */ public native long allocateMemory(long bytes);
1. long allocateMemory(long bytes)
申请分配内存
2. long getAddress(long address) 和void putAddress(long address, long x)
对直接内存进行读写。
因为Unsafe这个类的访问是受限的,只有rt.jar中的类才能使用Unsafe的功能,它的构造方法是私有的,所以,我们不能通过new来创建实例。但是,可以通过反射的方法来获取Unsafe实例。
下面就是一个直接访问内存的一个例子:
import java.lang.reflect.Field; import sun.misc.Unsafe; public class DirectMemoryAccess { public static void main(String[] args) { /* * Unsafe的构造函数是私有的,不能通过new来获得实例。 * * 通过反射来获取 */ Unsafe unsafe = null; Field field = null; try { field = sun.misc.Unsafe.class.getDeclaredField("theUnsafe"); /* * private static final Unsafe theUnsafe = new Unsafe(); * * 因为field的修饰符为 private static final, * 需要将setAccessible设置成true,否则会报java.lang.IllegalAccessException */ field.setAccessible(true); unsafe = (Unsafe) field.get(null); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } long oneHundred = 100; byte size = 1; /* * 调用allocateMemory分配内存 */ long memoryAddress = unsafe.allocateMemory(size); /* * 将100写入到内存中 */ unsafe.putAddress(memoryAddress, oneHundred); /* * 内存中读取数据 */ long readValue = unsafe.getAddress(memoryAddress); System.out.println("Val : " + readValue); } }
输出结果:
Val : 100
如果,想要查阅Unsafe的源代码,请参考下面的链接.
http://www.docjar.com/html/api/sun/misc/Unsafe.java.html
评论
5 楼
ycjianghao
2015-07-25
这段代码是分配一个字节的内存吗?那写入一个8字节的long,是不是把程序的内存结构破坏了?
4 楼
chenyao_1028
2013-08-13
Meng jun!
3 楼
yuvyuvyuv
2013-08-10
用这个方法回收内存
public native void freeMemory(long address);
public native void freeMemory(long address);
2 楼
songhhwd01
2013-08-09
zhongmin2012 写道
学习了,那怎么回收内存,jvm会自己回收么?
unsafa 应该就是不让jvm管理内存了。
1 楼
zhongmin2012
2013-08-09
学习了,那怎么回收内存,jvm会自己回收么?
发表评论
-
工厂类中移除if/else语句
2016-07-10 19:52 902面向对象语言的一个强大的特性是多态,它可以用来在代码中移除 ... -
Java编程练手100题
2014-12-11 17:13 6729本文给出100道Java编程练手的程序。 列表如下: 面 ... -
数组复制的三种方法
2014-11-30 12:57 2213本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
数组复制的三种方法
2014-11-30 12:54 0本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
四种复制文件的方法
2014-11-29 13:21 1740尽管Java提供了一个类ava.io.File用于文件的操 ... -
判断一个字符串中的字符是否都只出现一次
2014-11-25 12:58 2724本篇博文将给大家带来几个判断一个字符串中的字符是否都只出现一 ... -
使用正则表达式判断一个数是否为素数
2014-11-23 13:35 2167正则表达式能够用于判断一个数是否为素数,这个以前完全没有想过 ... -
几个可以用英文单词表达的正则表达式
2014-11-21 13:12 3750本文,我们将来看一下几个可以用英文单词表达的正则表达式。这些 ... -
(广度优先搜索)打印所有可能的括号组合
2014-11-20 11:58 1953问题:给定一个正整n,作为括号的对数,输出所有括号可能 ... -
随机产生由特殊字符,大小写字母以及数字组成的字符串,且每种字符都至少出现一次
2014-11-19 14:48 3976题目:随机产生字符串,字符串中的字符只能由特殊字符 (! ... -
找出1到n缺失的一个数
2014-11-18 12:57 3176题目:Problem description: You h ... -
EnumSet的几个例子
2014-11-14 16:24 8749EnumSet 是一个与枚举类型一起使用的专用 Set 实现 ... -
给定两个有序数组和一个指定的sum值,从两个数组中各找一个数使得这两个数的和与指定的sum值相差最小
2014-11-12 11:24 3327题目:给定两个有序数组和一个指定的sum值,从两个数组 ... -
Java面试编程题练手
2014-11-04 22:49 6700面试编程 写一个程序,去除有序数组中的重复数字 编 ... -
Collections用法整理
2014-10-22 20:55 9846Collections (java.util.Collect ... -
The Code Sample 代码实例 个人博客开通
2014-09-04 18:48 1418个人博客小站开通 http://thecodesample. ... -
Collections.emptyXXX方法
2014-06-08 13:37 2145从JDK 1.5开始, Collections集合工具类中预先 ... -
这代码怎么就打印出"hello world"了呢?
2014-06-08 00:37 7397for (long l = 4946144450195624L ... -
最短时间过桥
2014-04-21 22:03 4144本文用代码实现最短时间过桥,并且打印如下两个例子的最小过桥时间 ... -
将数组分割成差值最小的子集
2014-04-20 22:34 2902本文使用位掩码实现一个功能 ==》将数组分割成差值最小的子集 ...
相关推荐
通过这些方法,我们可以有效地处理大Excel文件,避免Java内存溢出。在实践中,可能需要结合多种策略,根据具体项目需求进行调整和优化。 示例代码: ```java import org.apache.poi.xssf.streaming.SXSSFWorkbook;...
理解并熟练使用Java内存流是成为一名优秀Java开发者的关键技能之一。通过实际编写代码例子,你可以更好地掌握这些类的用法,例如创建一个简单的程序,将一个字节数组写入 ByteArrayOutputStream,然后从 ...
在Java编程语言中,文件的读写操作是日常开发中不可或缺的部分。本示例"读写文件操作demo-java"旨在教你如何使用Java进行文件的读取和写入,这对于处理数据存储、日志记录或是任何需要与磁盘交互的应用程序至关重要...
Java中的IO流是Java平台提供的一种处理输入输出数据的核心机制,广泛应用于文件读写、网络通信、数据转换等场景。IO流分为字节流(Byte Stream)和字符流(Character Stream),它们构成了Java IO系统的基础。 1. *...
标签"java"进一步确认了这些实验与Java语言的直接关联。在实际的压缩包文件中,每个文件名可能代表一个独立的实验,比如"实验1-数组操作"、"实验2-字符串处理"等,每个实验都可能包含详细的步骤、预期结果和解决方案...
Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(BIO)模型不同,NIO提供了非阻塞的读写方式,提高了程序处理高并发I/O操作的效率。这个例子包含了NIO在网络通信中的应用,...
在Java编程语言中,XML(eXtensible Markup Language)是一种重要的数据交换格式,用于存储和...在提供的"在java中读写XML文件.ppt"和"源码"中,可能包含了更多详细的步骤和示例代码,可以帮助你进一步理解这个主题。
共享内存是一种在多个进程间高效传递数据的方法,它允许进程直接读写同一块物理内存,从而避免了传统IPC(Inter-Process Communication)方式中的数据复制开销。在Java中,可以通过`java.nio.MappedByteBuffer`类来...
本篇文章将详细探讨如何使用Java进行XML的读写操作,主要包括DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)三种解析方式。 **DOM解析** DOM解析器将整个XML文档加载到...
这个简单的例子展示了Java输入输出流的基本用法,实际应用中,我们可以根据需求选择不同的流类型和操作方式,例如处理网络数据传输、内存缓冲、压缩解压等复杂场景。理解并熟练掌握Java的输入输出流,对于进行任何...
Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密 Java非对称加密源程序代码实例,本例中使用RSA加密技术,...
在"如何通过JAVA中的反射加载某个类中的某个方法"和"[Java]读取文件方法大全"中,你可以了解到Java的各种文件读写方法,例如`FileReader`、`BufferedReader`用于文本文件读取,`FileOutputStream`、`FileInputStream...
对于大文件,直接使用`FileReader`和`FileWriter`可能会导致内存溢出,这时可以使用`FileInputStream`和`FileOutputStream`配合`DataInputStream`和`DataOutputStream`进行分块读写。如果需要追加内容,记得设置`...
Java编程例子是初学者入门和进阶的重要资源,它涵盖了各种基本概念、语法以及常见的算法应用。这个压缩包文件提供了一系列的Java编程示例,旨在帮助学习者更好地理解和掌握这门语言。 首先,让我们深入了解一下Java...
1. **内部存储(Internal Storage)**:这部分是私有的,只能由应用本身访问,用户无法直接查看。通常用于存储应用数据、数据库和缓存文件。 2. **外部存储(External Storage)**:这部分对所有应用都是公开的,...
在Java编程语言中,"导出例子"通常指的是将数据或程序结果输出到文件、数据库或其他存储媒介的过程。这涉及到I/O(输入/输出)操作,是Java开发中不可或缺的一部分。下面我们将深入探讨Java导出数据的相关知识点。 ...
在Java编程语言中,经典例子是学习和理解各种概念的关键。"JAVA100经典例子"这个资源集合可能包含了从基础到高级的各种Java编程示例,帮助开发者深入掌握这一强大的面向对象的语言。以下是一些可能包含在这些例子中...
这个简单的Java操作Excel的例子对于初学者来说是一个很好的起点,通过学习这个例子,你可以理解如何将Java和数据库技术结合起来处理数据并生成Excel报告。当然,实际应用中可能还需要考虑更多的细节,比如错误处理、...
在Java编程中,读写Excel文件是常见的任务,特别是在数据处理和报告生成方面。本文将深入探讨两种常用的方法:Apache POI库和JXL库。这两种库都为Java提供了强大的Excel操作功能,允许我们创建、读取和修改Excel文件...