jvm默认多大的对象是大对象?对象的内存分配——对象优先在Eden分配
当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。

testAllocation()方法中,尝试分配3个2MB大小和1个4MB大小的对象,在运行时通过-Xms20M、-Xmx20M、-Xmn10M这3个参数限制了Java堆大小为20MB,不可扩展,其中10MB分配给新生代,剩下的10MB分配给老年代。-XX:SurvivorRatio=8决定了新生代中Eden区与一个Survivor区的空间比例是8:1,从输出的结果也可以清晰地看到“eden space 8192K、from space 1024K、to space 1024K”的信息,新生代总可用空间为9216KB(Eden区+1个Survivor区的总容量)。执行testAllocation()中分配allocation4对象的语句时会发生一次Minor GC,这次GC的结果是新生代6651KB变为162KB,而总内存占用量则几乎没有减少(因为allocation1、allocation2、allocation3三个对象都是存活的,虚拟机几乎没有找到可回收的对象)。这次GC发生的原因是给allocation4分配内存的时候,发现Eden已经被占用了6MB,剩余空间已不足以分配allocation4所需的4MB内存,因此发生Minor GC。GC期间虚拟机又发现已有的3个2MB大小的对象全部无法放入Survivor空间(Survivor空间只有1MB大小),所以只好通过分配担保机制提前转移到老年代去。这次GC结束后,4MB的allocation4对象顺利分配在Eden中,因此程序执行完的结果是Eden占用4MB(被allocation4占用),Survivor空闲,老年代被占用6MB(被allocation1、allocation2、allocation3占用)。

下面看看使用Parallel Scavenge收集器的情况:

没有发生新生代GC,直接把allocation4分配到老年代上。
对象的内存分配——大对象直接进入老年代——典型的大对象
很长的字符串以及数组
对象的内存分配——大对象直接进入老年代——大对象噩梦
比遇到一个大对象更加坏的消息就是遇到一群“朝生夕灭”的“短命大对象”,经常出现大对象容易导致内存还有不少空间时就提前触发垃圾收集以获取足够的连续空间来“安置”它们。
对象的内存分配——大对象直接进入老年代——原因
大于-XX:PretenureSizeThreshold设置值的对象直接在老年代分配。这样做的目的是避免在Eden区及两个Survivor区之间发生大量的内存复制。

PretenureSizeThreshold被设置为3MB(就是3145728,这个参数不能像-Xmx之类的参数一样直接写3MB),因此超过3MB的对象都会直接在老年代进行分配。
PretenureSizeThreshold参数只对Serial和ParNew两款收集器有效,Parallel Scavenge收集器不认识这个参数,Parallel Scavenge收集器一般并不需要设置。
先说一下什么是“带宽”:带宽表示网络的通信线路所能传送数据的能力,因此网络带宽表示在单位时间内从网络中的某一点到另一点所能通过的“最高数据率”.
那么宽带就只带宽比较快的网络线路。1M的宽带就是指该线路每秒可以发送1000000个bit的数据。因为高清视频的信息量很大,如果线路传递数据的能力不够,就会出现我们平时卡的现象。CCTV这里是检测到带宽不够1M就不能播放。
可以到电信去加快带宽,当然每月的网费会更高了。
1m和2m对你的区别就是,2m下东西的速度是1m的2倍就这么简单,我家原来就是1m够用了,下个500m的电影资源好点就是1个半小时多点,现在2m了
;autorefresh=1381074523382
先优化下程序吧。你的每个8万行的list,读取完第一个文件,在读取第二个文件的时候释放吗?
你“将这个list跟3万行的list 遍历通过相同的id获取3万行里的手机号码。”这个效率太低了,将3万行数据的list改为HashMap,key是id,value是手机号。
1. Run as - Run configurations - java应用名 - arguments -VM arguments,加入jvm参数就行
2. 测试代码
[java] view plain copy
package cn.erong.test;
public class Jtest {
private static final int _1M = 1024*1024;
public static void main(String[] args) {
byte[] allocation1,allocation2,allocation3,allocation4;
allocation1 = new byte[_1M/4];
allocation2 = new byte[_1M/4];
allocation3 = new byte[4*_1M];
allocation4 = new byte[4*_1M];
allocation4 = null;
allocation4 = new byte[4*_1M];
}
}
3. 测试看下,在vm arguments 中加入
[java] view plain copy
-Xms20m --jvm堆的最小值
-Xmx20m --jvm堆的最大值
-XX:+PrintGCTimeStamps -- 打印出GC的时间信息
-XX:+PrintGCDetails --打印出GC的详细信息
-verbose:gc --开启gc日志
-Xloggc:d:/gc.log -- gc日志的存放位置
-Xmn10M -- 新生代内存区域的大小
-XX:SurvivorRatio=8 --新生代内存区域中Eden和Survivor的比例
4 . run 看下日志,到d盘找到 gc.log,如下
[plain] view plain copy
Java HotSpot(TM) Client VM (25.151-b12) for windows-x86 JRE (1.8.0_151-b12), built on Sep 5 2017 19:31:49 by "java_re" with MS VC++ 10.0 (VS2010)
Memory: 4k page, physical 3567372k(982296k free), swap 7133056k(3042564k free)
CommandLine flags: -XX:InitialHeapSize=20971520 -XX:MaxHeapSize=20971520 -XX:MaxNewSize=10485760 -XX:NewSize=10485760 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:SurvivorRatio=8 -XX:-UseLargePagesIndividualAllocation
0.091: [GC (Allocation Failure) 0.091: [DefNew: 5427K-995K(9216K), 0.0036445 secs] 5427K-5091K(19456K), 0.0038098 secs] [Times: user=0.00 sys=0.02, real=0.00 secs]
0.095: [GC (Allocation Failure) 0.095: [DefNew: 5091K-0K(9216K), 0.0012412 secs] 9187K-5090K(19456K), 0.0012908 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
def new generation total 9216K, used 4260K [0x04000000, 0x04a00000, 0x04a00000)
eden space 8192K, 52% used [0x04000000, 0x044290e8, 0x04800000)
from space 1024K, 0% used [0x04800000, 0x04800000, 0x04900000)
to space 1024K, 0% used [0x04900000, 0x04900000, 0x04a00000)
tenured generation total 10240K, used 5090K [0x04a00000, 0x05400000, 0x05400000)
the space 10240K, 49% used [0x04a00000, 0x04ef8ac0, 0x04ef8c00, 0x05400000)
Metaspace used 84K, capacity 2242K, committed 2368K, reserved 4480K
HDD是对硬盘的要求(HDD后面因该有提) GC因该是自动释放内存 sc不知道 RAM就是对随机存取存储器的要求 以下是百科: HDD,Hard Disk Drive的缩写,即硬盘驱动器的英文名。最基本的电脑存储器,我们电脑中常说的电脑硬盘[C盘、D盘为磁盘分区]都属于硬盘驱动器。目前硬盘一般常见的磁盘容量为80G、120G、160G、250G、320G、500G、640G等等,目前最高的桌面级硬盘为3TB(1TB=1024G=1048576M)。硬盘按体积大小可分为3.5寸、2.5寸、1.8寸等;按转数可分为5400rpm/7200rpm/10000rpm等;按接口可分为PATA、SATA、SCSI等。PATA、SATA一般为桌面级应用,容量大,价格相对较低,适合家用;而SCSI一般为服务器、工作站等高端应用,容量相对较小,价格较贵,但是性能较好,稳定性也较高。 有了GC,程序员就不需要再手动的去控制内存的释放。当Java虚拟机(VM)或.NET CLI发觉内存资源紧张的时候,就会自动地去清理无用对象(没有被引用到的对象)所占用的内存空间(这里的说法略显粗略,事实上何时清理内存是个复杂的策略)。如果需要,可以在程序中显式地使用System.gc() / System.GC.Collect()来强制进行一次立即的内存清理。 RAM(随机存取存储器)RAM -random access memory 随机存储器。存储单元的内容可按需随意取出或存入,且存取的速度与存储单元的位置无关的存储器。这种存储器在断电时将丢失其存储内容,故主要用于存储短时间使用的程序。 按照存储信息的不同,随机存储器又分为静态随机存储器(Static RAM,SRAM)和动态随机存储器(Dynamic RAM,DRAM)。
本文转载自互联网,如有侵权,联系删除