前言:jvm的世界水还是挺深的,若不是有时间的好奇宝宝还是不要走火入魔啦~~
先抛出一个问题:
public class Test {
static Test2 t1 = new Test2();
Test2 t2 = new Test2();
public void fn() {
Test2 t3 = new Test2();
}
}
class Test2 {
}
请问:程序中,t1、t2、t3三个变量本身(而不是这三个变量所指向的对象)到底在哪里?答案传送门:http://rednaxelafx.iteye.com/blog/1847971
Java对象的大小
在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。例如 Object ob = new Object(); 它所占的空间为:4byte+8byte。4byte是上面部分所说的Java栈中保存引用的所需要的空间。而那8byte则是Java堆中对象的信息。
基本类型的包装类型往往是很耗内存的。
堆大小设置
java -Xmx3550m -Xms3550m -Xmn2g –Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4-XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
-Xmx3550m:设置JVM最大可用内存为3550M。
-Xms3550m:设置JVM促使内存为3550m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmn2g:设置年轻代大小为2G。-Xss128k:设置每个线程的堆栈大小。
-XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。
-XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值。
-XX:MaxPermSize=16m:设置持久代大小为16m。
-XX:MaxTenuringThreshold=0:设置垃圾最大年龄。
传统分代垃圾回收方式,无法解决的一个问题,就是Full GC所带来的应用暂停。而增量收集既支持短的暂停时间,又支持大的内存空间分配。可以很好的解决传统分代方式带来的问题。
增量收集实现了一直边使用边收集的效果,避免了整个堆使用完了再暂停的回收情况。但必须把对堆空间划分成一系列内存块,否则造成碎片(无法压缩)及在暂停时间的控制上还是很弱。
JVM调优工具
Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用。对垃圾回收算法有很详细的跟踪。详细说明参考这里
JProfiler:商业软件,需要付费。功能强大。详细说明参考这里
VisualVM:JDK自带,功能强大,与JProfiler类似。推荐。
线程监控
线程信息和状态监控
Dump线程详细信息:查看线程内部运行情况
死锁检查
CPU热点:检查系统哪些方法占用的大量CPU时间内存热点:检查哪些对象在系统中数量最大(一定时间内存活对象和销毁对象一起统计)
快照
快照是系统运行到某一时刻的一个定格。对比多次快照的对象情况。