JVM学习笔记
文章平均质量分 84
smile坊
越努力,越幸运
展开
-
JVM七大垃圾回收器下篇G1(Garbage First)
截止JDK 1.8,一共有7款不同的垃圾收集器。每一款不同的垃圾收集器都有不同的特点,在具体使用的时候,需要根据具体的情况选用不同的垃圾收集器。不同厂商、不同版本的虚拟机实现差别很大。1.两个收集器间有连线,表明它们可以搭配使用: Serial/Serial 0ld、Serial /CMS、ParNew/Serial 0ld、ParNew/CMS、 Parallel Scavenge/Serial 01d、Parallel Scavenge/Parallel 0ld、G1;原创 2023-04-02 20:03:20 · 997 阅读 · 2 评论 -
JVM七大垃圾回收器上篇Serial、ParNeW、Parallel Scavenge、 Serial Old、 Parallel Old、 CMS、 G1
这种垃圾收集器大家了解,现在已经不用串行的了。而且在限定单核cpu才可以用。现在都不是单核的了。对于交互较强的应用而言,这种垃圾收集器是不能接受的。一般在Javaweb应用程序中是不会采用串行垃圾收集器的。原创 2023-04-02 19:07:06 · 1148 阅读 · 0 评论 -
JVM关于GC的日志分析
通过阅读GC日志,我们可以了解Java虛拟机内存分配与回收策略。内存分配与垃圾回收的参数列表。原创 2023-04-02 16:17:21 · 1185 阅读 · 0 评论 -
JVM强引用、软引用、弱引用、虚引用、终结器引用垃圾回收行为总结
Reference子类中只有终结器引用是包内可见的(该类没有被public修饰),其他3种引用类型均为public class,可以在应用程序中直接使用。原创 2023-03-31 22:27:20 · 368 阅读 · 0 评论 -
JVM垃圾回收行为的并行与并发
并行(Parallel) :指多条垃圾收集线程并行工作,但此时用户线程仍处于等待状态。程序的并发(Concurrent)串行(Serial)原创 2023-03-31 17:59:04 · 140 阅读 · 0 评论 -
JVM内存溢出与内存泄漏
注意,这里的存储空间并不是指物理内存,而是指Java层面JVM虚拟内存大小,这个虚拟内存大小取决于磁盘交换区设定的大小。Forgotten Reference:由于某种原因没有/忘记断开的引用,导致内存泄漏。原创 2023-03-29 21:10:56 · 379 阅读 · 0 评论 -
Java垃圾回收System.gc()的理解
/强制调用 失去引用的对象的finalize()方法。System.out.println("SystemGCTest 重写了finalize()");在一些特殊情况下,如我们正在编写一个性能基准,我们可以在运行之间调用System.gc()。//强制调用 失去引用的对象的finalize()方法。//与Runtime.getRuntime().gc();从而证明了System.gc()无法保证GC一定执行.原创 2023-03-29 18:11:20 · 301 阅读 · 0 评论 -
JVM垃圾回收算法
➢如果只针对Java堆中的某一块区域进行垃圾回收(比如:典型的只针 对新生代),必须考虑到内存区域是虚拟机自己的实现细节,更不是孤立封闭的,这个区域的对象完全有可能被其他区域的对象所引用,这时候就需要一.并将关联的区域对象也加入GC Roots集合中去考虑,才能保证可达性分析的准确性。将活着的内存空间分为两块,每次只使用其中一块,在垃圾回收时将正在使用的内存中的存活对象复制到未被使用的内存块中,之后清除正在使用的内存块中的所有对象,交换两个内存的角色,最后完成垃圾回收。堆中S0和S1使用的就是复制算法。原创 2023-03-28 14:37:53 · 549 阅读 · 0 评论 -
JVM垃圾回收概述
什么是垃圾( Garbage) 呢?➢垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。➢外文: An object is considered garbage when it can no longer be reached from any pointer in the runningprogram.如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出。原创 2023-03-27 11:08:28 · 319 阅读 · 0 评论 -
JVM字符串常量池StringTable
jdk1.6中,将这个字符串对象尝试放入串池。➢如果字符串常量池中有,则并不会放入。返回已有的串池中的对象的地址➢如果没有,会把此对象复制一份,放入串池,并返回串池中的对象地址Jdk1.7起,将这个字符串对象尝试放入串池。➢如果字符串常量池中有,则并不会放入。返回已有的串池中的对象的地址➢如果没有,则会把对象的引用地址复制一份,放入串池,并返回串池中的引用地址。原创 2023-03-22 22:13:01 · 268 阅读 · 0 评论 -
JVM运行时数据区—堆
1.一个jvm实例只存在一个堆内存,堆也是java内存管理的核心区域2.Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间(堆内存的大小是可以调节的)3.《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。4.所有的线程共享java堆,在这里还可以划分线程私有的缓冲区(TLAB:Thread Local Allocation Buffer).(面试问题:堆空间一定是所有线程共享的么?不是,TLAB线程在堆中独有的)原创 2023-03-15 20:11:48 · 385 阅读 · 1 评论 -
JVM运行时数据区—方法区
预知JVM前置内容讲解,本人博客往前翻预知JVM后置内容讲解,本人博客往后翻。原创 2023-03-13 22:53:42 · 277 阅读 · 1 评论 -
JVM运行时数据区—本地方法栈
如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的本地方法栈,那么java虚拟机将会抛出一个OutOfMemoryError异常。如果JVM产品不打算支持native方法,也可以无需实现本地方法栈。如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个StackOverFlowError异常。1.Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法(一般非Java实现的方法)的调用。原创 2023-03-12 23:26:06 · 67 阅读 · 0 评论 -
JVM—本地方法接口
目前该方法的是用越来越少了,除非是与硬件有关的应用,比如通过java程序驱动打印机或者java系统管理生产设备,在企业级应用已经比较少见。,一个Native Method 是这样一个java方法:该方法的底层实现由非Java语言实现,比如C。这个特征并非java特有,很多其他的编程语言都有这一机制,比如在C++ 中,你可以用extern “C” 告知C++ 编译器去调用一个C的函数。java使用起来非常方便,然而有些层次的任务用java实现起来不容易,或者我们对程序的效率很在意时,问题就来了。原创 2023-03-12 19:43:05 · 398 阅读 · 0 评论 -
Java虚拟机栈—栈帧
这些数据类型包括各类基本数据类型、对象引用(reference),以及returnAddressleixing3.由于局部变量表是建立在线程的栈上,是线程私有的数据,因此不存在数据安全问题。原创 2023-03-08 23:42:04 · 1355 阅读 · 0 评论 -
JVM运行时数据区—Java虚拟机栈
如果java虚拟机栈可以动态拓展,并且在尝试拓展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那java虚拟机将会抛出一个。9.如果当前方法调用了其他方法,方法返回之际,当前栈帧会传回此方法的执行结果给前一个栈帧,接着,虚拟机会丢弃当前栈帧,使得前一个栈帧重新成为当前栈帧。4.JVM直接对java栈的操作只有两个,就是对栈帧的压栈和出栈,遵循先进后出/后进先出的和原则。7.如果在该方法中调用了其他方法,对应的新的栈帧会被创建出来,放在栈的顶端,成为新的当前栈帧。原创 2023-03-05 23:57:09 · 772 阅读 · 0 评论 -
JVM运行时数据区—程序计数器
JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。一个线程对应一个 JVM Stack。JVM Stack 中包含一组 Stack Frame。当 JVM 调用一个 Java 方法时,它从对应类的类型信息中得到此方法的局部变量区和操作数栈的大小,并据此分配栈帧内存,然后压入 JVM 栈中。原创 2023-03-05 14:21:44 · 246 阅读 · 0 评论 -
JVM运行时数据区划分
java虚拟机定了了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与县城一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁。如图,灰色的区域为单独线程私有的,红色的为多个线程共享的,即。原创 2023-03-04 18:46:27 · 544 阅读 · 0 评论 -
JVM—类加载子系统
1.对于用户自定义类来说:将使用系统类System Class Loader加载器中的AppClassLoader进行加载2.java核心类库都是使用引导类加载器BootStrapClassLoader加载的/*** ClassLoader加载//获取系统类加载器 ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();原创 2023-03-03 10:21:08 · 366 阅读 · 0 评论 -
JVM
Exact VMHotSpot VM :HotSpot指热点代码探测技术BEA JRockit:(BEA 已被Oracle收购) 专注于服务端应用,世界最快的jvm之一IBM J9Taobao JVM: 目前已经在淘宝、天猫上线,替换了Oracle官方JVM;Graal VM: Oracle 2018年4月公开,口号 Run Programs Faster Anywhere.最可能替代HotSpot的产品。原创 2023-03-02 20:45:17 · 692 阅读 · 0 评论