Java四种引用--<深入理解Java虚拟机>学习笔记及个人理解(四) 书上P65. StrongReference(强引用) 类似Object obj = new Object() 这类的引用 就是强引用. SoftReference(软引用) 用来描述一些有用但并非必需的对象. 在系统将要发生内存溢出异常前, 将会把这些对象列进回收范围之中, 进行二次回收.(如果这次回收了之后, 内存还是不足, 那么就会抛出内存溢出异常) 执行下面这段代码的时候, 设置一下虚拟机参数-Xms2m -Xmx…
Java虚拟机内存溢出异常--<深入理解Java虚拟机>学习笔记及个人理解(三) 书上P39 1. 堆内存溢出 不断地创建对象, 而且保证创建的这些对象不会被回收即可(让GC Root可达). /** * 堆内存溢出demo * VM Options: -Xms6m -Xmx6m */ public class HeapOOM { static class OOMObejct { } public static void main(String[] args) { List<OOMObe…
java -- JVM的符号引用和直接引用 https://www.zhihu.com/question/50258991 在JVM中类加载过程中,在解析阶段,Java虚拟机会把类的二级制数据中的符号引用替换为直接引用. 1.符号引用(Symbolic References): 符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到目标即可.例如,在Class文件中它以CONSTANT_Class_info.CONSTANT_Fieldref_info.C…
一.请你谈谈实际的项目中在Java虚拟机会抛出哪些异常,每个异常都是怎么产生的? 1.java.lang.StackOverflowError 栈空间满了 public static void stackOverFlow(){ // 递归调用之后,把栈空间塞满了,当程序出现递归调用没有终止的时候,就会出现此类错误 // Exception in thread "main" java.lang.StackOverflowError stackOverFlow(); } 运行结果: 2.j…
Java虚拟机运行时栈帧结构(周志明书上P237页) 栈帧是什么? 栈帧是一种数据结构,用于虚拟机进行方法的调用和执行. 栈帧是虚拟机栈的栈元素,也就是入栈和出栈的一个单元. 2018.1.2更新(在网上看到一个更好的解释): 栈帧(Frame)是用来存储数据和部分过程结果的数据结构,同时也被用来处理动态链接 (Dynamic Linking).方法返回值和异常分派(Dispatch Exception). 栈帧在什么地方? 内存 -> 运行时数据区 -> 某个线程对应的虚拟机栈 ->…
Java虚拟机程序计数器 在书上的P39页 程序计数器干嘛的? 有了它,字节码解释器才可以知道下一条要执行的字节码指令是哪个. 无论是取下一条指令还是分支.循环.跳转.中断.线程恢复,都需要这个程序计数器. 程序计数器存在哪? 虚拟机区别于硬件,组成原理里学的程序计数器是用CS和IP寄存器来存,来表示指令地址. 而Java把程序计数器存在内存里. 我好像在操作系统中也听说过程序计数器? 是跟操作系统中的程序计数器有点类似. 在一个时刻,一个处理器只会执行一条线程,HotSpot中使用原生线程模型…
目录 前言 1. 自动内存管理 1.1 JVM运行时数据区 1.2 Java 内存结构 1.3 HotSpot 虚拟机创建对象 1.4 HotSpot 虚拟机的对象内存布局 1.5 访问对象 2. 垃圾回收与内存分配 2.1 判断对象是否存活 2.2 分代与内存分配.回收策略 2.3 垃圾回收算法(GC 的算法) 2.4 HotSpot 的算法实现 2.5 垃圾收集器 3. JVM 参数配置 3.1 JVM 内存参数简述 3.2 JVM 的 GC 收集器设置 4. JVM 性能调优案例分析 4.…
<深入理解Java虚拟机:JVM高级特性与最佳实践>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062566 内容简介 作为一位java程序员,你是否也曾经想深入理解java虚拟机,但是却被它的复杂和深奥拒之门外?没关系,<深入理解java虚拟机:jvm高级特性与最佳实践>极尽化繁为简之妙,能带领你在轻松中领略java虚拟机的奥秘.<深入理解java虚拟机:jvm高级特性与最佳实践>是近年来国内出版的唯一一本与…
Java一个重要的优势就是通过垃圾管理器GC (Garbage Collection)自动管理和回收内存,程序员无需通过调用方法来释放内存.也因此很好多的程序员可能会认为Java程序不会出现内存泄漏的问题,这种想法是不对的,当我们对内存使用不当的时候仍然可能会出现内存泄漏,并且问题相对与c++来说更隐秘,问题的根源排查起来也比较困难.不过,当我们了解了Java虚拟机内存区域,Java垃圾收集器之后,对于解决内存泄漏的问题也就不是什么困难的事情了. 相关阅读 1.深入理解java虚拟机之java内…
Jconsole,Java Monitoring and Management Console. Jconsole是JDK自带的监控工具,在JDK/bin目录下可以找到.它用于连接正在运行的本地或者远程的JVM,对运行在java应用程序的资源消耗和性能进行监控,并画出大量的图表,提供强大的可视化界面.而且本身占用的服务器内存很小,甚至可以说几乎不消耗. 一.介绍 JConsole 是一个内置 Java 性能分析器,可以从命令行(直接输入jconsole)或在 GUI shell (jdk\bin…
垃圾回收简介 ​ Java 会对内存进行自动分配与回收管理,使上层业务更加安全,方便地使用内存实现程序逻辑.在不同的 JVM 实现及不同的回收机制中,堆内存的划分方式是不一样的. ​ 简要地介绍下垃圾回收(Garbage Collection,GC).垃圾回收的主要目的是清除掉没有引用/不再使用的对象,自动释放内存.在了解垃圾回收算法之前,首先我们先要理解对象是怎么定义可以用被回收的. 引用计数算法 ​ 那么,GC 判断对象可以回收的依据是什么呢?有一种判断对象是否存活的算法是引用计数算法,该算…
前面在学习JVM的知识的时候,一般都需要利用相关参数进行分析,而分析一般都需要用到一些分析的工具,因为一般使用IDEA,而VisualVM对于IDEA也不错,所以就选择VisualVM来分析JVM性能,这篇文章就介绍一下如何利用VisualVM进行性能分析,以及在分析之前需要知道一些GC优化的原则,GC优化的目的,以及遇到问题时怎么去解决问题的方法. 1 为什么需要 开发大型 Java 应用程序的过程中难免遇到内存泄露.性能瓶颈等问题,比如文件.网络.数据库的连接未释放,未优化的算法等.随着应用…
第一章:Java体系结构介绍 1.Java为什么重要?       Java是为网络而设计的,而Java这种适合网络环境的能力又是由其体系结构决定的,可以保证安全健壮和平台无关的程序通过网络传播. 2.网络带来的机遇和挑战       平台无关性.安全性.网络移动性,Java体系的这三个方面共同使得Java和发展中的网络计算环境相得益彰. 3.Java体系结构       Java程序设计语言       Java class文件格式       Java应用编程接口(API)       Ja…
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 我们都知道,当虚拟机执行Java代码的时候,首先要把字节码文件加载到内存,那么这些类的信息都存放在内存中的哪个区域呢?当我们创建一个对象实例的时候,虚拟机要为对象分配内存,Java虚拟机又是如何配分内存的呢?这些都涉及到Java虚拟机的内存划分机制,今天我们就来探究一下Java虚拟机的内存模型. Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途以及创建和销毁的时间,有的区域随…
https://www.cnblogs.com/Eason-S/p/5658188.html https://blog.csdn.net/u013256816/article/details/51484031 本博文主要介绍了JVM(Java Virtual Machine)的组成部分以及它们内部的工作机制和原理.需要注意的是,虽然平时我们用的大多是Sun(现已被Oracle收购)JDK提供的JVM,但是JVM本身是一个规范,所以可以有多种实现,除了Hotspot外,还有诸如Oracle的JRo…
都知道Java是一门面向对象的编程语言,在Java程序运行过程中,无时无刻不在创建对象,所以这节来总结一下HotSpot虚拟机中的Java对象. 一.Java虚拟机对象的创建过程. 在语义层面创建一个对象就是new的过程,但是在虚拟机里面,对象(这里的对象指的是普通对象,不包括数组和class对象等)又是怎么被创建的呢? 1.当Java虚拟机收到一个new指令时,它首先会去常量池中检查是否存在这个类的符号引用.如果存在则会执行下一步,否则会创建一个符号引用放在常量池中(待考察): 2.当在常量池…
JAVA虚拟机体系结构 JAVA虚拟机的生命周期 一个运行时的Java虚拟机实例的天职是:负责运行一个java程序.当启动一个Java程序时,一个虚拟机实例也就诞生了.当该程序关闭退出,这个虚拟机实例也就随之消亡.如果同一台计算机上同时运行三个Java程序,将得到三个Java虚拟机实例.每个Java程序都运行于它自己的Java虚拟机实例中. Java虚拟机实例通过调用某个初始类的main()方法来运行一个Java程序.而这个main()方法必须是共有的(public).静态的(static).返…
Java虚拟机 Java虚拟机之所以被称之为是虚拟的,就是因为它仅仅是由一个规范来定义的抽象计算机.因此,要运行某个Java程序,首先需要一个符合该规范的具体实现. Java虚拟机的生命周期 一个运行时的Java虚拟机实例的天职就是:负责运行一个Java程序.当启动一个Java程序时,一个虚拟机实例就诞生了.当该程序关闭退出,这个虚拟机实例也就随之消亡.每个Java程序都运行于它自己的Java虚拟机实例中. Java虚拟机实例通过调用某个初始类的main()方法来运行一个Java程序.而这个ma…
转自:http://www.cnblogs.com/java-my-life/archive/2012/08/01/2615221.html JAVA虚拟机的生命周期 一个运行时的Java虚拟机实例的天职是:负责运行一个java程序.当启动一个Java程序时,一个虚拟机实例也就诞生了.当该程序关闭退出,这个虚拟机实例也就随之消亡.如果同一台计算机上同时运行三个Java程序,将得到三个Java虚拟机实例.每个Java程序都运行于它自己的Java虚拟机实例中. Java虚拟机实例通过调用某个初始类的…
一个运行时的Java虚拟机实例的天职是:负责运行一个java程序.当启动一个Java程序时,一个虚拟机实例也就诞生了.当该程序关闭退出,这个虚拟机实例也就随之消亡.如果同一台计算机上同时运行三个Java程序,将得到三个Java虚拟机实例.每个Java程序都运行于它自己的Java虚拟机实例中. Java虚拟机实例通过调用某个初始类的main()方法来运行一个Java程序.而这个main()方法必须是共有的(public).静态的(static).返回值为void,并且接受一个字符串数组作为参数.任…
一个运行时的Java虚拟机实例的天职是:负责运行一个java程序.当启动一个Java程序时,一个虚拟机实例也就诞生了.当该程序关闭退出,这个虚拟机实例也就随之消亡.如果同一台计算机上同时运行三个Java程序,将得到三个Java虚拟机实例.每个Java程序都运行于它自己的Java虚拟机实例中. Java虚拟机实例通过调用某个初始类的main()方法来运行一个Java程序.而这个main()方法必须是共有的(public).静态的(static).返回值为void,并且接受一个字符串数组作为参数.任…
这一节穿插一点如何在eclipse中配置并查看某个Java应用GC日志的知识点,我也是通过调研知道的,因为书中写的不是很详细,主要是为下一节做准备. 一.eclipse中配置GC 在eclipse中如果要给某个应用配置GC日志,首先右击该应用(main方法所在的类)->Run As->Run Configurations->Arguments,在VM arguments中配置如下参数: -Xms20m //最小堆内存-Xmx20m //最大堆内存-XX:+PrintGCTimeStamp…
如果对C++这门语言熟悉的人,再来看Java,就会发现这两者对垃圾(内存)回收的策略有很大的不同. C++:垃圾回收很重要,我们必须要自己来回收!!! Java:垃圾回收很重要,我们必须交给系统来帮我们完成!!! 我想这也能看出这两门语言设计者的心态吧,总之,Java和C++之间有一堵由内存动态分布和垃圾回收技术所围成的高墙,墙外面的人想进去,墙里面的人想出来. 本篇博客我们就来详细介绍Java的垃圾回收策略. 1.为什么要进行垃圾回收 我们知道Java是一门面向对象的语言,在一个系统运行中,会…
深入理解java虚拟机系列 深入理解Java虚拟机笔记---内存区域 深入理解Java虚拟机笔记---判断对象是否存活 深入理解Java虚拟机笔记---垃圾收集算法 深入理解Java虚拟机笔记---垃圾收集器 深入理解Java虚拟机笔记---内存分配与回收策略 深入理解Java虚拟机笔记---class类文件结构概述 深入理解Java虚拟机笔记---class类文件魔数,版本,常量池 深入理解Java虚拟机笔记---访问标志 深入理解Java虚拟机笔记---类索引,父类索引,接口索引集合 深入理…
Java和C++之间有一堵由内存管理和垃圾收集技术所围成的“高墙”,墙外的人想进去,墙内的人却想出来.  ------摘自<深入理解Java虚拟机> 作为一个Java程序员,因为虚拟机的好处,在开发过程中一般不用关心内存分配和垃圾回收方面的内容,这就让我在跟C++的朋友聊天或沟通的时候,总觉得自己是个假的程序员,虽然我们不用自己动手去做这两件事情,但还是很有必要去了解一下这方面的原理,这样万一真碰到内存溢出的问题,就不至于束手无策了.下面是通过看书总结的一些内容. 一.Java内存区域划分 J…
JVM的四种引用状态 在Java虚拟机5:Java垃圾回收(GC)机制详解一文中,有简单提到过JVM的四种引用状态,当时只是简单学习,知道有这么一个概念,对四种引用状态理解不深.这两天重看虚拟机这部分的时候,写了很多例子详细研究了一下JVM的几种引用,对于JVM的引用理解加深了不少,因此总结写一篇文章总结并分享下. 首先,还是先从JVM四种引用状态开始,这部分摘抄自周志明老师的<深入理解Java虚拟机:JVM高级特性与最佳实践>一书. 在JDK1.2之前,Java中的引用的定义很传统:如果re…
JVM的四种引用状态 在Java虚拟机5:Java垃圾回收(GC)机制详解一文中,有简单提到过JVM的四种引用状态,当时只是简单学习,知道有这么一个概念,对四种引用状态理解不深.这两天重看虚拟机这部分的时候,写了很多例子详细研究了一下JVM的几种引用,对于JVM的引用理解加深了不少,因此总结写一篇文章总结并分享下. 首先,还是先从JVM四种引用状态开始,这部分摘抄自周志明老师的<深入理解Java虚拟机:JVM高级特性与最佳实践>一书. 在JDK1.2之前,Java中的引用的定义很传统:如果re…
为什么要了解GC 我们都知道Java开发者在开发过程中是不需要关心对象的回收的,因为Java虚拟机的原因,它会自动回收那些失效的垃圾对象.那我们为什么还要去了解GC和内存分配呢? 答案很简单:当我们需要排查各种内存溢出.内存泄漏时,当垃圾收集器成为系统达到更高并发量的瓶颈时,我们就需要对这些"自动化"的技术实施必要的监控和调节. 回收哪些对象 我们知道在Java内存运行时数据区域中,虚拟机栈.本地方法栈和程序计数器是线程隔离的数据区,随线程而生,随线程而灭:栈中的栈帧随着方法的进入和退…
在JVM中类加载过程中,在解析阶段,Java虚拟机会把类的二级制数据中的符号引用替换为直接引用. 1.符号引用(Symbolic References): 符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到目标即可.例如,在Class文件中它以CONSTANT_Class_info.CONSTANT_Fieldref_info.CONSTANT_Methodref_info等类型的常量出现.符号引用与虚拟机的内存布局无关,引用的目标并不一定加载到内存中…
1.前言 HotSpot采取了可达性分析算法用来判断对象是否被能被GC,无论是引用计算法还是可达性分析算法都是判断对象是否存在引用来判断对象是否存活.如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用.为了丰富的描述对象与对象之间的关系,更为了实现系统缓存的原因,Java建立了四种引用级别. 2.四种引用级别 在JDK1.2后,Java对引用的概念进行了扩充,将引用分为强引用.软引用.弱引用和虚引用4种,这4种引用强度依次减弱. 最后,下面通过…