Java内存管理3-读书笔记

在介绍三种垃圾收集算法之前,先说下三种GC的区别:

MinorGC:年轻代空间回收

MajorGC:老年代空间回收

FullGC:整个堆空间回收

垃圾收集算法分类

1.Serial Collector

  JVM在client模式下的默认GC方式.通过JVM配置参数:-XX:+UseSerialGC指定GC使用该收集算法.我们创建的所有对象都在Eden区创建,如果Eden区空间不足就会触发MinorGC.不过每次MinorGC之前会查看之前每次晋升对象大小是否超过了Old区的剩余空间,如果大于则触发一次FullGC,如果小于,则要看HandlePromotionFailure参数(-XX:-HandlePromotionFailure)的值,如果为true,仅触发MinorGC,否则再触发一次FullGC.

2.Parallel Collector

  Parallel GC根据Minor GC和Full GC的不同,分为三种.

  1)ParNewGC

  通过-XX:UseParNewGC参数指定,它的对象分配和回收策略与Serial Collector类似,只是回收的线程是多线程并行回收.

  2)ParallelGC

  在Server下默认的GC方式,通过-XX:UseParallelGC参数来强制指定,并行回收的线程数可以通过-XX:ParallelGCThreads来制定,这个值有个计算公式,如果CPU和核数小于8,线程数和核数一样,如果大于8,值为 3+(cpu core*5)/8

  3)ParallelOldGC

  通过-XX:UseParallelOldGC参数来强制指定,与上面的类似,并行回收的线程数可以通过-XX:ParallelGCThreads来制定,这个值有个计算公式,如果CPU和核数小于8,线程数和核数一样,如果大于8,值为 3+(cpu core*5)/8

3.CMS Collector

  可以通过-XX:UseConcMarkSweepGC来指定,并发的线程数默认为4(并行GC线程数+3),也可通过ParallelCMSThreads来指定.CMS GC是基于MinorGC和FullGC之间的一种GC,它的触发规则是检查Old区或者Perm区的使用率,当达到一定比例时就触发CMS GC,触发时会回收Old区的内存空间.触发CMSGC回收的只是Old区和Perm区的垃圾对象,在回收时和之前的MinorGC,FullGC基本没有关系.

触发FullGC的两种情况:

A.Eden分配失败,触发MinorGC后分配到To Space,To Space不够再分配到Old区,Old区不够则触发Full GC.

B.当CMS GC正在进行向Old区申请内存失败则会直接触发Full GC.

4.组合使用者三种GC

5.三种GC的优缺点

6.GC日志输出参数

  • -verbose:gc,可以辅助输出一些详细的GC信息.
  • -XX:+PrintGCDetails,输出GC的详细信息.
  • -XX:+PrintGCApplicationStoppedTime,输出GC造成应用程序暂停的时间.
  • -XX:+PrintGCDateStamps,GC发生的时间信息.
  • -XX:+PrintHeapAtGC,在GC前后输出堆中各个区域的大小.
  • -Xloggc:[file],将GC信息输出到单独的文件中.
时间: 2024-10-09 17:09:28

Java内存管理3-读书笔记的相关文章

JAVA并发编程实战 读书笔记(二)对象的共享

<java并发编程实战>读书摘要 birdhack 2015年1月2日 对象的共享 JAVA并发编程实战读书笔记 我们已经知道了同步代码块和同步方法可以确保以原子的方式执行操作,但一种常见的误解是,认为关键之synchronized只能用于实现原子性或者确定临界区.同步还有另一个重要的方面:内存可见性. 1.可见性 为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制. 在没有同步的情况下,编译器.处理器以及运行时等都可能对操作的执行顺序进行一些意想不到的调整.在缺乏足够同步的多线程程

揭开Java内存管理的面纱

前言 相对于C.C++这些高性能语言,Java有着让此类程序员羡慕的功能:内存自动管理.似乎这样,Java程序员不用再关心内存,也不用去了解相关知识.但结果真的是这样吗?特别对于我们这种Android程序员来说,对内存可是吃得死死的,一旦出现较为复杂的内存泄露和溢出方面的问题,简直就是噩梦.因此,对Java内存管理有个大体的了解似乎已经成为一个合格的Android程序员必备的技能,就算是新进的Kotlin同样是基于JVM的.不如趁此机会,大家一起来揭开它的面纱. 对象 Java是一门面向对象的编

java内存管理

一.jvm内存结构 程序计数器(Program Counter Register).JVM虚拟机栈(JVM Stacks).本地方法栈(Native Method Stacks).堆(Heap).方法区(Method Area) (1)PCR 跟随线程生命周期,记录当前执行到的.class字节码行数,用于多线程操作 (2)JVM Stacks 跟随线程生命周期,在方法执行中存储数据 (3)Native Method Stacks 处理native方法,如object中的hashCodes()等

简单的例子 关于Java内存管理的讲解

我想做的是,逐行读取文件,然后用该行的电影名去获取电影信息.因为源文件较大,readlines()不能完全读取所有电影名,所以我们逐行读取. 就这段代码,我想要在位置二处使用base64,然后结果呢? 两处位置都打印了,位置一得到base64,ok,没问题.当我在位置二想使用base64时,问题来了?onload队列的问题,位置二总是无法正确的获取到想要的base64,这个时候就可以考虑异步问题了. 在还没有接触到angular的时候,还真的不知道它到底有什么作用,直到我开始学习它,并且运用到它

java内存管理机制

JAVA 内存管理总结 1. java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间.释放 :对象的释放是由垃圾回收机制决定和执行的,这样做确实简化了程序员的工作.但同时,它也加重了JVM的工作.因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请.引用.被引用.赋值等,GC都需要进行监控. 2. 

Java核心技术 卷1 读书笔记 (3 Java基本程序设计结构)

3.3 数据类型 Java是强类型语言,必须为每一个变量声明一种类型. 3.3.1 整型 Java 提供四种整型 int 4字节 short 2字节 long 8字节 byte 1字节 长整型(long)数值有一个后缀L(例如40000000000L),十六进制数值有一个前缀0x(例如0xCAFE),八进制数值有一个前缀0(例如010). 3.3.2 浮点型 Java提供两种浮点类型 float 4字节 double 8字节 float类型的数值有一个后缀F(例如3.42F),没有后缀F的浮点数

【Java】Java内存管理

Java内存管理是面试中经常会问到的问题.Java的内存管理其实是指对象 的分配和释放问题.曾经看过这样一句话:"C++程序员觉得内存管理太重要了,所以一定要自己进行管理,而Java程序员觉得内存管理太重要了,一定不能自己管理".我觉得这句话说得太精辟了. C++程序员需要显式分配内存,释放内存,而这样常常会引起"内存泄露".而Java程序员不需要显式分配和释放内存,Java在创建对象的时候会自动分配内存,在对象不再使用的时候释放内存.Java的对象是通过new关键

java内存管理的分析

java 中的内存分为四个部分: stack(栈):存放基本类型的数据和对象的引用,即存放局部变量. Note: 如果存放的是基本类型数据(非静态变量),则直接将变量名和值存入stack中. 如果存放的是引用类型,则将变量名存入栈,然后指向它new出的对象(存放在堆中). heap(堆)存放 new 出来的东西. data segment(数据区):分为静态区和常量区(常量池) 静态区(static segment): 存放在对象中用 static 定义的静态成员(即静态变量,如果该静态变量是基

Java内存管理的9个小技巧

Java内存管理的9个小技巧很多人都说“Java完了,只等着衰亡吧!”,为什么呢?最简单的的例子就是Java做的系统时非常占内存!一听到这样的话,一定会有不少人站出来为Java辩护,并举出一堆的性能测试报告来证明这一点.其实从理论上来讲Java做的系统并不比其他语言开发出来的系统更占用内存,那么为什么却有这么多理由来证明它确实占内存呢?两个字,陋习. 1.别用new Boolean(). 在很多场景中Boolean类型是必须的,比如JDBC中boolean类型的set与get都是通过Boolea