/* * Copyright (C) 2012, 2016 higherfrequencytrading.com * Copyright (C) 2016 Roman Leventov * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package net.openhft.chronicle.map; import net.openhft.chronicle.core.OS; import java.io.*; import java.util.Arrays; /** * This example shows that the OS resizes the usage of a CHM as needed. It is not as critical to worry about this. * <p> * System memory: 7.7 GB, Extents of map: 2199.0 GB, disk used: 13MB, addressRange: 7d380b7bd000-7f380c000000 * </p> */ public class OSResizesMain { public static void main(String[] args) throws IOException, InterruptedException { File file = File.createTempFile("over-sized", "deleteme"); int valueSize = 1000 * 1000; byte[] chars = new byte[valueSize]; ByteArray ba = new ByteArray(chars); ChronicleMap<String, ByteArray> map = ChronicleMapBuilder.of(String.class, ByteArray.class) .averageKeySize("key-".length() + 4) .constantValueSizeBySample(ba) .createPersistedTo(file); Arrays.fill(chars, (byte) '+'); for (int i = 0; i < 1000; i++) { map.put("key-" + i, ba); } long start = System.currentTimeMillis(); System.gc(); long time0 = System.currentTimeMillis() - start; System.out.printf("GC time: %,d ms%n", time0); System.out.printf("System memory: %.1f GB, Extents of map: %.1f GB, disk used: %sB, addressRange: %s%n", Double.parseDouble(run("head", "-1", "/proc/meminfo").split("\\s+")[1]) / 1e6, file.length() / 1e9, run("du", "-h", file.getAbsolutePath()).split("\\s")[0], run("grep", "over-sized", "/proc/" + OS.getProcessId() + "/maps").split("\\s")[0]); // show up in top. long time = System.currentTimeMillis(); while (time + 30000 > System.currentTimeMillis()) Thread.yield(); map.close(); file.delete(); } static String run(String... cmd) throws IOException, InterruptedException { ProcessBuilder pb = new ProcessBuilder(cmd); pb.redirectErrorStream(true); Process p = pb.start(); InputStreamReader reader = new InputStreamReader(p.getInputStream()); StringWriter sw = new StringWriter(); char[] chars = new char[512]; for (int len; (len = reader.read(chars)) > 0; ) sw.write(chars, 0, len); int exitValue = p.waitFor(); if (exitValue != 0) sw.write("\nexit=" + exitValue); p.destroy(); return sw.toString(); } } class ByteArray implements Serializable { final byte[] bytes; ByteArray(byte[] bytes) { this.bytes = bytes; } }