首页 > 代码库 > JDK拾遗

JDK拾遗

1、内存泄露

(1)虚拟机中存在程序无法使用的内存区域

比如队列出队的时候,没有删除对改元素的引用,导致元素没用了,引用仍在,但无法使用


(2)程序中存在大量存活时间过长的对象

比如基于内存的缓存实现,hashmap中缓存对象大而缓存时间长


2、虚拟机中对象的三种可能状态

(1)可达状态

(2)可复活状态

(3)不可达状态


3、永久代内存不足

(1)String的intern方法(JDK7之前)

jdk7的话,是在年老代里头


(2)加载的java类过多

比如使用ASM创建代理类,或者使用Groovy等


4、JVM的作用

运行java程序时,需要指定一个main类,虚拟机启动之后,会从main方法开始执行,当main方法执行结束之后,java虚拟机会自动终止。每个java虚拟机在运行时是低层操作系统上的一个独立的进程。

虚拟机的作用主要有两个:一是为应用程序屏蔽低层操作系统的细节;二是为应用程序提供必要的运行时的支持能力。


5、字节码的执行

java源代码经过编译器编译之后,被转换为java字节码。虚拟机在执行字节码的时候,一般采用的是即时编译的方式,即Just-in-time(JIT)编译方式,在运行时把字节码中的指令直接转换为低层操作系统平台上的原生指令。这会带来一定的性能问题。

(1)对热点进行优化

把时间用在对重要代码的优化,减少代码优化的时间开销

(2)方法内联

把被调用方法的代码直接内联到调用的地方


6、垃圾回收器的运行方式

(1)串行

垃圾回收器运行时,程序的运行被暂停,执行起来简单(如果只有一个CPU只能串行)

(2)并行

垃圾回收器与程序同时运行,在绝大部分时候不会影响程序的运行,但是由于回收时程序仍然在运行,内存状态在变化,实现起来较为复杂。


7、GC时存活对象的处理方式

(1)压缩

把存活对象移动到内存区域的一端,使内存中的空闲区域变成连续的。

好处:分配内存时速度快(空间连续,分配快,判断是否有足够的空间区域也快)

坏处:移动操作需要额外时间


(2)不压缩

存活对象仍然被保留在原始位置。

好处:垃圾回收可以很快完成

坏处:分配内存过程会比较慢(空间不连续,需要逐个查找可用的内存块来满足当前分配请求)


(3)复制

把存活对象复制到另外一个区域中。

好处:复制完后,之前的内存区域全部可用,内存分配快

坏处:需要额外时间、空间进行复制