云社区 博客 博客详情

垃圾回收你懂,Java垃圾回收你懂吗?

技术火炬手 发表于 2020-12-28 19:37:29 2020-12-28
0
1

【摘要】 在用 C 之类的编程语言时,程序员需要自己手动分配和释放内存。而 Java 不一样,它有垃圾回收器,释放内存由回收器负责。本文接下来将介绍Java垃圾收集的知识原理。

在用 C 之类的编程语言时,程序员需要自己手动分配和释放内存。而 Java 不一样,它有

垃圾回收器,释放内存由回收器负责。本文接下来将介绍Java垃圾收集的知识原理。

java内存区域

Q; Java虚拟机规范将JVM虚拟机所管理的内存分为几部分?如果是多选题,估计会给一些不在里面的,例如直接内存。
A
:程序计数器、java虚拟机栈、本地方法栈、方法区、堆。

java对象在内存上的分配:

§ GC策略

Qjava使用根搜索算法来确定对象是否存货,哪些对象可以作为GC Roots
A

  • 虚拟机栈(栈帧中的本地变量表)中的引用的对象
  • 方法区中的类静态属性引用的对象
  • 方法区中的常量引用的对象
  • 本地方法栈中JNINative方法)的引用对象
Q 标记清除、标记整理、复制算法哪个块?
A
复制算法较快。
3
个算法含义如下:
Q SerialOld用的是什么算法?
A
标记整理算法,属于处理老年代算法。
各收集器的变化图如下,主要关注一下变化和区别,
Q fullGC 会发生在老年代区还是新生代区?
A:
会发生在老年代区。 相反,minorGC一般发送在新生代区。
新生代、老生代以及minorGCfullGC的发生流程如下:
Q 方法区里的class对象(即类对象)什么时候会被回收?
A
所有实例都被回收、对应classLoader也被回收、class对象不会再被引用或者反射(这个咋确定?当初书里看到的,没懂)

§ finalizedGC

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
memorysize ,内存大小
Q
用于配置java堆的最大值的是()
A:
-Xmx

-X
memorymax
最大内存
Q:如果不设置,-Xms-Xmx的大小分别默认是多少?
A

不设置的话,二者相等,默认是 物理内存/64(小于1G
Q:用于配置新生代内存大小的最大值是:()
你问我什么是新生代内存?
就是下面这个,1E区加2S区的这个内存大小

A
-Xmn

-X
memorynew
相类似的还有-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,默认是几乎无穷大


登录后可下载附件,请登录或者注册

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:huaweicloud.bbs@huawei.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
评论文章 //点赞 收藏 1
点赞
分享文章到微博
分享文章到朋友圈

上一篇:Rust太难?那是你没看到这套Rust语言语言学习总结(下)

下一篇:轻松带你了解算子开发及测试全流程。

评论 (0)


登录后可评论,请 登录注册

评论