我想知道它是如何File.exists()工作的.我不太清楚文件系统是如何工作的,所以我应该先开始阅读.
但是要获得快速的预先信息:
File.exists()如果在某个日志中注册了该路径和文件名,是对文件系统的单个操作的调用吗?或者操作系统是否获取目录的内容,然后通过它扫描匹配?
我认为这将取决于文件系统,但也许所有文件系统都使用快速方法?
我不是在谈论网络和磁带系统.让它保持ntfs,extX,zfs,jfs :-)
我在Java中有一个非常简单的划分(它是每小时的产品数量/产量),但每当我进行这个划分时,我都会遇到奇怪的错误:
float res = quantity / standard;
Run Code Online (Sandbox Code Playgroud)
我已经尝试了上面的几个值的分区,但我总是得到错误,但是我在其他地方尝试并且正确的那个是这样的:
世界各地:
13.6 = 6800 / 500;
Run Code Online (Sandbox Code Playgroud)
Java的:
13.0 = 6800 / 500;
Run Code Online (Sandbox Code Playgroud)
我已经研究过BigDecimal和BigInteger,但是我还没有找到用它们创建这个除法的方法,有没有其他方法在Java中进行这种划分而没有精度错误?
任何帮助将不胜感激.
静态变量是在程序执行的整个持续时间内分配的,因此堆栈和堆都不方便.那它在哪里?应该有一些装载的地方?
内存障碍保证数据缓存一致.但是,它是否保证TLB一致?
我看到一个问题,当在线程之间传递MappedByteBuffer时,JVM(java 7更新1)有时会因内存错误(SIGBUS,SIGSEG)而崩溃.
例如
final AtomicReference<MappedByteBuffer> mbbQueue = new AtomicReference<>();
// in a background thread.
MappedByteBuffer map = raf.map(MapMode.READ_WRITE, offset, allocationSize);
Thread.yield();
while (!inQueue.compareAndSet(null, map));
// the main thread. (more than 10x faster than using map() in the same thread)
MappedByteBuffer mbb = inQueue.getAndSet(null);
Run Code Online (Sandbox Code Playgroud)
没有Thread.yield()我偶尔会在force(),put()和C的memcpy()中崩溃,这些都表示我试图非法访问内存.使用Thread.yield()我没有遇到任何问题,但这听起来不是一个可靠的解决方案.
有人遇到过这个问题吗?有关TLB和内存障碍的保证吗?
编辑:操作系统是Centos 5.7,我已经看到了i7和双Xeon机器上的行为.
为什么我这样做?因为写入消息的平均时间是35-100 ns,具体取决于长度,使用普通的write()并不是那么快.如果我在当前线程中进行内存映射和清理,则需要50-130微秒,使用后台线程执行此操作需要大约3-5微秒的主线程交换缓冲区.为什么我需要交换缓冲区呢?因为我写的是很多GB数据而且ByteBuffer的大小不能超过2 GB.
我是测试自动化的实习生.我正在使用Eclipse创建Junit代码并使用Eclipse运行.我正在使用FileInputStream函数从excel表中重新获取数据.
FileInputStream fi=new FileInputStream("c:\\search.xls");
Workbook w=Workbook.getWorkbook(fi);
Sheet s=w.getSheet(0);
Run Code Online (Sandbox Code Playgroud)
是否有必要关闭Inputstream功能?如果是这样,请指导我一些编码.
作为我正在进行的项目的一部分,我想清理一个我生成重复行条目的文件.然而,这些重复通常不会彼此靠近.我想出了一种在Java中这样做的方法(它基本上制作了文件的副本,然后使用嵌套的while语句将一个文件中的每一行与另一个文件中的其余部分进行比较).问题是,我生成的文件非常大而且文本很重(大约225k行文本,大约40兆).我估计我目前的流程需要63个小时!这绝对是不可接受的.
但是,我需要一个集成的解决方案.最好是Java.有任何想法吗?谢谢!
Terracotta BigMemory有没有开源替代品?
实际上我甚至没有找到任何商业选择.我对纯Java解决方案很感兴趣,它可以在JVM中运行,而不需要任何JNI和C支持的解决方案.
在下面的示例中,我有两个线程使用的一个文件(在实际示例中,我可以有任意数量的线程)
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class A {
static volatile boolean running = true;
public static void main(String[] args) throws IOException, InterruptedException {
String name = "delete.me";
new File(name).deleteOnExit();
RandomAccessFile raf = new RandomAccessFile(name, "rw");
FileChannel fc = raf.getChannel();
Thread monitor = new Thread(() -> {
try {
while (running) {
System.out.println(name + " is " + (fc.size() >> 10) + " KB");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("Interrupted");
Thread.currentThread().interrupt(); …Run Code Online (Sandbox Code Playgroud) 为解决此问题,我创建了一个开源Java Thread Affinity库
当我有许多线程密切交互时,它可以减少延迟并增加吞吐量.对于单线程任务,它仍然可以减少相当多的抖动.
该程序查看调用System.nanoTime()和报告超过10x,000 ns 之间的时间差.
public class TimeJumpingMain {
static final long IGNORE_TIME = 1000 * 1000 * 1000; // the first second to allow warmup.
static final int minJump = 10; // smallest jump of 10 us.
static final int midJump = 100; // mid size jump of 100 us.
static final int bigJump = 1000; // big jump of 1 ms.
public static void main(String... args) {
int[] intervalTimings = new int[1000];
int[] …Run Code Online (Sandbox Code Playgroud) 我正在研究真正了解内存分配在JVM中的工作原理.我正在编写一个应用程序,其中我将失去内存:堆空间异常.
我知道我可以将诸如Xms和Xmx之类的VM参数传递给JVM为正在运行的进程分配的堆空间.这是问题的一种可能的解决方案,或者我可以检查我的代码是否存在内存泄漏并解决问题.
我的问题是:
1)JVM如何为自己实际分配内存?这与操作系统如何将可用内存传递给JVM有何关系?或者更一般地说,任何进程的内存分配实际上如何工作?
2)虚拟内存如何发挥作用?假设您有一个具有32GB物理内存的系统,并且您将所有32GB分配给您的Java进程.假设您的进程实际上消耗了所有32GB的内存,我们如何强制使用虚拟内存而不是运行到OOM异常?
谢谢.
java ×10
file-io ×3
memory ×3
caching ×1
centos ×1
directory ×1
division ×1
duplicates ×1
file ×1
filechannel ×1
filesystems ×1
inputstream ×1
interrupt ×1
java-9 ×1
jvm ×1
linux ×1
real-time ×1
text ×1
tlb ×1