
Java/虚拟机
小白的学习笔记
这个作者很懒,什么都没留下…
展开
-
判断java对象是否还“活着”
判断java对象是否还“活着”堆中存放着Java世界中所有对象的实例,垃圾收集器在对堆进行回收前,第一件事就是要确定这些对象是否还活着,下面介绍判断对象是否还活着的两种方法:1、 引用计数法这个比较常用,思路为:为对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;档引用失效时,计数器值就减1;任何时刻计数器都为0的对象就是不可能再被使用的。引用计数算法实现简单,判定原创 2016-02-05 13:06:41 · 1412 阅读 · 0 评论 -
垃圾收集器
如果说垃圾收集算法是内存回收的方法论,垃圾收集器就是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实现没有任何规定,因此不同厂商,不同版本的虚拟机所提供的垃圾收集器都可能会有很大的差别,并且一般都会提供参数供用户根据自己的应用特定和要求进行组合出各个年代所使用的收集器。这里所讨论的收集器是基于Sun HotSpot虚拟机1.6版Update22,这个虚拟机所包含的收集器如下所示:原创 2016-05-06 16:21:03 · 574 阅读 · 0 评论 -
Java内存分配机制 垃圾回收 GC Root
这里所说的内存分配,主要指的是在堆上的分配,一般的,对象的内存分配都是在堆上进行,但现代技术也支持将对象拆成标量类型(标量类型即原子类型,表示单个值,可以是基本类型或String等),然后在栈上分配,在栈上分配的很少见,我们这里不考虑。 Java内存分配和回收的机制概括的说,就是:分代分配,分代回收。对象将根据存活的时间被分为:年轻代(Young Generation)、年老代(Old Ge转载 2016-03-15 15:59:34 · 1970 阅读 · 0 评论 -
触发Full GC执行的情况 JVM对象分配规则
除直接调用System.gc(不被建议调用)外,触发Full GC执行的情况有如下四种。1.旧生代空间不足旧生代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行Full GC后空间仍然不足,则抛出如下错误:java.lang.OutOfMemoryError: Java heap space 为避免以上两种状况引起的Full GC,调优转载 2016-03-22 17:15:48 · 781 阅读 · 0 评论 -
eclipse设置打印GC
首先建立评估体系,将workspace里所有的项目close掉,关闭eclipse。优化的用例就是启动eclipse,open一个项目,eclipse会自动build这个项目,保证没有感觉到明显的卡,也就是没有full GC。 开始: eclipse.ini里加入打印gc情况的参数: -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -verbose:gc转载 2016-03-27 15:29:53 · 4246 阅读 · 0 评论 -
JVM 类加载器介绍及其双亲委托机制
1、类加载器:类加载器用来把类加载到Java虚拟机中。从JDK1.2版本开始,类的加载过程采用父亲委托机制,这种机制能更好的保证Java平台的安全。在此委托机制中,除了Java虚拟机自带的根类加载器之外,其余的类加载器都有且只有一个父加载器。当Java程序请求加载器loader1加载Sample类是,loader1类首先委托自己的父加载器去加载Sample类,若父加载器能加载,则由父加载器完成转载 2016-03-15 16:47:01 · 1257 阅读 · 0 评论 -
JVM性能调优入门 调优策略
文/MountainKing(简书作者)原文链接:http://www.jianshu.com/p/c6a04c88900a著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。两个基本原则:1、将转移到老年代的对象数量降到最少。2、减少Full GC的执行时间。目标是Minor GC时间在100ms以内,Full GC时间在1s以内。主要调优参数:转载 2016-03-24 13:03:35 · 1042 阅读 · 0 评论 -
了解CMS(Concurrent Mark-Sweep)垃圾回收器
1.总体介绍: CMS(Concurrent Mark-Sweep)是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动JVM参数加上-XX:+UseConcMarkSweepGC ,这个参数表示对于老年代的回收采用CMS。CMS采用的基础算法是:标记—清除。2.CMS过程: 初始标记(STW initial mar转载 2016-03-17 13:15:27 · 424 阅读 · 0 评论 -
测试产生Java内存异常
1、 Java堆溢出 Java堆用于储存对象实例,我们只要不断地创建对象,就会在对象数量到达最大堆容量时产生内存溢出异常。 首先我们设置JVM使用的堆大小,设置方式为,点击运行右边的下箭头,并点击“Run Configurations”,在(x)=Argumens一列,在VM argumengs文本框中填写如下内容(设置堆最大空间和最小空间为20M): -verbose:gc -Xms20M原创 2016-02-04 12:33:32 · 699 阅读 · 0 评论 -
JVM 运行时数据区域
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及各自的创建和销毁时间。有的的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范(第二版)》的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如下图所示: 下面分别说明这些内存区域的作用:1、 程序原创 2016-02-04 11:31:07 · 546 阅读 · 0 评论 -
JVM类的加载过程
类的加载过程类加载器的主要任务就是根据一个类的全限定名来读取此类的二进制字节流到JVM内部,然后转换为一个与目标类对应的java.lang.Class对象实例。当然类加载器所执行的加载操作仅仅是属于JVM中类加载过程中的一个阶段而已,一个完整的类加载器过程必须经历加载、连接、初始化这3个步骤。如下图所示: 简单来说,类的加载原创 2016-02-11 00:00:58 · 732 阅读 · 0 评论 -
Java自定义类加载器
JVM支持两种类型类加载器,分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader)。在此大家需要注意。从概念上来讲,自定义类加载器一般指的是程序中由开发人员自定义的一类类加载器,但是Java虚拟机规范却没有这么定义,而是将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器。无论类加载器的类型如何划分,原创 2016-02-09 21:59:13 · 1519 阅读 · 0 评论 -
字节码文件的内部组成结构
参考《Java虚拟机规范Java SE7版》的描述来看,每一个字节码文件其实都对应着全局唯一的一个类或者接口的定义信息。字节码文件采用的是一种类似于C语言结构体的伪结构来描述字节码文件格式。为了避免与类的字段、实例等概念产生混淆,本书将用于描述类结构格式的内容定义为项(item) 每一项都包括类型、名称以及该项的数量。类型可以是表明,也可以是“基本类型”。包含在字节码文件中,各原创 2016-02-06 12:03:26 · 2530 阅读 · 0 评论 -
垃圾收集算法
1、 标记-清除算法标记-清除算法是最基本的垃圾收集算法,如它的名字一样,算法分为“标记”和“清除”两个过程:首先标记所有需要回收的对象,在标记完成之后统一回收掉所有被标记的对象,标记过程就是判断对象是否已经死亡。标记-清除算法的主要缺点有两个:一个是效率问题,标记和清除过程效率都不高;另一个是空间问题,标记之后会产生大量不连续的内存碎片,空间碎片太多可能会导致当程序在以后的运行过程中需原创 2016-02-05 15:08:04 · 506 阅读 · 0 评论 -
《Java性能优化...》读书笔记
1、JVM虚拟机内存分配参数-Xmx:设置最大堆大小,最大堆指的是新生代和年老代的大小之和的最大值,它是Java应用程序的堆上限。当使用值超过这个限制时会抛出OutOfMemoryError异常。可以使用循环申请1M空间(new byte[1024*1024])进行测试,-Xms:设置最小堆(可以认为后面的s代表small)大小,Java应用程序在运行时,首先会被分配-Xms指定的内存原创 2016-08-20 15:13:56 · 791 阅读 · 1 评论