专栏首页阿杜的世界Java Web技术经验总结(十)

Java Web技术经验总结(十)

本文主要为《深入理解JVM虚拟机》一书的阅读笔记

  1. Java堆内存溢出:在生产环境中,常常遇到各种Java内存问题,在分析JVM内存时,可以考虑使用MAT。在阅读《深入理解JVM内存》一书时,有如下一个例子:
/**
 * VM Args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError 
 */
public class HeapOOM {
    static class OOMObject {
    }
    public static void main(String[] args) {
        List<OOMObject> list = new ArrayList<>();
        while (true) {
            list.add(new OOMObject());
        }
    }
}

在遇到“java.lang.OutOfMemoryError”错误时,首先需要根据MAT工具确认是内存泄漏还是内存溢出。

  1. 关于JVM内存,有几个常用的标志:-Xmn表示年轻代大小;-Xmx表示JVM的最大可用堆内存;-Xms表示JVM的最小可用堆内存;-Xss表示线程栈大小。
  2. 在JVM内存回收中,要识别哪些内存需要回收,一般有两种方法判断某个对象的使用状态:引用计数和可达性分析算法,在JVM中使用“可达性分析算法”进行管理。在Java语言中,可作为GC Roots的对象包括以下几种:
  • 虚拟机栈(栈帧中的本地变量表)中引用的对象;
  • 方法区中类静态属性引用的对象;
  • 方法区中常量引用的对象;
  • 本地方法栈中JNI(即一般说的Native方法)引用的对象;
  1. 关于JVM中的finalize()方法:
  • finalize()方法是对象逃脱死亡的最后一次机会;
  • 一个对象的finalize()方法最多只会被系统自动调用一次;
  • finalize()方法的运行代价高昂,不确定性大,无法保证各个对象的调用顺序。
  • finalize()方法能做的所有工作,使用try-finally或其他方式都可以做得更好、更及时,所以我们最好忘记这个方法的存在;
  1. 垃圾回收算法:标记—清除算法、标记—复制算法、标记—整理算法和分代回收算法,思路是层层递进的,标记—清除算法是基本思路,后续的算法都是为了解决这种基本思路的缺点而发展出来的。
  2. 几种垃圾收集器的选择:(1)在吞吐量优先/CPU资源宝贵的场景下,适合使用Parallel Scanvenge收集器(年轻代) + Parallel Old收集器(老年代)组合;(2)在响应时间敏感的Web服务场景下,适合使用ParalNew(年轻代) + CMS(老年代)组合,在这种情况下还有Serial Old作为CMS出错时的备份;(3)在client模式下的客户端应用场景下,JVM内存不多,串行搜集器效率高、没有多线程开销,适合使用Serial收集器。
  3. 读过的文章:JVM调优总结
  4. 阅读《Java核心技术(二)》的1.5节笔记,Java序列化包括的知识点:(1)ObjectOutputStream和ObjectInputStream连个类的writeObject()/readObject()方法;(2)序列化/反序列化是Java对象与字节流之间的转换过程;(3)序列化生成的文件具备指定的格式,包含了恢复Java对象需要的全部信息;(4)对于不想/不能序列化的字段,使用transient修饰;(5)每个对象都有一个序列号,相同对象的重复会被存储为这个序列号的引用;(6)通过重写readObject/writeObject可以针对某些域进行验证;(7)通过实现Externalizable接口可以完全重写序列化机制;(8)旧代码中的单例设计模式和自己实现的枚举类型,需要实现readResolve()方法,修复bug。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JVM学习思路0529

    从计算机组成原理和计算机操作系统两个角度去学习JVM;JVM组成包括:架构(操作数栈、栈、PC、方法调用栈帧)、指令集、指令执行过程。JVM不是直接接受二进制代...

    阿杜
  • 【译】Java 8的新特性—终极版1. 简介2. Java语言的新特性3. Java编译器的新特性4. Java官方库的新特性5. 新的Java工具6. JVM的新特性7. 结论8. 参考资料

    前言: Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级。在Java Code Geeks上已经有很多介绍Java 8新特性的文章,...

    阿杜
  • 《Java 8实战》阅读笔记(1)

    给方法listFiles传递方法引用**File::isHidden**

    阿杜
  • linux时间相关结构体和函数整理

    一、时间类型。Linux下常用的时间类型有4个:time_t,struct timeb, struct timeval,struct timespec,cloc...

    猿人谷
  • 当Kotlin邂逅设计模式之单例模式(一)

    简述: 从这篇文章开始,我将带领大家一起来探讨一下Kotlin眼中的设计模式。说下为什么想着要开始这么一个系列文章。主要基于下面几点原因:

    bennyhuo
  • Go语言基础:深入理解 struct 内嵌 inteface

    对于 struct 内嵌 inteface 的使用,我是研究好半天才搞懂,这里记录下我疑问: 1. 如何更好的理解匿名接口 // 匿名接口可以被用作变量或者...

    李海彬
  • python hashlib模块学习

    1.干嘛用的: 对字符进行加密,其实就是一个自定义的字符编码表,我们原来接触的是计算机语言0和1然后转化成字符,而hashlib就是把字符转成另一种字符,在生活...

    py3study
  • EntityFramework的多种记录日志方式,记录错误并分析执行时间过长原因(系列4)

    前言 今天我们来聊聊EF的日志记录. 一个好的数据库操作记录不仅仅可以帮你记录用户的操作, 更应该可以帮助你获得效率低下的语句来帮你提高运行效率 废话不多说,我...

    GuZhenYin
  • 享元模式

    在上面的例子中,使用Link类来保存链接数据,Browser使用这些链接,可能存在很多链接引用同一张图片,如果每个图片都保存下来,会很占用内存。所以这里使用享元...

    用户2936342
  • Session Cookie Token

    早期的互联网相当于一个文件服务器,访问服务器,只是提供了文件浏览功能。每次请求都是一个 HTTP 协议请求,服务器并不知道是谁访问了互联网,后来随着电子商务,...

    王小明_HIT

扫码关注云+社区

领取腾讯云代金券