jdk基础
liudezhicsdn
这个作者很懒,什么都没留下…
展开
-
jvm内存模型简单描述
jvm内存主要分为五个部分:方法区,java堆,java栈,程序计数器,本地方法栈。方法区:存储被虚拟机加载的类信息,常量,静态常量,静态方法,运行时常量池等。(1)用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。(2)Sun HotSpot虚拟机把方法区叫做永久代(Permanent Generation),方法区中最重要的部分是运行时常量池(运行时原创 2016-03-27 22:13:34 · 2318 阅读 · 0 评论 -
java中的容器collection及其常用的子接口
collection在包java.util下,继承 Iterable,Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。此接口通常用来传递 collect原创 2016-03-28 18:33:48 · 1354 阅读 · 0 评论 -
JDK判断对象死亡用过的和正在用的两种算法
堆中存放着几乎所有的对象实例,垃圾收集器在堆堆进行回收前,首先要确定这些对象哪些还“活着”,哪些已经“死去”。方法有如下两种:(1)引用计数法 算法思想:为对象添加一个引用计数器,每当有一个地方引用该对象时,则该引用计数器值加1,;当引用失效时,则该引用计数器值减1;最后,计数器为0的对象就是不可能再被使用的,也即所谓的“死去”的对象。 Java中并没有使用这种算法进行G转载 2016-03-28 21:36:46 · 508 阅读 · 0 评论 -
Java中四种引用详解(不同类型引用的JVM回收策略)
java四种引用包括强引用,软引用,弱引用,虚引用。强引用:只要引用存在,垃圾回收器永远不会回收Object obj = new Object();//可直接通过obj取得对应的对象 如obj.equels(new Object());而这样 obj对象对后面new Object的一个强引用,只有当obj这个引用被释放之后,对象才会被释放掉,这也是我们经常所用到的编码形转载 2016-03-28 22:15:06 · 491 阅读 · 0 评论 -
HashMap存取元素原理分析
通过观察JDK源码,我们可以知道HashMap的底层数据结构是数组加链表。如下图:当调用put方法添加元素时,首先调用要存的Key的hashcode方法算出一个哈希码值作为数组下标,如果此下标没有元素,直接存入。如果在此下标已经存在元素,则调用Key的equals方法,如果返回true,则覆盖。如果调用Key的equals方法,如果返回false,则此数组下标内存存一个链表,将原创 2016-03-29 00:18:09 · 1291 阅读 · 1 评论 -
为什么要同时重写hashcode和equals方法
HashCode和Equals都是object的方法在jdk中源码如下:原始的这两个方法equals是比较引用。hashcode是调用native方法根据这个对象在内存中的实际地址值来算的一个哈希码值。所以要么都相等,要么都不相等,所以重写的时候应该都重写下,否则可能就不一致了,如果不一致的话,对使用散列表数据结构的数据类型会有影响,比如hashmap,hashta原创 2016-03-27 20:28:24 · 2272 阅读 · 0 评论 -
fullGC过于频繁的原因和解决方案
案例1 系统高峰期fullGC频繁,优化后恢复正常。 导致原因: 系统中有一个调用频繁的接口会调用下面这个方法,目的是获取图片的宽高信息,但是Image这个对象用完不会自动释放,需要手动调用 flush()方法;以前没有调用这个方法,就导致一有请求就会有大对象进入old区,在业务高峰期old区一会就被打满,所以一直进行fgc。public static Image getImage(Strin转载 2016-04-10 23:02:43 · 10237 阅读 · 0 评论 -
jvm常用参数设置
1 初始堆大小: 默认值:物理内存的1/64(<1GB),默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制。 设置命令-Xms2 最大堆大小: 默认值:物理内存的1/4(<1GB),默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。3 年轻代大小 默认值:注意:原创 2016-04-10 23:26:38 · 800 阅读 · 0 评论 -
Iterator简单剖析
迭代器(Iterator)是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。迭代器(Iterator)游标默认在第一个元素之前的位置,所需取第一个元素需要用到next()方法。迭代器(Iterator)的方法如下: 如下为java代码简单应用:package com.ldz.constant;imp原创 2016-04-16 19:08:58 · 378 阅读 · 0 评论 -
java native关键字
简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern “C”告知C++编译器去调用一个C的函数。原创 2016-04-17 10:30:48 · 247 阅读 · 0 评论 -
HashMap如何存储数据的?
我们知道,HashMap是通过key算出hashCode,然后,通过使用hashCode当做下标来存储数据的,其实这种说法并非完全正确,比如HashMap初始容量只有16,他是怎么存储下hashCode值大于16的数据的呢?通过观察源码,我们发现如下源码: /** * Returns index for hash code h. */ static int inde原创 2016-04-30 19:02:13 · 6800 阅读 · 0 评论 -
java.io.File 删除文件delete()和deleteOnExit()的区别
file.delete()//删除文件,删除的是创建File对象时指定与之关联创建的那个文件. file.deleteOnExit();//在JVM进程退出的时候删除文件,通常用在临时文件的删除.原创 2016-04-18 10:40:45 · 1740 阅读 · 0 评论 -
jvm简介
定义 jvm严格来讲是一种规范,现下最流行的实现是hotspot。发展史 1996年 SUN JDK 1.0 Classic VM 纯解释运行,使用外挂进行JIT1997年 JDK1.1 发布 AWT、内部类、JDBC、RMI、反射1998年 JDK1.2 Solaris Exact VM JIT 解释器混合 Accurate Memory Management 精确内存管理,数据类型敏原创 2016-04-19 00:07:19 · 335 阅读 · 0 评论 -
jvm运行机制
jvm启动流程 启动java进程-》装载配置(根据当前路径和系统版本寻找jvm.cfg)-》根据配置寻找JVM.dll(JVM.dll为JVM主要实现)-》初始化JVM获得JNIEnv接口(JNIEnv为JVM 接口,findClass等操作通过它实现)-》找到main方法并运行。jvm基本结构 PC寄存器 每个线程拥有一个PC寄存器(程序计数器) 在线程创建时 创建 指向下一条指令的地址原创 2016-04-19 23:25:07 · 408 阅读 · 0 评论 -
jvm参数配置
配置如下参数,可打印GC信息: -verbose:gc -XX:+printGC[GC 4790K->374K(15872K), 0.0001606 secs][GC 4790K->374K(15872K), 0.0001474 secs][GC 4790K->374K(15872K), 0.0001563 secs][GC 4790K->374K(15872K), 0.0001682 s原创 2016-04-21 00:26:42 · 366 阅读 · 0 评论 -
java容器总结
容器大体分为两类:Collection和Map。 区别: 1 Collection中存储了一组对象,而Map存储键值对。 2 Collection的子类都实现了iterator这个方法,该方法能返回一个Iterator对象。Collection的具体实现包括List和Set。 区别: 1 List是有序的,元素可以重复的,Set是无序的,元素不可以重复。 2 Set的value最多只能存原创 2016-05-08 20:18:53 · 591 阅读 · 0 评论 -
常用的三个字符串类型剖析
常用的三个字符串类型有String,StringBuffer,StringBuilder它们的底层数据结构都是字符数组。String 底层数组是一个被final描述的字符数组。所以不可变 StringBuffer 继承了AbstractStringBuilder,AbstractStringBuilder里定义了一个字符数组,因为没有被final修饰,所以是可变的。 方法被synchroni原创 2016-04-09 22:53:14 · 1221 阅读 · 0 评论 -
JVM原理简单剖析
JVM在整个jdk中处于最底层,负责于操作系统的交互,用来屏蔽操作系统环境,提供一个完整的Java运行环境,因此也就虚拟计算机. JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境.1.创建JVM装载环境和配置2.装载JVM.dll3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例4.调用JNIEnv实例装载并处理clas原创 2016-04-09 17:32:40 · 295 阅读 · 0 评论 -
接口List<E>常用实现类分析
List常用的实现类包括:ArrayList,LinkedList,Stack和Vector。ArrayList:List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于 Vector 类,除了此类是不同步的。)初始容量可以通过构造方法来指定原创 2016-03-29 22:54:18 · 668 阅读 · 0 评论 -
JVM常用垃圾回收算法总结
1、标记-清除算法:概念: 标记阶段:先通过根节点,标记所有从根节点开始的可达对象。因此,未被标记的对象就是未被引用的垃圾对象; 清除阶段:清除所有未被标记的对象。缺点: 标记和清除的过程效率不高(标记和清除都需要从头遍历到尾) 标记清除后会产生大量不连续的碎片。2、复制算法:(新生代的GC)概念: 将原有的内存空间分为两块,每次只使用转载 2016-03-30 00:00:16 · 386 阅读 · 0 评论 -
java各内存区域回收比例
我们的对象在内存中会被划分为5块区域,而每块数据的回收比例是不同的,根据IBM的统计,数据如下图所示:转载 2016-03-28 22:29:09 · 553 阅读 · 1 评论 -
解决HashMap并发问题
1 如上图:在HashMap的官方文档中已经指出,为了避免并发问题,需要使用Map m = Collections.synchronizedMap(new HashMap(...));的方式来实例化HashMap。否则可能会导致非同步访问。2 使用ConcurrentHashMap。原创 2016-03-30 23:10:01 · 1243 阅读 · 0 评论 -
线程的共享互斥
所谓的线程的共享互斥:就是指一个实例的一些方法在同一时刻,只能被一个线程执行。实现方式如下:最简单的办法是将方法加上synchronized关键字,这样,这个实例所有加了synchronized的方法在同一时间就只能被一个线程访问了。当方法结束后,锁释放。当锁释放后,那些因为锁定而不得其门的多个线程便开始抢夺锁定,一定会有一个线程获得锁定。补充说明:锁定和监视线原创 2016-03-31 23:55:36 · 655 阅读 · 0 评论 -
线程的协调
说起线程的协调,我们就必须要知道三个方法:wait,notify和notifyAll。具体讲三个方法之前先说一个概念wait set(也就是线程休息室)。每个实例都有wait set,wait set是一个在执行该实例的wait方法时、操作停止的线程的集合。进入wait set的线程如果想退出wait set,许满足下列条件:1 有其他线程以notify方法唤醒此线原创 2016-04-01 00:23:34 · 641 阅读 · 0 评论 -
java线程FAQ
1 java程序中,最少会执行一个线程?是的,java的程序中,至少会执行一个线程。2 Thread类的run方法被调用出来后,就会启动新的线程?不是的,要启动新的线程,必须使用start方法,而不是run方法。3 Rannable接口中声明有start方法与run方法?不是的,声明在Rannable接口中的只有run方法。源码如下图: 4转载 2016-04-02 23:10:47 · 287 阅读 · 0 评论 -
数组与字符串简单剖析
数组和字符串的基本概念就不在说了,相信到家都知道,我们今天一起讨论下基于数组实现的散列表和ArrayList和基于string的StringBuffer。1 散列表何为散列表?官方给出的定义是一种能够将键(key)-映射为值(value)从而实现快速查找的数据结构。我们接触比较多的HashMap就是对散列表的一种实现。2 ArrayList(动态数组)Array原创 2016-04-03 00:51:11 · 228 阅读 · 0 评论 -
HashMap的容量与扩容
HashMap的容量与扩容//默认的桶数组大小static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;//极限值(超过这个值就将threshold修改为Integer.MAX_VALUE(此时桶大小已经是2的31次方了),表明不进行扩容了)static final int MAXIMUM_CAPACITY = 1 << 30;//负载因子(请阅读转载 2016-04-03 14:54:18 · 359 阅读 · 0 评论 -
JAVA常用的垃圾回收器
Serial收集器:(串行收集器)这个收集器是一个单线程的收集器,但它的单线程的意义并不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程(Stop-The-World:将用户正常工作的线程全部暂停掉),直到它收集结束。收集器的运行过程如下图所示: 上图中: 新生代采用复制算法,Stop-The-World转载 2016-04-04 17:53:22 · 3932 阅读 · 0 评论 -
java堆内存的划分
根据对象的存活率(年龄),Java对内存划分为3种:新生代、老年代、永久代1、新生代: 比如我们在方法中去new一个对象,那这方法调用完毕后,对象就会被回收,这就是一个典型的新生代对象。 现在的商业虚拟机都采用这种收集算法来回收新生代,新生代中的对象98%都是“朝生夕死”的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块比较大的Eden空间和两块较小的Survivor空间,每次使用转载 2016-04-04 17:57:19 · 2363 阅读 · 0 评论 -
java动态获取jvm参数
JDK提供java.lang.management包, 其实就是基于JMX技术规范,提供一套完整的MBean,动态获取JVM的运行时数据,达到监控JVM性能的目的。 java.lang.management包,是Java SE 5 中新引入的 JMX API。package com.ldz.jvm;import java.lang.management.CompilationMXBean;imp转载 2016-04-04 21:01:47 · 4626 阅读 · 0 评论 -
jvm参数在哪里设置
在哪里设置,分好几种情况: 1、集成开发环境下启动并使用JVM,如eclipse需要修改根目录文件eclipse.ini; 2、Windows服务器下安装版Tomcat,可使用Tomcat7w.exe工具(tomcat目录下)和直接修改注册表两种方式修改Jvm参数; 3、Windows服务器解压版Tomcat注册Windows服务,方法同上; 4、解压版本的Tomcat, 通过startup转载 2016-04-04 21:26:51 · 17325 阅读 · 0 评论 -
java类加载机制
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。类加载的过程: 包括加载、链接(含验证、准备、解析)、初始化参考博文:http://www.knowsky.com/889010.html原创 2016-04-04 17:55:16 · 216 阅读 · 0 评论 -
java多线程编程关键字volatile,ThreadLocal和synchronized
1.volatile volatile主要是用来在多线程中同步变量。 在一般情况下,为了提升性能,每个线程在运行时都会将主内存中的变量保存一份在自己的内存中作为变量副本,但是这样就很容易出现多个线程中保存的副本变量不一致,或与主内存的中的变量值不一致的情况。 而当一个变量被volatile修饰后,该变量就不能被缓存到线程的内存中,它会告诉编译器不要进行任何移出读取和写入操作的优化,换句话说就转载 2016-04-12 21:22:07 · 387 阅读 · 0 评论 -
HashMap最大容量为什么是2的32次方
//默认的桶数组大小static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;//极限值(超过这个值就将threshold修改为Integer.MAX_VALUE(此时桶大小已经是2的31次方了),表明不进行扩容了)static final int MAXIMUM_CAPACITY = 1 << 30;//负载因子(请阅读下面体会这个值的用处)s原创 2016-04-24 16:41:46 · 10997 阅读 · 10 评论