垃圾回收你懂,Java垃圾回收你懂吗?
摘要:在用 C 之类的编程语言时,程序员需要自己手动分配和释放内存。而 Java 不一样,它有垃圾回收器,释放内存由回收器负责。本文接下来将介绍Java垃圾收集的知识原理。
java内存区域
Q: Java虚拟机规范将JVM虚拟机所管理的内存分为几部分?如果是多选题,估计会给一些不在里面的,例如直接内存。
A:程序计数器、java虚拟机栈、本地方法栈、方法区、堆。

java对象在内存上的分配:

§ GC策略
Q:java使用根搜索算法来确定对象是否存货,哪些对象可以作为GC Roots?
A:
- 虚拟机栈(栈帧中的本地变量表)中的引用的对象
- 方法区中的类静态属性引用的对象
- 方法区中的常量引用的对象
- 本地方法栈中JNI(Native方法)的引用对象
Q: 标记清除、标记整理、复制算法哪个块?
A: 复制算法较快。
3个算法含义如下:

Q: SerialOld用的是什么算法?
A: 标记整理算法,属于处理老年代算法。
各收集器的变化图如下,主要关注一下变化和区别,


Q: fullGC 会发生在老年代区还是新生代区?
A: 会发生在老年代区。 相反,minorGC一般发送在新生代区。
新生代、老生代以及minorGC、fullGC的发生流程如下:

Q: 方法区里的class对象(即类对象)什么时候会被回收?
A: 所有实例都被回收、对应classLoader也被回收、class对象不会再被引用或者反射(这个咋确定?当初书里看到的,没懂)
§ finalized与GC
Q: 什么时候会调用对象的finalized方法
A: JVM启动垃圾回收,且该对象要被回收时。
finalized应该更多是规范吧,很多规范里都要求我们不要自己实现finalized了,毕竟不确定性太大。
§ Java虚拟机GC参数配置
突然想起来当初看java虚拟机时,把那些参数给跳过了,感觉记不住。
但现在发现还是得学的,赶紧恶补一下。
Q:
-client和-server的对比
()启动较快
()性能和内存管理效率高(注意启动快和性能好不是一回事)
桌面应用一般使用(), 服务器一般使用()
A:
(-clien)启动较快
(-server)性能和内存管理效率高
桌面应用一般使用(-clien), 服务器一般使用(-server)
有4个跟内存相关的参数
-Xmn -Xms -Xmx -Xss
回答下面的问题:
Q:
用于配置java初始堆内存的是()
A:
-Xms。
-X、memory、size ,内存大小
Q:
用于配置java堆的最大值的是()
A:
-Xmx。
-X、memory、max
最大内存

Q:如果不设置,-Xms和-Xmx的大小分别默认是多少?
A:
不设置的话,二者相等,默认是 物理内存/64(小于1G)
Q:用于配置新生代内存大小的最大值是:()
你问我什么是新生代内存?
就是下面这个,1个E区加2个S区的这个内存大小
A:
-Xmn。
-X、memory、new
相类似的还有-XX:NewSize 和 -XX:MaxNewSize。
Q: 如何根据上面的参数计算老年代内存大小?
A:
Xmx的值(堆最大值)- Xmn的值(新生代内存)
Q: 用于配置线程栈内存的是()? 替代的还有哪个参数?
A:
-Xss。 另一个是-XX:ThreadStackSize
-Xss指 -X stack size
有下面3个和gc相关的参数
-Xnoclassgc -Xincgc -Xloggc:file
回答以下问题:
Q:
可用于关闭针对类对象的gc功能的是()
可用于减少gc的程序停顿时间的是()
用于输出gc相关日志的是()
A:
可用于关闭针对类对象的gc功能的是(-Xnoclassgc)
可用于减少gc的程序停顿时间的是(-Xincgc)
用于输出gc相关日志的是(-Xloggc:file)
Q:-verbose 一般是用于什么的?
A:
查询gc问题。
- -verbose:class 输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突时可此进行诊断。
- -verbose:gc 输出每次GC的相关情况,后面会有更详细的介绍。
- -verbose:jni 输出native方法调用的相关情况,一般用于诊断jni调用错误信息。
Q: -XX:PermSize和-XX:MaxPermSize设置的是什么内存?
A:
方法区的内存。就是最开始那个图里的这个

通过配置-XX:PermSize以及-XX:MaxPermSize来控制这块内存的大小,jvm在启动的时候会根据-XX:PermSize初始化分配一块连续的内存块,这样的话,如果-XX:PermSize设置过大,可能会很浪费。而Max如果设置小了,可能会omm。
Q:-XX:MetaspaceSize和-XX:MaxMetaspaceSize又是什么内存?
A:
元数据区内存。 java8引入的,用于替代上面的perm区。
无论-XX:MetaspaceSize和-XX:MaxMetaspaceSize两个参数如何设置,随着类加载越来越多不断扩容调整,直到MetaspaceSize(如果没有配置就是默认20.8m)触发FGC,上限是-XX:MaxMetaspaceSize,默认是几乎无穷大
本文分享自华为云社区《Java云服务开发知识学习之 java垃圾收集》,原文作者:breakDraw 。
垃圾回收你懂,Java垃圾回收你懂吗?的更多相关文章
- 【垃圾回收-CMS】Java内存回收实践经验 防止内存报警
jdk6和7服务器端(-server) 默认的新生代的垃圾回收器为:PS Scavenge,老年代默认的垃圾回收器为:PS MarkSweep 目前项目使用了jdk7,tomcat7,经常出现内存堆使 ...
- [译]Java垃圾回收是如何工作的
说明:这篇文章来翻译来自于Javapapers 的How Java Garbage Collection Works 这部分教程是为了理解Java垃圾回收的基础以及它是如何工作的.这是垃圾回收系列教程 ...
- [译]Java 垃圾回收介绍
说明:这篇文章来翻译来自于Javapapers 的Java Garbage Collection Introduction 在Java中,对象内存空间的分配与回收是由JVM中的垃圾回收进程自动完成的. ...
- Java内存回收机制
在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C/C++直接操作内存的危险.但是,也正 ...
- Java内存回收机制基础[转]
原文链接:http://blog.jobbole.com/37273/ 在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的,降低了J ...
- 【朝花夕拾】Android性能篇之(三)Java内存回收
在上一篇日志([朝花夕拾]Android性能篇之(二)Java内存分配)中有讲到,JVM内存由程序计数器.虚拟机栈.本地方法栈.GC堆,方法区五个部分组成.其中GC堆是一块多线程的共享区域,它存在的作 ...
- Java垃圾回收(整理)
Java垃圾回收 Garbage Collection:GC: 什么样的对象才是垃圾?怎样判断一个对象引用是不是垃圾? 垃圾回收算法:Mark-Sweep(标记-清除)算法,Copying(复制)算法 ...
- Java垃圾回收机制详解
前言 Java 相比 C/C++ 最显著的特点便是引入了自动垃圾回收 (下文统一用 GC 指代自动垃圾回收),它解决了 C/C++ 最令人头疼的内存管理问题,让程序员专注于程序本身,不用关心内存回收这 ...
- 【转载】Java垃圾回收机制
原文地址:http://www.importnew.com/19085.html Java垃圾回收机制 说到垃圾回收(Garbage Collection,GC),很多人就会自然而然地把它和Java联 ...
- 【转】深入理解 Java 垃圾回收机制
深入理解 Java 垃圾回收机制 一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再 ...
随机推荐
- 关于fdisk -l
摘取:https://blog.csdn.net/digitalkee/article/details/104226846 # fdisk -l Disk /dev/hda: 160.0 GB, 16 ...
- 把工单历史表中的数据,按照工单进行分类,每一批工单的数据放在同一个 key 中
/** * 把工单历史表中的数据,按照工单进行分类,每一批工单的数据放在同一个key中 * 将对象列表按名称分类成 Map(分类名必与对象的某 get 方法的后的名一致<如:get(name) ...
- 一篇文章玩透awk
安装新版本gawk awk有很多种版本,例如nawk.gawk.gawk是GNU awk,它的功能很丰富. 本教程采用的是gawk 4.2.0版本,4.2.0版本的gawk是一个比较大的改版,新支持的 ...
- Java 7之基础 - 强引用、弱引用、软引用、虚引用(转)
载自:http://blog.csdn.net/mazhimazh/article/details/19752475 1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对 ...
- OpenGL 着色器详解
1. GLSL语言 glsl语言是用来编写着色器的,通过一段一段包含main函数的程序片段,告诉渲染引擎怎么去渲染内容. glsl语言的语法有点类似c语言风格,只是增加了一些特有的关键字来修饰变量,下 ...
- easyupload
打开界面就是一个文件上传 的界面 然后在bp试了很多种方法都没有成功,还是看了wp 这里需要利用到.use.ini那为什么不用.heaccess?好像这种方法被过滤了,当时我用的时候没有成功 这里的话 ...
- npm 发布包时 图片打包在新的项目引入不显示 路径错误解决方案
使用的是vue-cli 4.0以上脚手架 vue2.6 封装好组件后 npm publish ,在其他项目引入该组件库 图片显示失败 打开F12时看到 组件库里图片是/img/图片名,可是该项目没有此 ...
- 牛客多校第一场 A. Alice and Bob (暴力SG)
题目大概 有两堆石子,有两个人拿,一个人从一堆中拿\(k\)个,那么就必须从另一堆中拿\(s*k\)个,Alice先拿,问是否必赢. 解题: 数据不大,看到前\(20\)名队伍没有推结论做的..除了打 ...
- Pooling与马赛克的秘密
说到Pooling,相信学习过CNN的朋友们都不会感到陌生.Pooling在中文当中的意思是"池化",在神经网络当中非常常见,通常用的比较多的一种是Max Pooling,具体 ...
- kubernetes container device interface (CDI)
CDI 是什么? Container Device Interface (CDI) 是一个提议的标准,它定义了如何在容器运行时环境中向容器提供设备.这个提议的目的是使得设备供应商能够更容易地将其设备集 ...