
JVM
Yisnow.
这个作者很懒,什么都没留下…
展开
-
String在虚拟机的实现
1、String在虚拟机的实现不变性可以提高多线程访问的性能,因为对象不可变因此对于所有线程都是只读的,多线程访问时不加同步也不会产生数据的不一致,故减少了系统开销;针对常量池的优化当两个String对象拥有相同的值时只引用常量池中的同一个拷贝,可以大幅度节省内存空间;类的final定义String类在系统中不可能有任何子类,这是对系统安全性的保护;2、String的内存泄漏内存泄漏:由于不再使用的对象占据内存不被释放导致可用内存不断减小最终导致内存泄漏;在JDK1.6中,String原创 2020-10-21 15:43:01 · 264 阅读 · 0 评论 -
分析Java堆:内存溢出的原因
1、堆溢出 一般来说,绝大部分Java的内存溢出都属于堆溢出。原因是因为大量对象占据了堆空间,这些对象都持有强引用导致无法回收,当对象大小之和大于Xmx参数指定的堆空间时就会发生堆溢出;解决办法使用Xmx参数指定一个更大的堆空间;由于堆空间不可能无限增长,分析找到大量占用对空间的对象,在应用程序上做出优化;2、直接内存溢出在Java的NIO中,支持直接内存的使用,通过Java代码获得一块堆外的内存空间。直接内存的申请速度一般比堆内存慢,但是访问速度快于堆内存。对于那些可复用的,并且会被经原创 2020-10-21 15:39:39 · 7075 阅读 · 0 评论 -
垃圾回收概念
1、分代算法分代算法将内存区间根据对象的特点分为几块,根据每块内存区间的特点,使用不同的回收算法,以提高垃圾回收的效率;JVM会将所有的新建对象放入新生代的内存区域,新生代的对象90%会很快被回收。新生代比较适合使用复制算法;老年代的对象都是经过几次回收后存活下来的。因此老年代采取标记压缩或者标记清除算法。新生代回收的频率很高,但是每次耗时都很短,老年代回收频率低但是消耗时间多。虚拟机使用卡表的数据结构,是一个比特位集合,每一个集合位表示老年代的某一个区域的所有对象是否持有新生代对象的引用。这样在原创 2020-10-20 14:12:39 · 270 阅读 · 0 评论 -
软引用和引用队列
软引用可以和一个引用队列联合使用,如果软引用所引用的对象被垃圾回收器回收,JVM就会把这个软引用加入到与之关联的引用队列中;1、为什么需要软引用首先,我们看一个雇员信息查询系统的实例。我们将使用一个Java语言实现的雇员信息查询系统查询存储在磁盘文件或者数据库中的雇员人事档案信息。作为一个用户,我们完全有可能需要回头去查看几分钟甚至几秒钟前查看过的雇员档案信息(同样,我们在浏览WEB页面的时候也经常会使用“后退”按钮)。这时我们通常会有两种程序实现方式:一种是把过去查看过的雇员信息保存在内存中,每一原创 2020-10-20 13:01:18 · 918 阅读 · 0 评论 -
那些场景产生OOM?怎么解决?
1、堆内存溢出堆内存用来存储对象实例,只要不停的创建对象,并且保证GC Roots和对象之间有可达路径避免垃圾回收,那么在对象数量超过最大堆的大小限制后很快就能出现这个异常。2、方法区和元空间溢出方法区和堆一样,是线程共享的区域,包含class文件信息、运行时常量池、常量池。不一定非要是class文件中的常量池中的内容才能进入运行时常量池,运行期间也可以将新的常量放入池中,比如String的intern()方法。intern()本身是一个native方法,它的作用是:如果字符串常量池中已经包含一个等原创 2020-09-26 19:53:47 · 347 阅读 · 0 评论 -
垃圾回收相关算法
垃圾回收相关算法Minor GC、Major GC、Full GC部分收集:包含Minor GC和Major GC新生代收集(Minor GC):只是新生代的垃圾收集。老年代收集(Major GC):只是老年代的垃圾收集。整堆收集Full GC:收集整个java堆和方法区的垃圾收集。很多时候Major GC会和Full GC混淆使用,需要具体分辨是老年代回收还是整堆回收。垃圾回收触发机制Minor GC触发机制:1、当年轻代空间不足时,这里的年轻代指的是Eden区,Survi原创 2020-08-10 09:04:27 · 113 阅读 · 0 评论 -
8、垃圾回收相关算法
垃圾回收相关算法Minor GC、Major GC、Full GC部分收集:包含Minor GC和Major GC新生代收集(Minor GC):只是新生代的垃圾收集。老年代收集(Major GC):只是老年代的垃圾收集。整堆收集Full GC:收集整个java堆和方法区的垃圾收集。很多时候Major GC会和Full GC混淆使用,需要具体分辨是老年代回收还是整堆回收。垃圾回收触发机制Minor GC触发机制:1、当年轻代空间不足时,这里的年轻代指的是Eden区,Survi原创 2020-07-24 10:48:54 · 153 阅读 · 0 评论 -
JVM5、方法区
5、方法区5.1 栈、堆、方法区的交互关系5.2 方法区的理解是一种虚拟机规范,而元空间是HotSpotJVM对方法区的一种实现;HotSpotJVM中把方法区看作是非堆目的是要和堆分开,所以将方法区看作是一块独立于Java堆的内存空间;5.3 方法区的内部结构类型信息对每个加载的类型(类class,接口interface,枚举enum,注解annotation)。JVM在方法区存储以下信息:这个类型的完整有效类名这个类型直接父类完整有效名(interface和Object都没原创 2020-07-24 10:45:46 · 143 阅读 · 0 评论 -
JVM4、堆
堆4.1 堆的核心概述一个进程对应一个JVM实例,一个JVM实例只存在一个堆内存Java堆区在JVM启动的时候被创建,其看见大小也就确定了。其大小是可以调节的。所有的线程共享Java堆,在这里还可以划分私有的缓冲区(Thread Local Allocation Buffer,TLAB)。数组和对象可能永远不会存储在栈上,因为栈帧保存引用,这个引用指向对象或者数组在堆中的位置。在方法结束后,堆中的对象不会马上被移除仅仅在垃圾收集时才会被移除。堆是GC执行垃圾回收的重点区域。堆空间细分原创 2020-07-24 10:38:52 · 155 阅读 · 0 评论 -
JVM3、运行时数据区
3、运行时数据区JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高校稳定运行。不同的JVM对于内存划分方式和管理策略存在着部分差异。每个线程:独立包括程序计数器、本地栈、虚拟机栈线程间共享:堆、堆外内存3.1 程序计数器任何时间每个线程只有一个方法执行即当前方法是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等都需要依赖这个计数器完成唯一一个没有规定OutOfMemoryError的区域3.2 虚拟机栈每个线程在创建时都会创建一个虚原创 2020-07-24 10:36:21 · 147 阅读 · 0 评论 -
JVM2、类加载子系统
2、类加载子系统2.1 内存结构概述注:class loader扮演一个快递员角色,.class->JVM->成为元数据模板2.2 加载过程类的加载过程1、通过一个类的全限定名获取定义此类的二进制字节流2、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构3、在内存中生成一个代表该类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。链接阶段初始化阶段2.3 类加载器分类2.4 双亲委派机制双亲父类加载器(par原创 2020-07-24 10:34:24 · 123 阅读 · 0 评论 -
JVM1-内存结构
1、JVM内存结构分析JVM的内存结构主要就是分析JVM运行时数据存储区域。JVM运行时数据区主要包括堆、栈、方法区、程序计数器。而JVM的优化问题主要是在线程共享的数据区中如堆、方法区。1.1 程序计数器程序计数器(Program Counter Register)是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器,指向下一个将要执行的指令代码,由执行引擎来读取下一条指令。更确切的说,一个线程的执行,是通过字节码解释器改变当前线程的计数器的值,来获取下一条需要执行的字节码指令,从而确原创 2020-07-24 10:21:20 · 167 阅读 · 0 评论