垃圾信息

JAVA 几种引用类型学习

ⅰ亾dé卋堺 提交于 2020-03-31 08:02:10
1、对象的强、软、弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachable)状态,程序才能使用它。从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。 图1为对象应用类层次 1)强引用(StrongReference) 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java 虚拟机 宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。 2)软引用(SoftReference) 如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存(下文给出示例)。 软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。 3) 弱引用(WeakReference) 弱引用与软引用的区别在于:弱引用的对象拥有更短暂的生命周期

理解Android虚拟机体系结构

社会主义新天地 提交于 2020-02-24 17:32:10
1 什么是Dalvik虚拟机   Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的Java应用程序的运行。dex格式是专门为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Google对其进行了特定的优化,使得Dalvik具有高效、简洁、节省资源的特点。从Android系统架构图知,Dalvik虚拟机运行在Android的运行时库层。 2 Dalvik虚拟机的功能   Dalvik作为面向Linux、为嵌入式操作系统设计的虚拟机,主要负责完成对象生命周期管理、堆栈管理、线程管理、安全和异常管理,以及垃圾回收等。Dalvik充分利用Linux进程管理的特定,对其进行了面向对象的设计,使得可以同时运行多个进程,而传统的Java程序通常只能运行一个进程,这也是为什么Android不采用JVM的原因。Dalvik为了达到优化的目的,底层的操作大多和系统内核相关,或者直接调用内核接口。另外,Dalvik早期并没有JIT编译器,直到Android2.2才加入了对JIT的技术支持。 3 Dalvik虚拟机和Java虚拟机的区别   本质上,Dalvik也是一个Java虚拟机。但它特别之处在于没有使用JVM规范。大多数Java虚拟机都是基于栈的结构(详情请参考:

0047JVM和tomcat优化

a 夏天 提交于 2020-01-08 13:40:25
java –help 查看标准参数 java –X 输出非标准的参数 jps查看正在运行的java进程 jps –l 列出正在运行的java进程的全路径 jinfo –flags 进程id 查看当前进程对应的jvm的所有运行参数 jinfo –flag 参数名 进程id 查看当前进程对应的jvm的指定参数的值 jstat命令查看对内存的使用情况 比如tomcat启动之后,可通过jstat –class tomcat的进程id 来查看相关信息 具体操作可以如下,就知道怎么使用jstat了: 使用jstat可以对内存使用情况进行统计分析 jmap可以获得更加详细 信息,可以对内存使用情况进行汇总,对内存溢出的定位与分析。 jmap用法如下图: 如: 1) jmap –heap 进程id 查看堆内存使用情况 2) jmap –histo <pid> | more 查看所有对象,包括活跃的和非活跃的 3) jmap –histo:live <pid> | more 查看活跃对象 4) 将当前堆内存使用情况dump到文件中进行分析,语法如下: jmap –dump:format=b,file=dumpFileName <pid> 事例:jmap –dump:format=b,file=/tmp/testDump.dat 5967 jhat命令对dump文件进行分析,jhat用法如下图: 比如

Java程序线上故障排查

↘锁芯ラ 提交于 2019-12-04 13:59:41
目录 一、Linux 内存和cpu 网络 磁盘 /proc文件系统 二、JVM Java堆和垃圾收集器 gc日志分析 JVMTI介绍 Attach机制 java自带工具 三、三方工具 jprofile arthas (类似btrace的工具) gceasy 四、实际案例 连接泄漏 String拼接导致内存溢出 堆内存占用过大 CPU占用高问题 aerospike线程阻塞导致内存溢出问题 问题 这篇文章是在公司做了不少的线上Java服务故障排查和优化之后的一个总结,可以作为一个工具清单,在分析问题的时候需要有整体思路:全局观,先从系统层面入手,大致定位方向(内存,cpu,磁盘,网络),然后再去分析具体的进程。 一、Linux 内存和cpu 内存和cpu问题是出问题最多的一个点,因为有些命令如top同时可以观察到内存和cpu所以放在一起。 top命令 常用参数: -H 打印具体的线程, -p 打印某个进程 进入后 按数字1 可以切换cpu的图形看有几个核 下面是我的测试环境shell: top - 14:28:49 up 7 min, 3 users, load average: 0.08, 0.26, 0.19 Tasks: 221 total, 2 running, 219 sleeping, 0 stopped, 0 zombie %Cpu(s): 5.1 us, 3.4 sy,

jmc使用说明

匿名 (未验证) 提交于 2019-12-03 00:38:01
实验JDK版本:jdk1.8.0_73 JMC:5.5(最新已经6.0了支持jdk9) JMC:Java Mission Control 伴随着5月份oracle的一份开源声明―- JMC Open Sourced JMC又一次备受关注。 JMC是源自JRockit JVM的一套监控和管理工具,Oracle在发布JAVA 7u4(Java 7 Update 40)时将其包含在JDK中,用户不再需要单独下载。 使用 JMC可以监视和管理 Java 应用程序,不会导致相关工具类的大幅度性能开销,它使用为 Java 虚拟机 (JVM) 的普通自适应动态优化收集的数据。 主要部分 JVM浏览器:显示了正在运行的 Java 应用程序及其 JVM,每个JVM实例称为一个JVM连接。JVM浏览器允许用户列出并连接到本地和远程运行的 Java 应用。它能够使用 Java 发现协议(JDP)自动地发现本地和远程运行的 Java 进程。 JMX 控制台:能够通过 JMX 接口管理并监控 JDK ,实时收集并显示其特征。它提供了实时集合、堆使用情况、CPU 负载以及其他通过 MBeans 暴露的和在 MBean 服务器中注册的信息,并可通过托管 Bean (MBean) 更改一些运行时属性。还可以创建在特定事件上触发的规则 (例如,如果应用程序的 CPU 占用率达到了 90%,则发送电子邮件)。 JFR

jmc使用说明

匿名 (未验证) 提交于 2019-12-03 00:37:01
实验JDK版本:jdk1.8.0_73 JMC:5.5(最新已经6.0了支持jdk9) JMC:Java Mission Control 伴随着5月份oracle的一份开源声明―- JMC Open Sourced JMC又一次备受关注。 JMC是源自JRockit JVM的一套监控和管理工具,Oracle在发布JAVA 7u4(Java 7 Update 40)时将其包含在JDK中,用户不再需要单独下载。 使用 JMC可以监视和管理 Java 应用程序,不会导致相关工具类的大幅度性能开销,它使用为 Java 虚拟机 (JVM) 的普通自适应动态优化收集的数据。 主要部分 JVM浏览器:显示了正在运行的 Java 应用程序及其 JVM,每个JVM实例称为一个JVM连接。JVM浏览器允许用户列出并连接到本地和远程运行的 Java 应用。它能够使用 Java 发现协议(JDP)自动地发现本地和远程运行的 Java 进程。 JMX 控制台:能够通过 JMX 接口管理并监控 JDK ,实时收集并显示其特征。它提供了实时集合、堆使用情况、CPU 负载以及其他通过 MBeans 暴露的和在 MBean 服务器中注册的信息,并可通过托管 Bean (MBean) 更改一些运行时属性。还可以创建在特定事件上触发的规则 (例如,如果应用程序的 CPU 占用率达到了 90%,则发送电子邮件)。 JFR

JVM调优总结

人盡茶涼 提交于 2019-12-02 23:49:29
目录 数据类型 堆与栈 Java对象的大小 引用类型 按照基本回收策略分 按分区对待的方式分 按系统线程分 如何区分垃圾 如何处理碎片 如何解决同时存在的对象创建和对象回收问题 为什么要分代 如何分代 什么情况下触发垃圾回收 分代垃圾回收流程示意 选择合适的垃圾收集算法 小结 回收器选择 辅助信息 常见配置汇总 调优总结 垃圾回收的瓶颈 增量收集的演进 Garbage Firest(G1) 展望 JVM调优工具 如何调优 线程监控 内存泄漏检查 垃圾回收的悖论 我们的内存中都放了什么 解决之道 转载: JVM调优总结(一)-- 一些概念 转载: JVM调优总结(二)-- 一些概念 转载: JVM调优总结(三)-- 基本垃圾回收算法 转载: JVM调优总结(四)-- 垃圾回收面临的问题 转载: JVM调优总结(五)-- 分代垃圾回收详述1 转载: JVM调优总结(六)-- 分代垃圾回收详述2 转载: JVM调优总结(七)-- 典型配置举例1 转载: JVM调优总结(八)-- 典型配置举例2 转载: JVM调优总结(九)-- 新一代的垃圾回收算法 转载: JVM调优总结(十)-- 调优方法 转载: JVM调优总结(十一)-- 反思 一些概念 数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身

Hibernate报错:org.hibernate.ObjectNotFoundException: No row with the given identifier exists 解决办法

匿名 (未验证) 提交于 2019-12-02 23:40:02
转自: https://www.cnblogs.com/crazytrip/p/5355056.html 报错信息: org.hibernate.event.internal.DefaultLoadEventListener onLoad INFO: HHH000327: Error performing load command : org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.weixin.db.model.Adminusers#15] 报错分析: Hibernate的映射文件,表A里关联了表B的主键,当查询表A时,在B表里找不到对应记录时就会报错,如果只是逻辑删除不会报这种错误,只有当表B里测试没有id为15的这条数据了才会报错(已实际测试过);上面报错信息实体类后面【#15】表示实体类对应表id=15的记录找不到。也就是存在垃圾数据,可能是因为没有连带删除。 解决办法: 即: <many-to-one name="adminusers" class="com.weixin.db.model.Adminusers" fetch="select" lazy="false" not-found="ignore"> 2. 要么就把垃圾数据从数据库删掉。 补充

对象的强,软,弱引用

微笑、不失礼 提交于 2019-11-29 11:43:50
1.对象的强、软、弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachable)状态,程序才能使用它。从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。图1为对象应用类层次。 图1 ⑴强引用(StrongReference) 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。 ⑵软引用(SoftReference) 如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存(下文给出示例)。 软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。 ⑶弱引用(WeakReference) 弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期

IBM和SAP开源其JVM诊断工具

核能气质少年 提交于 2019-11-28 22:54:18
IBM最近发布了其Java诊断工具套件,该套件包含如下工具:面向Java的产品转储分析器(Dump Analyzer)、处理垃圾收集(GC,即Garbage Collection)的Extensible Verbose Toolkit和Java锁分析器(JLA,即Java Lock Analyzer)。IBM的 alphaWorks 团队从事这些JVM工具的开发工作,并且在一个叫做 Java diagnostics, IBM style 的技术系列文章中公布了关于如何使用它们的一些细节信息。SAP上个月也发布了一个关于其堆分析器工具(heap analyzer tool)的 声明 ,该工具叫做SAP内存分析器(SAP Memory Analyzer),该工具已集成到Eclipse IDE中。 对于从事或者被迫从事(有时就是这种情况)分析和解释JVM性能及诊断数据的工作的那些Java开发者来说,在工作时并没有多少敏捷开源的工具可供使用,而仅仅通过查看文本格式的日志文件内容来分析JVM的性能会让人感到非常沮丧。尤其是当开发小组被告知将与JVM相关的分析诊断工作推迟到产品环境中,这个问题就更让人不知所措了,因为在Java产品环境中很难去分析日志并且快速定位问题产生的根源。对于线程产生的日志则更是如此,在没有可视化工具的支持下去解释和分析它将是异常复杂的。 Java Dump