java
文章平均质量分 54
heyboylee
这个作者很懒,什么都没留下…
展开
-
关于Object=null
赋null值在JIT编译之后会被消除掉,这个时候将变量设置为null是没有意义的,实际上JIT编译成本地代码后,gc可以正常回收掉,无需多余操作。另外,当方法结束后,脱离作用域之后,相应的局部变量引用会自动被注销掉。小结:当遇到局部代码段中已经申请许多占用空间的对象,这些对象在其作用域内的后续代码中还需要执行相对较长的时间,并且这块内存的确在后面就不会再使用了的时候,可以手工将转载 2016-06-15 13:59:02 · 1105 阅读 · 0 评论 -
Java核心知识点-JVM结构和工作方式
一、JVM体系结构1.1 JVM中主要包括(PC寄存器,栈,)(堆,方法区,)本地方法区一个Java线程中,包括PC寄存器(保存当前执行的指令位置),和栈帧(一个方法对应一个栈帧),本地变量(保存计算中的临时数据),当一个线程结束后,线程内所有数据就自动销毁,不需要垃圾回收。PC寄存器和栈将1压入栈中,将2压入栈中,将转载 2016-05-30 11:23:06 · 361 阅读 · 0 评论 -
JVM 编译策略
解释器当虚拟机启动时,解释器可以首先发挥作用,而不必等待编译器全部编译完成再执行,这样可以省去许多不必要的编译时间。并且随着程序运行时间的推移,编译器逐渐发挥作用,根据热点探测功能,,将有价值的字节码编译为本地机器指令,以换取更高的程序执行效率。hotspot中内嵌有2个JIT编译器,分别为Client Compiler,Server Compiler,但大多数情况下我们称之为C1转载 2016-06-14 16:50:26 · 1482 阅读 · 0 评论 -
年老代过大有什么影响
年老代大部分是活着的对象,那么年老代过大,或者对象过早提升到年老代,导致年老代存活对象过多,那么如果做一次FullGC,寻找活着的对象,那么对于性能可想而知。如果系统频繁地发生FullGC的话,而这些或者的对象在这么短的时间内被注销的概率很低,那么FullGC的时间越长,就会有越多的请求得不到响应或者响应很慢,它们所持有的内存就无法释放掉,就会有越多的对象进入Old区域,这就会在一个点上产转载 2016-06-15 13:58:07 · 762 阅读 · 0 评论 -
Java对象分配简要流程
本文主要简述Java对象在内存中的分配过程总体流程分配流程逃逸分析逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用。方法逃逸:例如作为调用参数传递到其他方法中。线程逃逸:有可能被外部线程访问到,譬如赋值给类变量或可以在其他线程中访问的实例变量。栈上分配(Stack Alloc转载 2016-06-15 13:57:14 · 829 阅读 · 0 评论 -
Java的类加载机制
本文主要讲述Java类的加载机制,主要包括类加载器、加载过程、初始化时机。一、类加载器1、ClassLoader抽象类类加载器的任务就是根据一个类的全限定名来读取此类的二进制字节流到JVM内部,然后转换为一个与目标类对应的java.lang.Class对象实例。如果需要支持类的动态加载或需要对编译后的字节码文件进行解密操作等,就需要与类加载器打交道了。B转载 2016-06-15 13:55:37 · 327 阅读 · 0 评论 -
Java对象结构及大小计算
Java对象内存布局在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头HotSpot虚拟机的对象头包括两部分信息:第一部分markword,用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏转载 2016-06-15 13:54:42 · 4698 阅读 · 3 评论 -
Java类的初始化顺序
本文主要演示Java类的初始化顺序初始化顺序对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。实例代码public class InitialOrderTest { /* 静态变量 */ public static String staticField = "静态变量转载 2016-06-15 13:53:29 · 205 阅读 · 0 评论 -
jvm的card table数据结构
作用为了支持高频率的新生代的回收,虚拟机使用一种叫做卡表(Card Table)的数据结构,卡表作为一个比特位的集合,每一个比特位可以用来表示年老代的某一区域中的所有对象是否持有新生代对象的引用。这样新生代在GC时,可以不用花大量的时间扫描所有年老代对象,来确定每一个对象的引用关系,而可以先扫描卡表,只有卡表的标记位为1时,才需要扫描给定区域的年老代对象。而卡表位为0的所在转载 2016-06-15 13:52:49 · 3571 阅读 · 0 评论 -
GC通用日志解读
本文主要讲述gc日志的解读。除了CMS和G1收集器的GC稍微特殊外,其展示形式其实都大同小异。通用日志格式各个收集器的日志都维持一定的共性,例如以下两段典型的GC日志:33.125: [GC [DefNew: 3324K->152K(3712K), 0.0025925 secs] 3324K->152K(11904K), 0.0031680 secs]100.667: [F转载 2016-06-15 13:52:06 · 475 阅读 · 0 评论 -
GC策略的评价指标
1、吞吐量应用系统的生命周期内,应用程序所花费的时间和系统总运行时间的比值。系统总运行时间=应用程序耗时+GC耗时。如果系统运行了100分钟,GC耗时1分钟,则系统吞吐量=99%2、垃圾回收器负载垃圾回收器负载=GC耗时/系统总运行时间3、停顿时间垃圾回收器运行时,应用程序的暂停时间4、垃圾回收频率垃圾回收器多长时间运行一转载 2016-06-15 13:50:02 · 654 阅读 · 0 评论 -
JVM信息查看
本文主要讲述如何查看java应用的jvm信息。1、查看所有参数 jinfo -flags pidJava -XX:+PrintCommandLineFlags 这个参数的作用是显示出VM初始化完毕后所有跟最初的默认值不同的参数及它们的值。 (JDK5以上支持)-XX:+PrintFlagsFinal显示所有可设置的参数及它们的值( JDK 6 update 21开始才可以用转载 2016-06-15 13:50:54 · 1056 阅读 · 0 评论 -
GC的三大高级算法
序GC的基本算法,大体上都逃不出标记清除法/标记压缩法、复制收集算法、引用计数法这三种方式以及它们的衍生品。现在,通过对这三种方式进行融合,出现了一些更加高级的方式。这里,我们介绍一下其中最有代表性的三种,即分代回收、增量回收和并行回收。有些情况下,也可以对这些方法中的几种进行组合使用。1、分代回收首先,我们来讲讲高级GC技术中最重要的一种,即分代回收(Generation转载 2016-06-15 13:49:09 · 927 阅读 · 0 评论 -
GC的三大基础算法
1. 垃圾(Garbage)就是需要回收的对象。作为编写程序的人,是可以做出“这个对象已经不再需要了”这样的判断,但计算机是做不到的。因此,如果程序(通过某个变量等等)可能会直接或间接地引用一个对象,那么这个对象就被视为“存活”;与之相反,已经引用不到的对象被视为“死亡”。将这些“死亡”对象找出来,然后作为垃圾进行回收,这就是GC的本质。2、根(Root)就是判转载 2016-06-15 13:48:18 · 6266 阅读 · 2 评论 -
垃圾回收基础
1、性能属性:(1)吞吐量:不考虑垃圾收集引起的停顿时间或内存消耗,垃圾收集器能支撑应用程序达到的最高性能指标(2)延迟:缩短由于垃圾收集引起的停顿时间或完全消除垃圾收集所引起的停顿,避免应用程序运行时发生抖动(3)内存:垃圾收集器流畅运行所需要的内存数量任何一个属性性能的提供几乎都是以另外一个或两个属性性能的损失作为代价的。2、原则:(1)MinorGC回转载 2016-06-15 13:47:19 · 401 阅读 · 0 评论 -
JVM 系列:
JVM 系列:垃圾回收基础JVM的编译策略GC的三大基础算法GC的三大高级算法GC策略的评价指标JVM信息查看GC通用日志解读jvm的card table数据结构Java类初始化顺序Java对象结构及大小计算Java的类加载机制Java对象分配简要流程年老代过大有什么影响Surv转载 2016-06-15 13:46:31 · 328 阅读 · 0 评论 -
Java线程与Xss
Xss与线程个数Xss越大,每个线程的大小就越大,占用的内存越多,能容纳的线程就越少;Xss越小,则递归的深度越小,容易出现栈溢出 java.lang.StackOverflowError。减少局部变量的声明,可以节省栈帧大小,增加调用深度。/** * -Xss128K deep of calling = 675 * -Xss256K deep of calling = 1转载 2016-06-15 14:00:04 · 776 阅读 · 0 评论 -
Survivor空间溢出实例
本文演示survivor空间溢出的场景。实例代码class MemoryObject{ private byte[] bytes; public MemoryObject(int objectSize){ this.bytes = new byte[objectSize]; }}/** * eden 13184K ,s0/s1转载 2016-06-15 13:58:38 · 2326 阅读 · 0 评论 -
Java 自动装箱与拆箱(Autoboxing and unboxing)
什么是自动装箱拆箱基本数据类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。 一般我们要创建一个类的对象实例的时候,我们会这样: Class a = new Class(parameter); 当我们创建一个Integer对象时,却可以这样: Integer i = 100; (注意:不是 int i =转载 2016-06-17 10:53:47 · 512 阅读 · 0 评论