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 条评论
登录 后参与评论

相关文章

来自专栏海纳周报

新生代的垃圾回收:Copy GC之基本原理

据我所能查到的资料,基于复制的GC算法最早是Marvin Minsky提出来的。 这个算法的思路很简单,总的来说,就是把空间分成两部分,一个叫分配空间(Allo...

4328
来自专栏lgp20151222

Java虚拟机详解----JVM常见问题总结

文章来源:http://www.cnblogs.com/smyhvae/p/4810168.html

882
来自专栏我的博客

ArrayCollection使用说明

class Main extends egret.DisplayObjectContainer{ public constructor() { ...

3406
来自专栏TechBox

一份走心的iOS开发规范前言约定(一)命名规范(二)编码规范2.14 内存管理规范本文参考文章其他有价值的文章

5268
来自专栏jeremy的技术点滴

JVM的Finalization Delay引起的OOM

3858
来自专栏java达人

Java垃圾回收机制

垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部...

2055
来自专栏Android 研究

OKHttp源码解析(五)--OKIO简介及FileSystem

okio是由square公司开发的,它补充了java.io和java.nio的不足,以便能够更加方便,快速的访问、存储和处理你的数据。OKHttp底层也是用该库...

1812
来自专栏猿人谷

Java的内存回收机制

 在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了...

2587
来自专栏IT技术精选文摘

JVM调优浅谈

972
来自专栏黄Java的地盘

[翻译]WebSocket协议第二章——Conformance Requirements

本文为WebSocket协议的第二章,本文翻译的主要内容为WebSocket协议中相关术语的介绍。

871

扫码关注云+社区

领取腾讯云代金券