引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。
可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。不可达对象。
10.Java中创建一个对象的过程
1.检测类是否被加载2.为对象分配内存3.为分配的内存空间初始化零值4.对对象进行其他设置5.执行init方法
11.对象的内存布局
对象的内存布局包括三个部分:对象头,实例数据和对齐填充。
对象头:对象头包括两部分信息,第一部分是存储对象自身的运行时数据,如哈希码,GC分代年龄,锁状态标志,线程持有的锁等等。第二部分是类型指针,即对象指向类元数据的指针。
实例数据:就是数据啦
对齐填充:不是必然的存在,就是为了对齐的嘛
面试官:对象是如何定位访问的?
答:对象的访问定位有两种:句柄定位和直接指针
句柄定位:Java 堆会画出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息
直接指针访问:java堆对象的不居中就必须考虑如何放置访问类型数据的相关信息,而reference中存储的直接就是对象地址
比较:使用直接指针就是速度快,使用句柄reference指向稳定的句柄,对象被移动改变的也只是句柄中实例数据的指针,而reference本身并不需要修改。
12.内存屏障
内存屏障,又称内存栅栏,是一组处理器指令,用于实现对内存操作的顺序限制。
内存屏障的重要性:对主存的一次访问一般花费硬件的数百次时钟周期。处理器通过缓存(caching)能够从数量级上降低内存延迟的成本这些缓存为了性能重新排列待定内存操 作的顺序。也就是说,程序的读写操作不一定会按照它要求处理器的顺序执行。当数据是不可变的,同时/或者数据限制在线程范围内,这些优化是无害的。如果把 这些优化与对称多处理(symmetric multi-processing)和共享可变状态(shared mutable state)结合,那么就是一场噩梦。当基于共享可变状态的内存操作被重新排序时,程序可能行为不定。一个线程写入的数据可能被其他线程可见,原因是数据 写入的顺序不一致。适当的放置内存屏障通过强制处理器顺序执行待定的内存操作来避免这个问题。
13.jdk自带工具、jvm命令行、调试工具
1)jps 与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。
2)jmap 查看堆内存空间,可以查看堆空间的数据分布情况,新生代和老年代。
3)javac 编译java文件
4)jstack 查看栈内存空间,可以查看多线程死锁的问题,查看各个进程的状态快照。
5)jstat:一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。
6)jinfo:用来查看JVM参数和动态修改部分JVM参数的命令
7)jconsole:一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。
14.JVM启动参数
在哪设置JVM的启动参数:
1)eclipse需要修改根目录文件eclipse.ini
2)在tomcat 的bin 下catalina.sh 文件内添加
常用的设置参数;
-Xmx 指定JVM最大 堆内存 例:-Xmx3550m:设置JVM最大堆内存为3550M。
-Xms 指定JVM初始 堆内存 例:-Xms3550m:设置JVM初始堆内存为3550M
-Xmn (默认等效 -Xmn=-XX:NewSize=-XX:MaxNewSize=?) 用于设置新生代大小
-XX:NewSize=1024m:设置年轻代初始值为1024M。
-XX:MaxNewSize=1024m:设置年轻代最大值为1024M。
-XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的比值。表示2个Survivor区(JVM堆内存年轻代中默认有2个大小相等的Survivor区)与1个Eden区的比值为2:4,即1个Survivor区占整个年轻代大小的1/6。
-Xss128k:设置每个线程的栈大小。JDK5.0以后每个线程栈大小为1M。
-Xmx3550m: 最大堆大小为3550m。
-Xms3550m: 设置初始堆大小为3550m。
-Xmn2g: 设置年轻代大小为2g。
-Xss128k: 每个线程的堆栈大小为128k。
-XX:MaxPermSize: 设置持久代大小为16m
-XX:NewRatio=4: 设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。
-XX:SurvivorRatio=4: 设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6
-XX:MaxTenuringThreshold=0: 设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。