jvm_2_新生代老生代含义

本文深入探讨了Java虚拟机(JVM)使用分代垃圾回收方式的原理,解释了年轻代和老年代的特点及作用。通过具体操作示例展示了如何设置JVM参数以调整垃圾回收频率,从而合理利用系统资源。文章还提供了GC相关参数的解释和使用技巧,帮助开发者优化应用程序性能。

 

 

题眼:
JVM使用的是分代垃圾回收的方式,可以将Java对象分为"年轻"对象和"年老"对象.
JVM将内存堆(Heap)分为两个区域,一个是"年轻"区,另一个是"老"区,Java将这两个区域分别称作是"新生代"和"老生代"。

详细:
JVM使用的是分代垃圾回收的方式,主要是因为在程序运行的时候会有如下特点:

◆大多数对象在创建后很快就没有对象使用它了。

◆大多数在一直被使用的对象很少再去引用新创建的对象。
因此就将Java对象分为"年轻"对象和"年老"对象,JVM将内存堆(Heap)分为两个区域,
一个放年轻对象,一个放年老对象,java对对内存的这两个区域分别成为 新生代,老生代。

新生代区域特点:
a) 绝大多数新创建的对象都存放在这个区域
b) 此区域一般来说较小而且JVM垃圾回收频率较高
c) 采用的算法和存放对象特点使得该区域JVM垃圾回收的效率也非常高


老生代区域特点:
a) 将在"新生代"中生存了较长时间的对象转移过来
b) 区域一般要大一些而且增长的速度相对于"新生代"要慢一些
c) 垃圾回收的执行频率也会低很多


了解这个对于我们的好处是:
JVM在JVM垃圾回收处理时会消耗一定的系统资源,如果我们在JVM启动的时候添加相关参数来控制"新生代"区域的大小
以达到调整JVM垃圾回收处理的频率,那么我们就会合理利用系统资源。

操作新生代参数设置写法:
-Xmn


操作案例如下:

我们就用系统自带的程序作为例子,在命令行上键入如下指令:

CDC:\java\demo\jfc\SwingSet2[回车]C:\java\demo\jfc\SwingSet2> 
java-jar-verbose:gc-Xmn4mXX:+PrintGCDetailsSwingSet2.jar[回车]  

  
 
上面加入了一个新的参数"XX:+PrintGCDetails",这个参数能够打印出GC的详细信息。屏幕输出如下(节选):

[GC[DefNew:3469K->84K(3712K),0.0007778secs]23035K-> 
19679K(28728K),0.0009191secs][GC[DefNew:3284K-> 
171K(3712K),0.0007283secs]22878K-> 
19766K(28728K),0.0008669secs][GC[DefNew:3476K->
260K(3712K),0.0008504secs]23071K-> 
19855K(28728K),0.0009862secs][GC[DefNew:3502K-> 
87K(3712K),0.0009267secs]23096K-> 
19682K(28728K),0.0010610secs]  

 
我们需要解释一下输出的详细内容的意思,拿第一行输出来说:

"DefNew:3469K->84K(3712K),0.0007778secs"是指"新生代"的JVM垃圾回收情况,这里的意思是从占用3469K内存空间变为84K内存空间,用时0.0007778秒。

"23035K->19679K(28728K),0.0009191secs"是指总体GC的回收情况,整体堆空间占用从23035K降低到19679K的水平,用时0.0009191秒。

 

那么,这时候我们在将"新生代"的内存设为8M,并把堆的最大可控值设定为32M,再去执行,键入如下指令:

java-jar-verbose:gc-Xmn8m-Xmx32mXX:+PrintGCDetailsSwingSet2.jar[回车]  

 
 
得到的结果如下(节选):

[GC[DefNew:6633K->6633K(7424K),0.0000684secs]
[Tenured:18740K->18820K(24576K),0.0636505secs]25374K-> 
18820K(32000K),0.0639274secs][GC[DefNew:6646K-> 
6646K(7424K),0.0002581secs][Tenured:18820K-> 
18884K(24576K),0.0651957secs]25467K-> 
18884K(32000K),0.0658804secs][GC[DefNew:6611K-> 
6611K(7424K),0.0000668secs][Tenured:18884K-> 
18505K(24576K),0.0931406secs]25496K-> 
18505K(32000K),0.0934295secs]  

 

 


这个结果说明:

"[DefNew:6633K->6633K(7424K),0.0000684secs]"是指"新生代"的JVM垃圾回收情况,这里的意思是从占用6633K内存空间变为6633K内存空间,用时0.0000684秒。
"25374K->18820K(32000K),0.0639274secs"是指总体GC的回收情况,整体堆空间占用从25374K降低到18820K的水平,用时0.0639274秒。
"[Tenured:18740K->18820K(24576K),0.0636505secs]"是指"老生代"GC的回收情况,整体堆空间占用从18740K降低到18820K的水平,用时0.0009012秒。

 

通过这些参数的调整我们可以看到在处理垃圾收集问题时,从JVM垃圾回收的频率是时间方面的变化,我们可以根据不同程序的不同情况予以调整。

最后有必要提一下GC的相关参数:

-XX:+PrintGCDetails显示GC的详细信息
-XX:+PrintGCApplicationConcurrentTime打印应用执行的时间
-XX:+PrintGCApplicationStoppedTime打印应用被暂停的时间

 
注:":"后的"+"号表示开启此选项,如果是"-"号那么表示关闭此选项。

### 如何在 Windows 系统中安装 PythonQt Designer 并配置环境 #### 安装 PyQt6 和 Qt Designer 为了在 Windows 上使用 Qt Designer,可以通过 `pip` 命令安装最新的 PyQt6 模块。PyQt6 是一个用于创建图形用户界面 (GUI) 应用程序的工具包,并附带了 Qt Designer 工具。 运行以下命令可以完成 PyQt6 及其相关组件的安装: ```bash pip install pyqt6-tools ``` 此命令会自动下载并安装必要的依赖项,其中包括 Qt Designer[^1]。 #### 配置路径以便访问 Qt Designer 安装完成后,通常可以在以下目录找到 Qt Designer 文件(具体位置取决于 Python 解释器的位置): - **对于标准安装**:`C:\Users\<用户名>\AppData\Local\Programs\Python\<版本号>\Lib\site-packages\pyqt6_tools` - 或者通过脚本启动:`python -m pyqt6_designer`. 如果希望直接从文件资源管理器或桌面快捷方式打开 Qt Designer,则需将其可执行文件所在路径添加到系统的环境变量 PATH 中。操作方法如下: 1. 打开控制面板 -> 系统和安全 -> 系统 -> 高级系统设置。 2. 单击“环境变量”,在“系统变量”部分找到名为 “Path”的条目并编辑它。 3. 添加上述提到的设计工具所在的完整路径至列表末尾。 这样处理之后,在任意 CMD 终端窗口输入 designer.exe 就能调用该应用程序。 #### 测试安装成功与否 验证是否正确设置了所有内容的一个简单办法就是尝试加载设计模式本身或者利用 PyQT 创建一个小项目来看看能否正常渲染 UI 元素。下面给出一段简单的例子展示如何载入由设计师保存下来的 .ui 文件并通过 python 运行起来: ```python from PyQt6 import uic import sys from PyQt6.QtWidgets import QApplication, QMainWindow class MyUI(QMainWindow): def __init__(self): super(MyUI,self).__init__() # 加载 ui 文件 uic.loadUi('your_ui_file.ui', self) if __name__ == '__main__': app = QApplication(sys.argv) window = MyUI() window.show() try: sys.exit(app.exec()) except SystemExit: pass ``` 以上代码片段假设存在一个叫做 'your_ui_file.ui' 的文件位于当前工作目录下,它是之前通过 Qt Designer 构建出来的界面布局定义文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值