《架构风清扬-Java面试系列第13讲》说一说Java对象在内存中的生命周期

大家好,加个餐!

像线程的生命周期,Servlet的生命周期,相信这类问题大家都非常熟悉了

Java对象在内存中的生命周期,这个题目倒是有些新鲜

来,思考片刻,说出你的答案

(PS:上图缓冲)

Java对象在其内存中的生命周期可以被划分为多个阶段,下面钊哥逐个给大家说一说

1,创建阶段(Creation / Created)

(1)当Java程序通过new关键字创建一个对象时,首先会在堆内存中为对象分配足够的存储空间

(2)分配空间后,会调用相应的构造器初始化对象的实例变量

(3)若类中有静态成员变量,它们会在类加载的过程中进行初始化,而非与每个对象实例一起初始化

2,使用阶段(Using / In Use)

(1)对象创建完成后进入应用阶段,在这个阶段对象可以被程序访问和操作

(2)在这个阶段,对象持有至少一个强引用(Strong Reference),因此它是可达的,不会被视为垃圾

3,不可达阶段(Unreachable / Unreachable)

(1)当对象没有任何强引用指向它时,就进入了不可达状态,也就是说从根对象(GC Roots)出发无法通过引用链找到这个对象。

(2)JVM垃圾回收器在进行可达性分析时,会识别并标记这些不可达对象。

4,收集阶段(Collected)

(1)垃圾回收器检测到对象不可达后,会在某个合适的时机回收这些对象占用的内存空间

(2)在大多数垃圾回收器中,这通常意味着对象会被放入待回收集合中,等待下次垃圾回收周期将其清除

5,终结阶段(Finalized)

(1)在某些情况下(尤其是对象即将被垃圾回收前),若对象实现了 finalize() 方法,JVM会在回收对象前调用这个方法,给予对象最后一次自我清理的机会

(2)注意,finalize() 方法并不保证一定会被执行,且不应用于依赖其执行关键清理操作

6,对象空间重分配阶段(De-allocated)

(1)在对象的 finalize() 方法(如果有)执行完毕后,垃圾回收器正式释放对象所占用的内存空间,将其归还给内存池。

(2)当这部分内存重新分配给新的对象时,可能会经过内存碎片整理的过程

今天的分享就到这了,每日提升一点,一起变得更强!

  • 39
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android端使用Java语言实现打印程序,你需要使用Android SDK提供的API来与打印机进行通信。以下是一个简单的打印程序的例子: 1. 首先,你需要在AndroidManifest.xml文件声明必要的权限,例如: ```xml <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 2. 然后,你需要使用Android SDK提供的PrinterDiscoverySession和PrintDocumentAdapter类来实现打印功能。以下是一个简单的例子: ```java public class MyPrintDocumentAdapter extends PrintDocumentAdapter { private Context mContext; private String mFilePath; public MyPrintDocumentAdapter(Context context, String filePath) { mContext = context; mFilePath = filePath; } @Override public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, CancellationSignal cancellationSignal, LayoutResultCallback callback, Bundle extras) { if (cancellationSignal.isCanceled()) { callback.onLayoutCancelled(); return; } PrintDocumentInfo info = new PrintDocumentInfo.Builder("document name") .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT) .build(); callback.onLayoutFinished(info, true); } @Override public void onWrite(PageRange[] pages, ParcelFileDescriptor destination, CancellationSignal cancellationSignal, WriteResultCallback callback) { InputStream input = null; OutputStream output = null; try { input = new FileInputStream(mFilePath); output = new FileOutputStream(destination.getFileDescriptor()); byte[] buf = new byte[1024]; int bytesRead; while ((bytesRead = input.read(buf)) > 0) { output.write(buf, 0, bytesRead); } callback.onWriteFinished(new PageRange[]{PageRange.ALL_PAGES}); } catch (FileNotFoundException e) { callback.onWriteFailed(e.toString()); e.printStackTrace(); } catch (Exception e) { callback.onWriteFailed(e.toString()); e.printStackTrace(); } finally { try { input.close(); output.close(); } catch (IOException e) { e.printStackTrace(); } } } } ``` 3. 最后,你需要在Activity调用PrintManager的print方法来实现打印功能。以下是一个简单的例子: ```java PrintManager printManager = (PrintManager) getSystemService(Context.PRINT_SERVICE); String jobName = "Print Job"; printManager.print(jobName, new MyPrintDocumentAdapter(this, filePath), null); ``` 注意,以上代码仅仅是一个简单的例子,实际情况可能更加复杂。你需要根据实际情况进行修改和适配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值