
JVM
义臻
你可以通过知乎ID找到我:义臻
转摘文章请注明出处。
展开
-
JVM-内存泄漏闲谈
最近,参加了一个JAVA工程师的面试,被问及内存泄露的一些问题,回来又详细的了解了一下,在此和大家分享。 垃圾回收是JVM的一大特色,它能够让java程序员无需关注对象的释放过程。理论上来讲,JVM是不存在内存泄露的问题的。但程序是人写的,难免犯错误。其中最常见的错误就是在程序中,明明某个对象已经是垃圾对象,但是我们还不经意间保留着到这些对象的引用。如下代码: import java.util.原创 2016-08-11 14:12:15 · 516 阅读 · 0 评论 -
JVM-类型的生命周期
类型的生命周期包括:装载,连接,初始化,卸载(和类装载器有关,不一定有)。装载:将类的结构信息装载到内存中(这其中就包括很重要的角色--类的常量池,但是符号引用还没有解析),装载完毕之后会生成一个该类的Class对象。连接:连接又包括验证,准备和解析。验证就是检验class文件语法等正确性。准备是为类变量分配内存并为他赋默认值。解析是将在装载阶段装载到内存中的常量池的符号引用解析为直接引用,这一步...原创 2016-08-11 14:10:07 · 1304 阅读 · 0 评论 -
JVM-体系结构
大家都知道,java号称一次编译,处处运行。之所以能够这么强大,jvm功不可没。直接上图: 笔者看过这张图很多次,一直没能理解。一直到最近,觉得能够明白到写博客了。一个java文件通过编译可以得到class文件,class文件就是java虚拟机能够执行的二进制文件。而程序在运行的时候,需要在内存中有数据空间。在jvm中,这个数据空间叫做运行时数据区。运行时数据区,一共有5类空间,分别是:方法区,原创 2016-08-11 14:09:49 · 417 阅读 · 0 评论 -
JVM-典型的垃圾收集器
从前面的博客知道,类实例化产生的对象在堆区中存储,而堆区不可能无限大,因此需要有垃圾收集器。JVM的垃圾收集器干两件事: 1 碎片整理:整理内存碎片 2 垃圾回收:以某种算法发现垃圾,并使用某种算法清除垃圾。 JVM常见的垃圾发现算法包括引用计数和追踪。其中,引用计数就是为每个对象维护一个数字,这个数字记录了当前对象被引用的次数。当这个数字变为0的时候,说明该对象可以被垃圾回收了。但是引用计数无原创 2016-08-11 14:10:33 · 371 阅读 · 0 评论 -
JVM-常量池
学习JVM之后,发现对常量池的理解又深入了一些。下面就从JVM的层面去理解JAVA程序中那些常见的语句。读过笔者博客“JVM-类的生命周期“http://yizhenn.iteye.com/blog/2290619的读者都应该已经知道,JVM在加载class文件时经历了装载,连接,初始化的过程,其中连接又包括验证,准备和解析。我们就来说说这个解析。所谓解析,就是将class文件中的静态常量池中的符...原创 2016-08-11 14:10:40 · 1076 阅读 · 0 评论 -
JVM-线程同步
在语言级别支持多线程是java语言的一大优势。之前的java并发系列博客中介绍了一些相关的基础知识。这里我们来看看java虚拟机对java多线程的支持。 JVM对多线程的支持有两种: 1 互斥:通过对象锁来实现 2 协同:通过Object类的wait,notify,notifyAll方法来实现 关于互斥: 我们讲过,在JVM的运行时数据区,方法区和堆区是被多有线程共享的,java栈和PC寄存器原创 2016-08-11 14:10:25 · 3811 阅读 · 0 评论 -
JVM-对象的生命周期
当一个类型经历了装载,连接,初始化之后,就可以为这个类变量实例化一个对象了。在java中,一个类可以被显式或者隐式的实例化。显式实例化有四种方法:1 使用new操作符2 调用java.lang.reflect.Constructor的newInstance方法3 调用现有对象的clone方法4 通过java.io.ObjectInputStream的readObject方法反序列化隐式实例化就是指...原创 2016-08-11 14:10:16 · 738 阅读 · 0 评论 -
JVM-java字符编码
在JVM内部,所有的字符都是用Unicode编码的。而对于JVM所在操作系统的文件系统,可能有不同的编码类型。 由于JVM和OS文件系统所使用的编码方式不同,JVM在与操作系统进行数据交互的时候,就会进行编码转换。因此可以说,所有的乱码问题一定是JVM和OS文件系统进行数据交互时候出了问题。 import java.io.*; public class Demo{ public stati原创 2016-08-11 14:10:48 · 864 阅读 · 0 评论 -
JVM-ClassLoader装载class的流程
在JVM中,有三种默认的类加载器,分别为Bootstrap ClassLoader,Extension CLassLoader以及App ClassLoader。其中,Bootstrap Classloader用于加载JAVA的核心类库,Extension Classloader用于加载JAVA的扩展类库,而App ClassLoader则用于装载类路径中的用户自定义的类。 具体的流程如下:原创 2016-08-11 14:12:07 · 315 阅读 · 0 评论 -
Java 内存区域和GC机制
转发博客 Java 内存区域和GC机制 JVM监控和调优转载 2018-11-09 16:15:29 · 231 阅读 · 0 评论